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();
因为所有这些都有共同的超类。但是 MountainBike
、RoadBike
和 TandemBike
不能相互引用,因为它们是兄弟姐妹。
让我们举一个面向对象编程的例子。条件是子类 classes SubClass1 和 SubClass2 的父类 class。
现在在代码中,您试图在 SubClass1 的引用中保存 SubClass2 的对象。现在,当您尝试创建 link 时,它将如下图所示
现在,当您查看分层 Subclass 时,它们之间的关系是 "sibling" 而不是 "child-parent";由于子项是由父项派生的,因此父项可以持有各自子项的对象。但这并不意味着兄弟姐妹都可以有自己的行为和属性版本(一个可以有更多其他可以有更少)在这种情况下如果 java 允许或者说 OOP 允许兄弟姐妹表现是正确的就像你的代码一样,"physical problem implemented pro-grammatically" 的概念会出错。
考虑下面的代码片段
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();
因为所有这些都有共同的超类。但是 MountainBike
、RoadBike
和 TandemBike
不能相互引用,因为它们是兄弟姐妹。
让我们举一个面向对象编程的例子。条件是子类 classes SubClass1 和 SubClass2 的父类 class。
现在在代码中,您试图在 SubClass1 的引用中保存 SubClass2 的对象。现在,当您尝试创建 link 时,它将如下图所示
现在,当您查看分层 Subclass 时,它们之间的关系是 "sibling" 而不是 "child-parent";由于子项是由父项派生的,因此父项可以持有各自子项的对象。但这并不意味着兄弟姐妹都可以有自己的行为和属性版本(一个可以有更多其他可以有更少)在这种情况下如果 java 允许或者说 OOP 允许兄弟姐妹表现是正确的就像你的代码一样,"physical problem implemented pro-grammatically" 的概念会出错。