我想知道,如果为某个参数创建一个具有空setter方法的父类,然后创建几个扩展所述类的类,但不是所有类都具有该参数,会发生什么。在存在参数的类中调用set方法时,它会设置param。在参数不存在的类中,什么都不会发生,例如:
class Parent{
void setParam(String param){};
}
class A extends Parent{
String param;
public void setParam(String param){
this.param = param;
}
}
class B extends Parent{
String otherParam;
public void setOtherParam(String param){
this.otherParam = param;
}
}
因此,如果我们创建类A,将其上转换为Parent,并尝试setParam()
,则会设置属性param
。
Parent parent = new A();
parent.setParam("PARAM");
A{param='PARAM'}
如果我们对类B也这样做,并尝试CCD_ 3,则不会发生任何事情。
有人能解释一下"幕后"发生了什么吗?我希望得到一个异常,因为我正在尝试设置一个不存在的参数。
类A
已重写类Parent
的方法setParam
。即使将A
实例分配为Parent
类,对a.setParam()
的调用仍然表现为子类A
。这就是所谓的";子类多态性";。
类B
不覆盖Parent
的任何内容。所以b.setParam()
只是调用b的父级的setParam
方法,什么也没发生。
在Parent
类中,setParam()
是一个空方法,从任何子类调用它都不会执行任何代码行,除非子类重写它并向它添加几行代码。
类A
重写setParam()
并添加一行代码。类B
不重写此方法。因此,当在A
的实例上调用setParam()
时,执行A
的重写方法,并将提供的值分配给成员变量param
;然而,当在B
的实例上调用时,会执行Parent
的方法,并且不会发生任何事情,因为它在Parent
中是空的。
因此,在这种情况下,没有任何事情发生。