Java 将继承类的对象分配给超类的引用
给定以下代码:Java 将继承类的对象分配给超类的引用,java,Java,给定以下代码: public class A { int at=2; public int m(int i){return at+i;} } class B extends A { int at=3; public int m(int i){return at+5*i;} } public class Main { public static void main(String args[]){ A x = new B(
public class A {
int at=2;
public int m(int i){return at+i;}
}
class B extends A {
int at=3;
public int m(int i){return at+5*i;}
}
public class Main {
public static void main(String args[]){
A x = new B();
System.out.println("Output "+x.m(x.at));
}
}
输出为13
它是如何工作的?
我知道它采用B的方法,但参数呢?看看表达式:
x.m(x.at)
。由于x
被称为A
,x.at
将引用A
中的at
字段
然而,当涉及到方法时,它变得更加复杂。虽然x
被声明为A
,x
实际上是B
类型,所以方法m
将从x
的实际类B
调用
可能会有帮助。变量不会覆盖类似的方法。所以变量的值取决于引用变量,而不是该引用变量引用的实例 例:在你的情况下。In main()方法 A x=新的B() 引用变量x的类型为A,它包含B类型实例的引用
因此,X是类型A。每当你写X时,它是A类变量。实际上,你在
A
中有两个字段,一个在A
中声明,另一个在B
中声明。A
中的方法m
是指A
中的at
字段;B
中的方法m
是指B
中的at
字段。方法被重写,字段未被重写x
被声明为A
的实例,因此x.at
为2。当您调用methodm
时,将调用被重写的方法(B.m(2)
),因此得到3+5*2=13
在这种情况下,你应该告诉你什么是对的,为什么。这个问题的答案可以在
如果类声明具有特定名称的字段,则
该字段的声明据说隐藏了所有可访问的内容
超类中同名字段的声明,以及
班上的高级介面
在以下情况下,可以使用限定名称(§6.5.6.2)访问隐藏字段:
它是静态的,或者通过使用包含
关键字super(§15.11.2)或转换为超类类型
强制转换为超类类型是您的情况。您没有将其指定给对象,而是将其指定给引用。谢谢,我编辑了标题