将子对象作为父参数发送

时间:2016-02-15 02:36:56

标签: java polymorphism

我遇到了这段代码:

public class B extends A
{....}

public class C extends A
{...
 public boolean f(A a)
   {...}
}
//driver
...
A y1=new B();
B y2=new B();
A z1=new C();
C z2=new C();
//1 System.out.println(z1.f(z2));
//2 y1.dosmth()==((B)(z1).dosmth());

我最初认为#1是不正确的,因为f只能接收一个定义为A 的对象,但显然它也适用于一个孩子的对象(z2定义为C并且是C的对象)。 不继承限制使用方法来接收与方法中定义相同的参数吗?

关于#2:我知道只有在对象具有任何继承关系时才能进行转换。即,我不能(Animal)table。但它似乎在这里工作。 是因为B像A一样延伸A吗?虽然它仍然像我(Dog)cat或类似的东西。

非常感谢您的投入!

2 个答案:

答案 0 :(得分:1)

好问题!

a表示a的类型为A.由于C是A的子级,因此System.out.println(z1.f(z2))有效。这就像说:

a a = new C()

f(z2) - > f(a)。

如果dosmth()在A中,或者如果它在B和C中,那么你的语句#2也应该运行。我在下面的解释应该有助于解释原因:

如果B和C扩展A,它们都具有A的所有非私有属性。

例如,如果A有一个公共方法getMe(),那么B和C将有一个公共方法getMe(),无论你是否在B和C中放置了一个getMe()方法。

但是,如果B类和C类中有getMe(),则可能会覆盖。当重写发生时,Child Class的getMe()方法中的属性将优先于Parent Class的getMe()方法。如果Child Class getMe()的属性与Parent Class getMe()不同,则覆盖可能会影响在对象上调用getMe()时发生的情况。如果你没有在B和C类中放入getMe(),B和C将自动接收A的getMe()。

当您将Child Class对象设置为Parent Class类型的变量并在Parent Class变量上调用Parent Class变量时,需要将Parent Class强制转换为其子类。< / p>

动物var1 =新狗()

Animal var2 = new Cat()

(狗)var1.bark()//因为并非所有动物都吠叫!

通过投射,你告诉编译器,“相信我!我知道这是一只狗。只要顺其自然!”,因为编译器不知道你正在使用哪种类型的Animal。编译器只知道它正在使用Animal。由于Animal类没有bark()方法,编译器会认为在不进行强制转换时会发生错误。通过将Animal转换为Dog,您告诉编译器假设Animal的这个特定实例是Dog。

希望这有帮助!

答案 1 :(得分:0)

  1. 您应该能够通过OOP原则以与父类相同的方式使用子类

  2. Java允许您在Compile-Time中向同一继承树中的任何内容强制转换。但是如果您尝试将 cat 强制转换为 dog ,则可能会在运行时获得 java.lang.ClassCastException 。它就像&#34;嘿Java,相信我, cat 显然是!没有任何问题。&#34;