我目前正在阅读Herbert Schildt “Java the Complete Reference”并且在那里他使用了术语“动态方法解析”并提供了一些解释,但我没有完全导入它在这个论坛上寻求帮助。
在讨论'接口'时,他说的是,动态方法解析有助于在运行时解析方法名称,并通过声明接口变量并使用它来引用类对象来实现。即
interface i = new object();
现在它有什么独特之处?您也可以使用类变量来引用相同的对象,如:
class c = new object();
那么,这里的界面有什么用?为什么要引入这个新术语“动态方法解析”??
其次他说:“当我们使用接口变量来引用任何类的实例时,当你通过这些接口变量调用方法时,要执行的方法是动态查找的运行时允许在调用方法的代码之后创建类。调用代码可以通过接口调度,而无需了解被调用者的任何信息。
现在,任何处理对象的东西必须在运行时才能在运行时创建对象,现在,我不明白他的意思是“允许在它们上面创建类”。
< / LI> 醇>任何帮助将不胜感激。
答案 0 :(得分:0)
动态方法解析是指可用于解决多个问题的单一方法。例如:考虑Shape是一个接口并具有方法名称绘制。 你有Rectangle和Circle类实现Shape接口。因此,当您创建Rectangle对象的实例并调用draw方法时,将绘制Rectangle形状。在其他情况下,您可以实例化Circle实例并调用draw方法来绘制Circle ...
在界面中,您可以在父容器中指定子对象。 例如:Shape p = new Rectangle();
在这种情况下,它将创建Rectangle的实例并将其分配给Shape p ..
但是从Shape p对象中你只能调用draw方法...你不能调用Rectangle Object中的其他方法,因为它被赋值给父接口而parent只有draw方法。
答案 1 :(得分:0)
这是一个小例子:
public interface Animal {
public String sound();
}
public class Cat implements Animal {
public String sound() { return "meow"; }
}
public class Dog implements Animal {
public String sound() { return "woof"; }
}
public class Test {
public static void main(String[] args) {
Animal a;
if (args.length > 0)
a = new Cat();
else {
a = new Dog();
}
System.out.println(a.sound()); // prints "MEOW" or "WOOF"
}
}
它有什么独特之处?您也可以使用类变量来引用同一个对象
是。但是你不能使用单个类变量来引用一个实例,该实例可以是实现该接口的任何类的实例。
在Test
类中,如果我声明a
具有类型Dog
或Cat
,则无法获取要编译的代码。如果没有声明Animal a
的能力,我需要有两个不同的变量和两个单独的打印语句。
这就是动态方法解析(又称多态)为您提供的。
理解他的第二点:
public class Test2 {
public static void main(String[] args) {
Animal a = PetShop.buyPet(args);
System.out.println(a.sound()); // prints "MEOW" or "WOOF"
}
}
Test2
课程适用于我上面的Cat
和Dog
课程。如果在3年内我实施Goldfish
课程并修改我的PetShop
课程以储存水生宠物,它也将继续工作而无需重新编译。事实上,甚至可以实现PetShop
类,这样就不需要更改或重新编译它来支持其他类型的宠物。
现在,这些例子显然不实用。但是,它们说明的Java功能在实际Java应用程序中很有用。实际上,像经典“hello world”程序一样简单的程序依赖于动态方法查找。