Java:超类和子类
- 可以将子类变量强制转换为其任何超类吗?
- 可以为超类变量分配任何子类变量吗?
- 可以为超类分配任何变量吗?
- 如果是这样,接口变量是否可以从任何实现类中分配一个变量?
所有的狗都是动物吗?
所有的动物都是狗吗?
如果你需要一只动物,我给你一只狗,这总是可以接受的吗?
如果你需要专门的狗,但我给你任何动物,这可能会有问题吗?
如果你需要一些你可以驾驶的东西,但你不关心它是什么,只要它有像.Accelerate和.Steer这样的方法,你关心它是保时捷还是救护车?
- 是
- 您可以将子类实例分配给超类变量
- 咦?
- 您可以将类的实例分配给该类实现的任何接口类型的变量
为了清楚起见,请考虑:
class A extends B implements C { }
其中A
是子类, B
是超类, C
是A
实现的接口。
-
子类可以向上转换为任何超类。
B b = new A();
-
超类不能向下转换为任何子类(这是不合理的,因为子类可能具有超类不具备的function)。 你做不到:
A a = new B(); // invalid!
-
可以将超类分配给任何适当类型的变量。
A q = new A(); // sure, any variable q or otherwise...
-
可以将类分配给其实现的接口之一的类型的变量。
C c = new A();
可以将子类变量强制转换为其任何超类吗?
是
并且可以为超类变量分配任何子类变量吗?
是
可以为超类分配任何变量吗?
是
如果是这样,接口变量是否可以从任何实现类中分配一个变量?
是
是的,这通常是多态性的主要观点。
假设你有一些形状:圆形,方形,三角形。 你有:
class Shape { ... } class Circle extends Shape { ... } class Square extends Shape { ... } class Triangle extends Shape { ... }
inheritance的想法是Circle是一个形状。 所以你可以这样做:
Shape x = ...; Point p = x.getCenterPosition();
您不需要关心x
变量的具体类型。