理解Java中的inheritance概念

我只是刷新java的oopsfunction。 所以,我对inheritance概念有点困惑。 为此,我有以下示例代码:

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的值…

提前致谢….

对象有类型,变量有类型。 因为你把:

 Super sup = new Sub(); 

现在你有一个类型为Super的变量sup ,它指的是Sub类型的对象。

当您在对象上调用方法时,将根据对象的类型选择运行的方法,这就是它打印“Sub”而不是“Super”的原因。

当您访问对象中的字段时,将根据变量的类型选择字段,这就是您获得5的原因。

这称为实例变量隐藏 – 链接 。 基本上你有两个独立的变量,因为引用的类型是Super ,它将使用Superindex变量。

index只是属于父类的字段。 因为它属于父类,所以它意味着它是所有子元素的属性。 简单地说这个概念:

类动物可以具有字段年龄和字段名称所有子类都将共享这些属性,但是将具有其他字段,这些字段仅包含在这些子类中。 例如, hairColour可能是Dog类的唯一属性,但不是类Snake,它可能有一个简单的独特属性有毒

在这种结构中,所有Animal都有一个名称和一个年龄,这是一般可以定义动物的年龄,每个物种都有一些独特的属性,它们包含在各自的子类中。

您的代码没有清楚地显示这一点,因为您的子类没有构造函数,实际上没有超级构造函数调用。 正如Petar所解释的那样,你的无私有属性索引是来自超类的访问

这发生在运行时绑定之后的coz函数,而变量在编译时被绑定。

因此,变量依赖于引用的数据类型,而函数依赖于引用的数据类型所代表的值。

当我们将子类的对象分配给父类对象时,只有公共属性这两个类都可以被父类对象接受,被称为对象切片,这就是专利类5的值被打印的原因,它只发生在属性而非方法中