java – 将子对象作为父参数发送

我遇到了这段代码:

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的对象,但显然它也适用于A的子对象(z2被定义为C并且是C的对象).
是否继承限制使用接收方法的方法定义与方法相同?

关于#2:我知道只有在对象具有任何继承关系时才能进行转换.即,我不能做(动物)表.但它似乎在这里工作.
是因为B像A一样延伸A吗?虽然它看起来像我(狗)猫或类似的东西.

非常感谢您的投入!

最佳答案 好问题!

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

A =新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强制转换为其子类.

动物var1 =新狗()

动物var2 =新猫()

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

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

希望这可以帮助!

点赞