Java中的典型分层继承

时间:2015-03-30 03:03:28

标签: java inheritance

请考虑以下代码段

public class SuperClass {
    public void move()
    {
        System.out.println("i am in super class");
    }
}
public class SubClass1 extends SuperClass{
    public void move()
    {
        System.out.println("i am in sub1 class");
    }

}
public class SubClass2  extends SuperClass {

    public void move()
    {
        System.out.println("i am in sub2 class");
    }

}

现在我正在创建这样的对象。

public class program {
    public static void main(String[] args) {    
            SubClass1 obj = new SubClass2(); // Compile error - Type mismatch: cannot convert from SubClass2 to SubClass1
            obj.move();
    }
}

为什么我不能这样做?什么阻止我写这个?

4 个答案:

答案 0 :(得分:2)

  

为什么我不能这样做?

SubClass2不是SubClass1

  

是什么阻止我写这个?

您实际上无法将类型转换为Java中的引用。您只能将引用的类型更改为该对象实际所在的类型。你可能想要的是

SuperClass obj = new SubClass2(); // SubClass2 is a SuperClass 
obj.move();

或者你可以

public class SubClass2  extends SubClass1 {

答案 1 :(得分:2)

因为SubClass2扩展了SuperClass,而不是SubClass1。

例如,假设SubClass1还包含成员变量x和函数y()。如果您可以从SubClass2转换为SubClass1,则变量x和函数y()将不存在,并且您的程序将失败。所以Java不允许这样做。

这两个子类只与它们扩展的类相关,而不是彼此相关。

答案 2 :(得分:1)

因为在多态性中,你不能用另一个兄弟来引用一个兄弟。 例如,在下图中,您可以执行以下操作:

Bicycle b1 = new MountainBike();
Bicycle b2 = new RoadBike();
Bicycle b3 = new TandemBike();

因为所有这些都有共同的超类。但是MountainBikeRoadBikeTandemBike不能互相引用,因为它们正在相互竞争。

enter image description here

答案 3 :(得分:0)

让我们从OOP中举个例子。条件是子类SubClass1&的SuperClass父类。 SubClass2。

现在在代码中,您试图在SubClass1的引用中保存SubClass2的对象。现在,当您尝试创建链接时,它将如下图所示

enter image description here

现在,当你看到层次结构的子类有一个关系" sibling"不是"孩子 - 父母"哪里;由于孩子是由父母派生的,因此父母可以保留他们各自孩子的对象。但这并不意味着兄弟姐妹,因为两者都可以拥有自己的行为和属性版本(在这种情况下,如果java允许,可以有更多其他人可以拥有更多),或者说OOP允许兄弟像你的代码一样行为是正确的概念"物理问题以编程方式实施"会出错。