构造函数详细总结
一.构造函数的功能:在创建对象时初始化对象的实例变量;
- 【注意事项】
1.构造函数【与类具有相同的名字】,除了构造函数,其他的方法不能与类同名。
2.构造函数【没有返回值】,也不能在前面加void修饰符
3.如果类中没有定义构造函数,编译器会自动创建一个缺省的、不带参数的构造函数。
【构造函数是在对象创建之后,new操作完成前被调用的。】 - 二.this指代构造函数
- 1.在一个类内部,一个构造函数可以调用另一个构造函数。
- eg:
class point{
int x,y;
point(){ this(1,1);}
point(int x,int y){this.x = x;this.y = y;}
2.在派生类中(即父子类中)用super调用构造函数
*(1). 构造函数是一种特殊的方法,子类不能继承超类的构造函数,
- 但子类构造函数可以通过super调用超类的构造函数。
- (2).当创建子类对象时,
- 首先执行超类构造函数,然后执行子类的构造函数。例如:
class point{
int x, y;
point() { this(1,1);
System.out.println("无参构造函数被调用!");
}
point(int x, int y){
this.x=x; this.y=y;
System.out.println("父类构造函数被调用!");
}
}
class circle extends point{
int radius;
circle(int r, int x, int y){
super();
radius=r;
System.out.println("子类构造函数被调用!");
}
}
public class testInherence {
public static void main(String args[ ]) {
circle c1;
c1=new circle(1,1,1);
}
}
结果为:
父类构造函数被调用!
无参构造函数被调用!
子类构造函数被调用!
三.【子类构造函数(调用)(如果你不调用父类构造函数时则不须遵循这些规则)父类构造函数时】的设计原则
*1.若父类没有定义构造函数,则父类对象将用系统默认的构造函数初始化,
*子类可以随意设置构造函数。但子类先调用父类的默认构造函数,
*再调用自己的构造函数。
class point{
int x, y;
}
class circle extends point{
int radius;
circle(int r, int x, int y){
this.x=x; this.y=y; radius=r;
}
或者
circle(){
x=1; y=1; radius=1;
}
}
*2.若父类定义了默认构造函数,则子类可以随意设置构造函数。
*(即调用默认构造函数或带参构造函数)
class point{
int x, y;
point( ){ this(0,0); }
point(int x, int y){ this.x=x; this.y=y; }
}
class circle extends point{ // 注意子类的构造函数
int radius;
circle(int r, int x, int y){ radius=r; }
}
或
class point{
int x, y;
point( ){ this(0,0); }
point(int x, int y){ this.x=x; this.y=y; }
}
class circle extends point{ // 注意子类的构造函数
int radius;
circle(int r, int x, int y){
super(x,y) ;//显式调用父类的构造函数,这一行必须放在构造函数的第一行。
radius=r; }
}
3.若父类定义的构造函数都是有参的,子类必须通过super调用父类的带参构造函数。
class point{
private int x, y;
point(int x, int y){
this.x=x; this.y=y;
}
}
class circle extends point{
int radius;
circle(int r, int x, int y){
super(x, y);
radius=r;
}
}