理解Java中的继承概念

理解Java中的继承概念,java,inheritance,Java,Inheritance,我只是在刷新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(

我只是在刷新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的值


提前感谢….

这称为实例变量隐藏-。基本上,您有两个独立的变量,由于引用的类型是
Super
,它将使用
Super
中的
索引变量,对象有类型,变量有类型。因为你说:

Super sup = new Sub();
现在您有了一个
Super
类型的变量
sup
,它引用了
Sub
类型的对象

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

当您访问对象中的字段时,将根据变量的类型选择该字段,这就是为什么会得到5。

索引只是属于父类的字段。因为它属于父类,这意味着它是所有子类的属性。 简单来说,这个概念:

类动物可以有一个字段年龄和字段名称 所有子类都将共享这些属性,但会有额外的字段,这些字段将仅包含在这些子类中。例如,hairColour可能是Dog类的唯一属性,但不是Snake类的属性,Snake类可能有一个简单的惟一属性venous

在这个结构中,所有的动物都有一个名字和一个年龄,这通常可以定义动物,每个物种都有一些它们特有的额外属性,这些属性包含在它们各自的子类中


您的代码没有清楚地显示这一点,因为您的子类没有构造函数,实际上没有超级构造函数调用。正如Petar所解释的,非私有属性索引是从超类访问的,因为函数遵循运行时绑定,而变量在编译时绑定


因此,变量取决于引用的数据类型,而函数取决于引用的数据类型表示的值。

当我们将子类的对象分配给父类对象时,只有父类对象可以接受两个类的公共属性,称为对象切片
这就是为什么第5类专利的价值会被打印出来,它只会发生在属性而不是方法上

Dam,我正要写同样的句子:-)。请评论哪一个答案最接近正确答案。