构造函数和clone以及在继承中

构造函数

  • 类实例的构造创建过程是:
    1.属性域被初始化为默认值(0,false,null)
    2.按照在类声明的顺序初始化初始化语句和初始化块.
    3.执行构造函数
    所以,一个默认的空的无参构造函数并没有初始化类的实例域.因为实例域先于构造而初始化完毕了.

  • 构造函数无法被继承

  • 如果一个类没有定义构造函数,编译器会自动创建一个,如下:
public class A(){}

也就是说自己定义一个无参无实现的构造函数和不写构造函数没有区别

  • 继承的子类的无参构造函数会自动调用父类的无参构造函数.
  • 子类的构造函数总是需要调用父类的构造函数.实际上无参的构造函数,如果没有显式调用父类构造函数,编译器就会自动调用super(),如下:
public class A(){
super(); //编译器自动添加
}
  • 在构造函数中super(),或者this() 总是第一个执行(当然,super()和this() 不能共存于一个构造函数内).这是因为方法是在栈中调用执行的的,后调用的会先完成.
public class A(){
i=1; //这个是错误的,编译不能通过
super(); //手动添加的
}

克隆clone

在子类实现覆盖父类的clone() 方法时需要调用super();如:

 @Override 
 public Object clone() throws CloneNotSupportedException {  
     return super.clone();  
 }  
  • 为什么调用父类的clone() 就可以实现创建一个一样状态的新对象呢?
    是因为Object.clone() 方法有一个默认实现:

    Creates and returns a copy of this object. The precise meaning of “copy” may depend on the class of the object. –jdk1.7


意思是: 哪个对象调用了这个方法就创建和返回这个对象的一份复制.
  • 深拷贝:
public class Body implements Cloneable{  
    public Head head;  
    public Body() {}  
    public Body(Head head) {this.head = head;}  

    @Override 
    public Object clone() throws CloneNotSupportedException {  
        Body newBody =  (Body) super.clone();  
        newBody.head = (Head) head.clone(); //深拷贝
        return newBody;  
    }  

} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值