覆盖Java中的成员变量

Kal*_*ghu 60 java overriding

我正在研究在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();
    }
}
Run Code Online (Sandbox Code Playgroud)

输出是:

1
I am class A
1
I am class B
Run Code Online (Sandbox Code Playgroud)

我无法理解为什么当aRef被设置为b时intVal仍然属于A类?

Mar*_*nik 76

当您在子类中创建同名变量时,这称为隐藏.现在生成的子类实际上具有两个属性.您可以使用super.var或访问超类中的那个((SuperClass)this).var.变量甚至不必是同一类型; 它们只是两个共享名称的变量,就像两个重载方法一样.


Oli*_*rth 53

变量在Java中不是多态的; 他们不会互相覆盖.


Ank*_*hal 12

Java中的字段没有多态性.

Variables决定发生在编译时,因此将始终访问基类变量(不是子继承变量).

因此,无论何时发生向上转换都要记住

1)将访问基类变量.

2)将调用子类方法(重写方法,如果覆盖发生其他继承方法,因为它来自父方法).


Ros*_*atl 11

变量是解析编译时,方法运行时.aRef的类型为A,因此aRef.Intvalue的编译时解析为1.