Java:超类和子类

  1. 可以将子类变量强制转换为其任何超类吗?
  2. 可以为超类变量分配任何子类变量吗?
  3. 可以为超类分配任何变量吗?
  4. 如果是这样,接口变量是否可以从任何实现类中分配一个变量?

所有的狗都是动物吗?

所有的动物都是狗吗?

如果你需要一只动物,我给你一只狗,这总是可以接受的吗?

如果你需要专门的狗,但我给你任何动物,这可能会有问题吗?

如果你需要一些你可以驾驶的东西,但你不关心它是什么,只要它有像.Accelerate和.Steer这样的方法,你关心它是保时捷还是救护车?

  • 您可以将子类实例分配给超类变量
  • 咦?
  • 您可以将类的实例分配给该类实现的任何接口类型的变量

为了清楚起见,请考虑:

class A extends B implements C { } 

其中A是子类, B是超类, CA实现的接口。

  1. 子类可以向上转换为任何超类。

     B b = new A(); 
  2. 超类不能向下转换为任何子类(这是不合理的,因为子类可能具有超类不具备的function)。 你做不到:

     A a = new B(); // invalid! 
  3. 可以将超类分配给任何适当类型的变量。

     A q = new A(); // sure, any variable q or otherwise... 
  4. 可以将类分配给其实现的接口之一的类型的变量。

     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变量的具体类型。

Interesting Posts