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=31

BB的构建者是否引用BB或AA中的变量?如果我在BB中调用getX()函数,它是否返回AA或BB中的x值?BB的花括号内的任何
\ux
请参考BB的
\ux
getX
方法返回AA的
\ux
。如何声明
a
?您使用什么来检查
\ux
的值?
\ux
BB
中的值将为
31
,在
AA
上的值将为
30
。这不是你得到的吗?…但这不是我得到的。为什么你认为不提供你真正得到的比告诉我们更清楚?