java类中的多态性
考虑到接下来的课程:java类中的多态性,java,polymorphism,Java,Polymorphism,考虑到接下来的课程: public class AA { public int _x; public AA() { this(1); } public AA(int k) { _x = k*10; } public int getX() { return _x ; } } public cla
public class AA {
public int _x;
public AA() {
this(1);
}
public AA(int k) {
_x = k*10;
}
public int getX() {
return _x ;
}
}
public class BB extends AA {
public int _x;
public BB() {
this(2);
}
public BB(int k) {
super(k+1);
_x = super.getX() + 1;
}
public int getX() {
return _x;
}
}
如果我执行下一个操作:
a =new BB();
我想我应该得到x值31,但这不是我得到的。在我对多态性的理解中,x值应该来自类AA,不是吗?多态性只适用于非静态非私有方法。变量在编译时解析,因此
a.x
将引用AA
中声明的变量,而不管实际对象是什么。字段不被覆盖,只被隐藏
你大概在做:
AA a=新的BB()
如果您访问一个.x,那么它将给出30,因为您将访问AA类范围内的字段
但是,如果要调用.getX(),则将调用重写的方法,从而得到31(您将通过get方法得到类BB上的字段范围)
如果您这样做了,您也将获得31分:
BB b=新的BB()
以及进入b.(ux); 我想你已经写信了
AA a = new BB();
因为变量是在编译时解析的,所以您将得到的x是AA类中的一个。所以你得到了30张打印的照片。当然,假设您这样做:
System.out.println(a._x);
以下内容将为您提供31:
System.out.println(a.getX());
System.out.println(((BB)a)._x);
正如@drrob所说,字段只是隐藏的,而不是覆盖的。因为多态性是一个行为概念。 即使这样,你如何申报a也会有不同。说清楚了,, 我添加了一个小代码,从main调用 请看以下场景
AA a = new BB ();
System.out.println( " finally1 = "+a._x);
System.out.println( " finally2 = "+a.getX ( ));
BB a1 = new BB ();
System.out.println( " finally3 = "+a1._x);
System.out.println( " finally4 = "+a1.getX());
此处,输出的输出应如下所示:
最终1=30
最终2=31
最终3=31
最终4=31BB的构建者是否引用BB或AA中的变量?如果我在BB中调用getX()函数,它是否返回AA或BB中的x值?BB的花括号内的任何
\ux
请参考BB的\ux
。getX
方法返回AA的\ux
。如何声明a
?您使用什么来检查\ux
的值?\ux
在BB
中的值将为31
,在AA
上的值将为30
。这不是你得到的吗?…但这不是我得到的。为什么你认为不提供你真正得到的比告诉我们更清楚?