常见的多态,都是在main函数里定义了一个父类的引用的指向子类的对象,从而通过父类的引用调用子类的方法。但是今天在做对象深克隆,浅克隆的实验时,发现如果这个引用是类的数据成员...
常见的多态,都是在main函数里定义了一个父类的引用的指向子类的对象,从而通过父类的引用调用子类的方法。但是今天在做对象深克隆,浅克隆的实验时,发现如果这个引用是类的数据成员,好像不能多态
首先尝试浅克隆(雇员类里包含了地址类的引用)
class Address
{
protected String city;
protected String province;
//省略get set 方法,构造函数及toString
}
class Employee implements Cloneable
{
protected String name;
protected String position;
protected Address address; //引用数据成员
//省略get set 方法及toString构造函数
@Override
public Employee clone()
{
Employee em=null;
em=(Employee)super.clone();
return em;//省略try catch
}
在做深克隆时没有必要重新写雇员类和地址类,用继承
class Address2 extends Address implements Cloneable
{
//省略构造函数
@Override//重新写clone()函数
public Address clone()
{
Address2 ad=null;
ad=(Address2)super.clone();
return ad;
}
}
class Employee2 extends Employee implements Cloneable
{
public Employee2(String name, String position,Address2 address2)
{
super(name,position,address2);//Employee里的address指针指向的是子类address2
}
@Override
public Employee2 clone()
{
Employee2 em=null;
em=(Employee2)super.clone();
em.address=address.clone();//报错1.address的 来自Object类的clone是不可见的2.无法把object类变成address类
return em;
}
按照多态,雇员2类的address指针指向子类对象address2,那么在调用address.clone(),函数时就应该调用我重新在address2里定义的clone()函数(它是public的,而且返回的是address)而不是Object类里的clone()函数,那就不该报错,请高手们帮我指点迷津!万分感谢!
展开