Java继承覆盖实例变量[复制](Java inheritance overriding insta

2019-07-20 02:36发布

这个问题已经在这里有一个答案:

  • Java继承-实例变量覆盖 3个回答

我在学习java。 我在继承一个疑问。 当一个子类扩展父类和父类有指父声明的实例变量的方法。 但是,子类力覆盖此方法,并已申报实例与名称相同的父变量。 在从小孩这种情况下,实例变量将被称为或父母将被称为。 下面的代码片段

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();
    }
}

我得到的输出是

在父母
在孩子
10

是否有人可以让我明白为什么它指父类的实例变量a ,而不是子类的a

另一个疑问是,我明白了隐藏方法,当有在父母子女类的静态方法也已宣布与相同签名的静态方法。 这里隐藏装置? 什么方法越来越隐蔽? 如果它的父类的方法可以请您给我解释一下?
提前致谢。

Answer 1:

  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));
}

它应该输出:

    p1.a is 10
    c1.a is 11
    p1 == c1 is true

这表明,有两个不同的领域一个对象调用a ...你可以同时获得它们的值的保持,如果访问允许的话。


最后,你应该学会遵循标准的Java标识符约定。 类名应该总是以大写字母开头。



Answer 2:

Instance variables are not overriden in sub-class 。 如果您定义具有相同名称的类变量在你的超类,它被称为变量的遮蔽, inheritance and polymorphism并不适用于实例变量。 如果您在父定义方法()和儿童类覆盖它。 下面将调用孩子的方法()由于运行时多态性打印11

 parent p1 = new child();
  1. 调用构造函数儿童
  2. 与超()调用来调用的父类的构造
  3. 打印的“父”和初始化家长一到10
  4. 印刷是在儿童和初始化一个童车11

      p1.method();// this invokes Child's method() during run-time 


Answer 3:

当你不覆盖在子类()的方法,在声明中,

parent p1 = new child();

被执行时,方法的父版本()将被执行,并且是唯一已知的父类的值是它自己的一个。 因此,它将打印= 10(因为它是堆栈当时上)。

最后,你只是阴影的变量从父类到子类。



Answer 4:

当你这样做

父P1 =新的儿童();

JVM是什么做的是

               first  Initialize Parent()

                         ||

               second Initialize Child()

所以,首先家长构造函数被调用,然后孩子的,但产值11,因为P1指的是孩子的对象。



Answer 5:

问题是你创建了一个子实例,并将其存储在父的参考。 因此,当你访问对象的属性,JVM是指父母的变量值。

在情况下,这本来是一个子类的引用变量,你就已经收到了子类变量的值。

以上是Java的功能。



Answer 6:

当你创建父的实例。 所以在运行时编译器调用父对象,尝试下面的代码。

public static void main(String args[]) throws IOException {
    child c1 = new child();
    c1.method();
}


文章来源: Java inheritance overriding instance variable [duplicate]
标签: java oop