St.*_*rio 16 java inheritance class
我有以下课程:
public class Base{
//fields
public String getStr(){
String str = null;
//Getting str from the fields
return str;
}
}
public class Derived extends Base{
//fields
//some other fileds
public String getStr(){
String str = null;
//Getting str from the fields + some other fields
return str;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我有一个具有类型参数的方法Derived
.
public void makeStr(Derived d){
Base b = null;
//Getting the Base class subobject from d and printing the str
}
Run Code Online (Sandbox Code Playgroud)
但我不能只是做任务b = d;
然后调用b.getStr()
因为该方法d.getStr()
将被调用.
如何Base
从类型的Base
对象的子对象创建该类型的对象Derived
?事实上,我只想创建Base
该类型的子对象的副本Derived
.
Era*_*ran 22
子类中重写方法的重点在于子类的方法将在运行时执行,即使编译时类型是超类的类型.
如果由于某种原因需要超类的实例,则应该向超类添加一个复制构造函数并使用它来创建这样的实例:
public class Base {
...
Base (Base source) {
// copy the properties from source
}
}
Run Code Online (Sandbox Code Playgroud)
然后 :
public void makeStr(Derived d)
{
Base b = new Base(d);
... b.getStr() will call the Base class implementation
}
Run Code Online (Sandbox Code Playgroud)
当你在Java中从另一个类继承一个类时,对于子类的对象没有父类"子对象"这样的东西.您似乎希望基于原型的继承,就像在JavaScript中一样.
如果您想访问"子对象",您可能希望以另一种方式实现"继承".Derived对象不应该从Base对象继承,而是包装它.
class Derived {
private Base base;
public Derived(Base base) {
this.base = base;
}
public Base getBase() {
return this.base;
}
}
public void makeStr(Derived d){
Base b = d.getBase();
// ...
}
Run Code Online (Sandbox Code Playgroud)
小智 5
基本思想是,当创建子类的对象时,子类对象中没有基类对象的重写方法的定义,所以你永远不会从子类对象中获得这样的超级方法.
你可以通过强制转换来获得休息成员.
Base castedInBase = derivedObj;
//child class specific member as well as hided fields are also availble here.
Run Code Online (Sandbox Code Playgroud)
你可以通过使用构造函数获得父类的对象 -
Base base= new Base(derivedObj);
//orrided method of base class lost,will refer to super class overrided method.
Run Code Online (Sandbox Code Playgroud)
让我们假设以下是您的方法 -
public void makeStr(Derived derivedObj){
Base castedInBase = derivedObj;
}
Run Code Online (Sandbox Code Playgroud)
注意:这不可能从Child类对象中获取父类的重写方法.