【问题标题】:Understanding the concept of inheritance in Java理解Java中的继承概念
【发布时间】:2010-06-16 10:04:01
【问题描述】:

我只是在刷新 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() 方法,所以它只访问子类方法是可以理解的。

但我不明白为什么它要从 Super 类中访问 x 的值...

提前谢谢....

【问题讨论】:

  • 请评论哪个答案最接近正确。

标签: java inheritance


【解决方案1】:

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

【讨论】:

  • 该死,正要写同样的句子:-)。
【解决方案2】:

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

Super sup = new Sub();

现在您有一个Super 类型的变量sup,它引用Sub 类型的对象。

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

当你访问一个对象中的一个字段时,这个字段是根据变量的类型来选择的,这就是你得到5的原因。

【讨论】:

    【解决方案3】:

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

    类 Animal 可以有一个字段 age 和一个字段 name 所有子类都将共享这些属性,但会有额外的字段,这些字段将仅包含在这些子类中。例如 hairColour 可能是 Dog 类的唯一属性,但不是 Snake 类的唯一属性,Snake 可能有一个简单的唯一属性 venomous

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

    您的代码没有清楚地显示这一点,因为您的子类没有构造函数,实际上没有超级构造函数调用。正如 Petar 所解释的,您的非私有属性 index 是从超类访问的

    【讨论】:

      【解决方案4】:

      这是因为函数遵循运行时绑定,而变量是在编译时绑定的。

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-07
          • 2013-01-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多