我只是刷新了java的oops功能。所以,我对继承概念有点困惑。为此,我有以下示例代码:
class Super{
int index = 5;
public void printVal(){
System.out.println("Super");
}
}
class Sub extends Super{
int index = 2;
public void printVal(){
System.out.println("Sub");
}
}
public class Runner {
public static void main(String args[]){
Super sup = new Sub();
System.out.println(sup.index+",");
sup.printVal();
}
}
现在上面的代码输出为: 5,Sub。
这里,我们重写了printVal()方法,因此可以理解它只是访问子类方法。
但我无法理解为什么它从超级类中访问x的值...
提前致谢....
答案 0 :(得分:11)
这称为实例变量隐藏 - link。基本上你有两个单独的变量,因为引用的类型是Super
,它将使用index
中的Super
变量。
答案 1 :(得分:8)
对象有类型,变量有类型。因为你把:
Super sup = new Sub();
现在您有一个类型为sup
的变量Super
,它引用Sub
类型的对象。
当您在对象上调用方法时,将根据对象的类型选择运行的方法,这就是它打印“Sub”而不是“Super”的原因。
当您访问对象中的字段时,将根据变量的类型选择该字段,这就是您获得5的原因。
答案 2 :(得分:2)
index 只是属于父类的字段。因为它属于父类,所以它意味着它是所有子类的属性。 简单来说就是这个概念:
Class Animal可以有一个字段 age 和一个字段 name 所有子类都将共享这些属性,但是会有其他字段,这些字段只包含在这些子类中。例如, hairColour 可能是Dog类的唯一属性,但不是类Snake,它可能有一个简单的唯一属性毒性
在这个结构中,所有Animal都有一个名称和一个年龄,它可以定义一般的动物,每个物种都有一些独特的属性,它们包含在各自的子类中。
您的代码没有清楚地显示这一点,因为您的子类没有构造函数,实际上没有超级构造函数调用。正如Petar所解释的,您的非私有属性 index 是来自超类
的访问答案 3 :(得分:2)
这发生了coz函数跟在运行时绑定之后,而变量在编译时被绑定。
因此变量取决于引用的数据类型,而函数依赖于引用的数据类型所代表的值。
答案 4 :(得分:0)
当我们将子类的对象分配给父类对象时,只有公共属性这两个类都可以被父类对象接受,被称为对象切片 这就是为什么专利类5的价值被打印出来的唯一原因是财产而不是方法