我正在学习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
无法在子类中重写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));
}
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标识符约定.类名应始终以大写字母开头.