0

我有A级

public class A{

   public void doWork(){
              ..............
              .............
   }

}

现在公共类 B 扩展了 A

public class B extends A{

   @override
   public void doWork(){
          ............
          ............
   }

}

现在公共类 C 在其中创建 B 的对象并将其传递给 D 类的方法

import xxx.xxx.B;
import xxx.xxx.D;

public class C{
     B b= new B();
     D d = new D();

     d.method(b);
}

现在类 D 将 A 类型的参数带入其方法并对其进行操作。

public class D{

   public void method(A a){
      ..........
      ..........
   }

}

实际上它是允许的,但我不明白为什么它是允许的?D 类中的 method() 应该采用 A 类型的对象。请帮帮我?

4

6 回答 6

4

B是 的延伸A。例如,参加一个 classAnimal和一个 class Dog extends AnimalDog仍然是一个Animal。你的情况也一样。

于 2013-09-28T14:58:01.187 回答
3

当你extends这样使用时,你是在说这个类B“是一个”类A,只是它的一个更专业的版本。例如,您可能有Shape,然后Circle extends ShapeCircle 是一个 Shape,只是它的一个特化。这就是它被称为子类化的原因:您正在创建一个更具体的类,它(通常)是通用类的子集。

“是”可能是继承中最基本的关系。

于 2013-09-28T14:58:12.610 回答
2

协方差

如果 Cat 是 Animal 的子类型,那么只要 Animal 类型的表达式可以使用 Cat 类型的表达式

你的B is extends A. 所以,B也有性质A

你期待一个 A ..所以你对接收B具有的属性感到满意A

于 2013-09-28T14:59:05.590 回答
1

这就是多态性的概念,它是面向对象编程的关键部分。B 的实例从 A 扩展而来,因此可以多态地视为 A 的实例。

注意:反过来是不正确的,即。A 的实例不能被视为 B 的实例

于 2013-09-28T14:58:42.743 回答
0

D 中的methodD 可以采用 A 子类的任何类。

注意类型安全。目前,在您method的 D 中,您在参数上调用的所有方法都将执行 A 的实现。

于 2013-09-28T14:59:52.993 回答
0

D 类中的 Method() 可以采用 A 类型的对象或 A 的子类型。在这种情况下,B 扩展了 A,所以它工作得很好。看看http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

于 2013-09-28T15:02:44.990 回答