参见英文答案 > Java Inheritance – instance variables overriding 3个
我正在学习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();
}
}
我得到的输出是
在父母
在孩子
10
有人可以让我理解为什么它引用父类的实例变量a而不是子类的a.
另一个疑问是,我理解隐藏方法,当父类中有静态方法时,子类也声明了具有相同签名的静态方法.这里隐藏的意思?什么方法被隐藏了?如果它的父方法可以请你解释一下吗?
提前致谢.
解决方法:
>无法在子类中重写Java实例变量. Java继承不起作用.
>在您的示例中,没有隐藏(或覆盖或重载)方法的方法.
>虽然隐藏了实例变量.在类child中,a的声明隐藏了父级的声明,而子类中对a的所有引用都引用了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
这表明有一个对象具有两个不同的字段,称为…,如果访问允许,您可以获取它们的两个值.
最后,您应该学会遵循标准的Java标识符约定.类名应始终以大写字母开头.
标签:java,oop
来源: https://codeday.me/bug/20190929/1830344.html