我在学习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
。
另一个疑问是,我明白了隐藏方法,当有在父母子女类的静态方法也已宣布与相同签名的静态方法。 这里隐藏装置? 什么方法越来越隐蔽? 如果它的父类的方法可以请您给我解释一下?
提前致谢。
Java实例变量不能在子类中重写。 Java继承不工作的方式。
在你的榜样,没有方法隐藏(或重写或超载)怎么回事。
还有就是虽然隐藏的实例变量。 在课堂上child
,申报a
隐藏的声明a
的parent
,以及所有引用a
在child
类指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标识符约定。 类名应该总是以大写字母开头。
Instance variables are not overriden in sub-class
。 如果您定义具有相同名称的类变量在你的超类,它被称为变量的遮蔽, inheritance and polymorphism
并不适用于实例变量。 如果您在父定义方法()和儿童类覆盖它。 下面将调用孩子的方法()由于运行时多态性打印11
parent p1 = new child();
- 调用构造函数儿童
- 与超()调用来调用的父类的构造
- 打印的“父”和初始化家长一到10
印刷是在儿童和初始化一个童车11
p1.method();// this invokes Child's method() during run-time
当你不覆盖在子类()的方法,在声明中,
parent p1 = new child();
被执行时,方法的父版本()将被执行,并且是唯一已知的父类的值是它自己的一个。 因此,它将打印= 10(因为它是堆栈当时上)。
最后,你只是阴影的变量从父类到子类。
当你这样做
父P1 =新的儿童();
JVM是什么做的是
first Initialize Parent()
||
second Initialize Child()
所以,首先家长构造函数被调用,然后孩子的,但产值11,因为P1指的是孩子的对象。
问题是你创建了一个子实例,并将其存储在父的参考。 因此,当你访问对象的属性,JVM是指父母的变量值。
在情况下,这本来是一个子类的引用变量,你就已经收到了子类变量的值。
以上是Java的功能。
当你创建父的实例。 所以在运行时编译器调用父对象,尝试下面的代码。
public static void main(String args[]) throws IOException {
child c1 = new child();
c1.method();
}