猿问

用Java覆盖成员变量(变量隐藏)

用Java覆盖成员变量(变量隐藏)

我正在研究用Java重写成员函数,并考虑尝试重写成员变量。

所以,我定义了类

public class A{
    public int intVal = 1;
    public void identifyClass()
    {
        System.out.println("I am class A");
    }}public class B extends A{
    public int intVal = 2;
    public void identifyClass()
    {
        System.out.println("I am class B");
    }}public class mainClass{
    public static void main(String [] args)
    {
        A a = new A();
        B b = new B();
        A aRef;
        aRef = a;
        System.out.println(aRef.intVal);
        aRef.identifyClass();
        aRef = b;
        System.out.println(aRef.intVal);
        aRef.identifyClass();
    }}

产出如下:

1

I am class A

1

I am class B



我不明白为什么Aref设置为b intVal仍然属于A类?


临摹微笑
浏览 627回答 3
3回答

呼唤远方

Java中的字段没有多态性。Variables决策总是在编译时发生。基类变量(不是子变量的继承变量)将被访问。所以,每当向上转换发生时,请记住1)将访问基类变量。2)子类方法(如果重写发生了其他继承的方法,则调用父方法)。

繁星点点滴滴

Java函数中覆盖的概念将取决于对象类型,变量将在引用类型上访问。重写函数:在本例中,假设父类和子类的名称与自己的定义相同。但是,哪个函数将执行它取决于对象类型,而不是运行时的引用类型。例如:Parent parent=new Child();parent.behaviour();这里parent是父类的引用,但持有子类的对象,因此在这种情况下将调用子类函数。Child child=new Child();child.behaviour();这里child保存子类的对象,因此将调用子类函数。Parent parent=new Parent();parent.behaviour();这里parent保存父类的对象,因此将调用父类函数。覆盖变量:Java支持重载变量。但实际上,这是两个同名的不同变量,一个在父类中,一个在子类中。这两个变量可以是相同的数据类型,也可以是不同的数据类型。当您试图访问变量时,它依赖于引用类型对象,而不是对象类型。例如:Parent parent=new Child();System.out.println(parent.state);引用类型是父类型,因此可以访问父类变量,而不是子类变量。Child child=new Child();System.out.println(child.state);在这里,引用类型是子类型,因此访问的是子类变量,而不是父类变量。Parent parent=new Parent();System.out.println(parent.state);在这里,引用类型是父类型,因此访问父类变量。
随时随地看视频慕课网APP

相关分类

Java
我要回答