最近,我的老师在教授多态性,他告诉我们,多态性有两个方面
然后他给我们看了这个密码
class A {
void ab(){
System.out.println("ab() in class A");
}
}
class B extends A {
void ab(){
System.out.println("ab() in class B");
}
}
class ObCo {
public static void main(String args[]){
A a1 = new B();
a1.ab();
}
}输出为ab() in class B
当我尝试下面的代码时,
class A {
int i = 10;
}
class B extends A {
int i = 100;
}
class ObCo {
public static void main(String args[]){
A a1 = new B();
System.out.println(a1.i);
}
}根据前面的代码,输出应该是100,但是输出是10,在我的脑海中出现了这些问题。
对这些问题的详细答复将不胜感激。
发布于 2015-05-25 13:57:27
多态仅适用于非静态非最终方法。您尝试的代码不是多态代码,而是场隐藏代码(强调我的代码):
类中的,与超类中的字段具有相同名称的字段隐藏超类的字段,即使它们的类型不同。在子类中的中,超类中的字段不能由其简单名称引用。相反,必须通过Super访问该字段,这将在下一节中讨论。一般来说,我们不建议隐藏字段,因为这会使代码难以阅读。
记住这一点,回答你的问题:
是。
是。
在Java中,所有非static非final方法在默认情况下都是虚拟方法,因此如果子类具有超类的相同的 签名 (相同的输入类型、相同的输出类型)的方法,则即使这不是您的意图,该方法也将被覆盖。编译器甚至会发出警告,说明子类中的方法必须使用@Override注释通知其他程序员该方法正在被重写。
在Java中,根据本教程,方法重载称为编译时多态性(这是一个奇怪的名称)。
4.如果没有,请举例说明是否存在多态性。
您已经有了这样的方法重写(动态)示例。
下面是方法重载(静态)的另一个示例:
public class Foo {
public void print(int x) {
System.out.println("Printing number: " + x);
}
public void print(String x) {
System.out.println("Printing string: " + x);
}
public static void main(String[] args) {
Foo foo = new Foo();
foo.print(5);
foo.print("5");
}
}输出:
印刷号码:5 印刷线:5
发布于 2015-05-25 14:01:03
多态性仅适用于方法。非静态和非最终方法.
实际上,在第一个块中,您不需要覆盖,而是隐藏ab()方法。这是第8.4.8.3节中的规则,“重写和隐藏的需求”:
与编写快速代码相比,请检查本教程
发布于 2015-05-25 14:05:00
你的问题:
多态性是一个只与超越方法相关的概念吗?
是的- Java只在类的方法上实现多态性。在数据类型上尝试它的方式不起作用。
第一个代码块是否与多态性相关?
是的,这是一个典型的运行时多态的例子,
如果是,什么是运行时多态性和编译时多态性?
您的工作示例是典型的运行时情况。我们将此称为运行时,因为只有当代码实际运行时,才能确定a1实际上是B的实例,而不是A的实例
编译时多态是指由于与代码相关的类型而在编译代码时选择一个方法而不是另一个名称相同的方法的情况。
https://stackoverflow.com/questions/30440037
复制相似问题