理解Java中的继承概念

时间:2010-06-16 10:04:01

标签: 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("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的值...

提前致谢....

5 个答案:

答案 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的价值被打印出来的唯一原因是财产而不是方法