Java 中的典型分层继承

Typical Hierarchical inheritance in Java

考虑下面的代码片段

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();
    }
}

为什么我不能这样做?是什么阻止我写这篇文章??

Why i can't do like this ?

SubClass2 不是 SubClass1

What stopping me to write this ??

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

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

或者你可以

public class SubClass2  extends SubClass1 {

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

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

两个子 classes 仅与它们扩展的 class(es) 相关,彼此无关。

这是因为在多态性中,您不能通过另一个兄弟姐妹引用一个兄弟姐妹。 比如下图中,你可以这样做:

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

因为所有这些都有共同的超类。但是 MountainBikeRoadBikeTandemBike 不能相互引用,因为它们是兄弟姐妹。

让我们举一个面向对象编程的例子。条件是子类 classes SubClass1 和 SubClass2 的父类 class。

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

现在,当您查看分层 Subclass 时,它们之间的关系是 "sibling" 而不是 "child-parent";由于子项是由父项派生的,因此父项可以持有各自子项的对象。但这并不意味着兄弟姐妹都可以有自己的行为和属性版本(一个可以有更多其他可以有更少)在这种情况下如果 java 允许或者说 OOP 允许兄弟姐妹表现是正确的就像你的代码一样,"physical problem implemented pro-grammatically" 的概念会出错。