构造函数
类实例的构造创建过程是:
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; } }