Java继承覆盖实例变量

Lol*_*lly 11 java oop

我正在学习java.我对遗产有疑问.当子类扩展父类时,父类有一个引用父类中声明的实例变量的方法.但是,子类dint会覆盖此方法,并声明了与父类同名的实例变量.在这种情况下,将引用来自child的实例变量或将引用parent.以下是代码段

class parent {
    int a;
    parent() {
        System.out.println("in parent");
        a = 10;
    }
   void method() {
        System.out.println(a);
    }
}
class child extends parent {
    int a;
    child() {
        System.out.println("in child");
        a = 11;
    }
}

public class Test {
    public static void main(String args[]) throws IOException {
        parent p1 = new child();
        p1.method();
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到的输出是


在孩子的父母
10

有人可以让我理解为什么它引用父类的实例变量a而不是子类a.

另一个疑问是,我理解隐藏方法,当父类中有静态方法时,子类也声明了具有相同签名的静态方法.这里隐藏的意思?什么方法被隐藏?如果它的父方法可以请你解释一下吗?
提前致谢.

Ste*_*n C 20

  1. 无法在子类中重写Java实例变量.Java继承不起作用.

  2. 在您的示例中,没有方法隐藏(或覆盖或重载).

  3. 但是隐藏了实例变量.在课堂上child,声明a皮的声明aparent,和所有引用achild类指的是child.a不是parent.a.

为了更清楚地说明这一点,请尝试运行:

public static void main(String args[]) throws IOException {
    child c1 = new child();
    parent p1 = c1;

    System.out.println("p1.a is " + p1.a);
    System.out.println("c1.a is " + c1.a);
    System.out.println("p1 == c1 is " + (p1 == c1));
}
Run Code Online (Sandbox Code Playgroud)

它应该输出:

    p1.a is 10
    c1.a is 11
    p1 == c1 is true
Run Code Online (Sandbox Code Playgroud)

这表明有一个对象具有两个不同的字段,称为a......如果访问允许,您可以获取它们的两个值.


最后,您应该学会遵循标准的Java标识符约定.类名应始终以大写字母开头.