标签:
在Java中,子类的构造过程中,必须调用其父类的构造函数,是因为有继承关系存在时,子类要把父类的内容继承下来,通过什么手段做到的?
答案如下:
当你new一个子类对象的时候,必须首先要new一个父类的对像出来,这个父类对象位于子类对象的内部,所以说,子类对象比父类对象大,子类对象里面包含了一个父类的对象,这是内存中真实的情况.构造方法是new一个对象的时候,必须要调的方法,这是规定,要new父类对象出来,那么肯定要调用其构造方法,所以:
第一个规则:子类的构造过程中,必须调用其父类的构造方法。一个类,如果我们不写构造方法,那么编译器会帮我们加上一个默认的构造方法,所谓默认的构造方法,就是没有参数的构造方法,但是如果你自己写了构造方法,那么编译器就不会给你添加了,所以有时候当你new一个子类对象的时候,肯定调用了子类的构造方法,但是在子类构造方法中我们并没有显示的调用基类的构造方法,就是没写,如:super(); 并没有这样写,但是这样就会调用父类没有参数的构造方法,如果父类中没有没有参数的构造方法就会出错。
第二个规则:如果子类的构造方法中没有显示的调用基类构造方法,则系统默认调用基类无参数的构造方法注意:如果子类的构造方法中既没有显示的调用基类构造方法,而基类中又没有默认无参的构造方法,则编译出错,所以,通常我们需要显示的:super(参数列表),来调用父类有参数的构造函数。
总结:不过一般的,在父类中使用了构造方法的重载,在子类中就可以根据需要,调用相应的父类构造方法。
class Point { //定义"点"类
//x轴坐标和y轴坐标,由于准备用于继承,故修饰为protected
protected float mX, mY;
public Point(float x, float y) { //构造方法
mX = x;
mY = y;
}
}
class Circle extends Point { //定义"圆"类继承于"点"类
protected float mRadius; //半径
public Circle(float r) { //构造方法
mRadius = r;
}
}
public class Demo {
public static void main(String[] args) {
Circle c = new Circle(2.5f); //实例化"圆"类对象
}
}
本段程序为何报错
在内存机制中,父类和子类是占用同一块内存的,只不过子类在父类的基础上增加了自己的部分(属性)。子类是依附于父类的,先有父类再有子类。
一个子类对象的产生,必须先调用父类的构造方法产生一个父类实例,然后在这个实例基础上添加自己的部分。
派生类构造方法的执行顺序“
使用this()来调用本类的其他构造方法
使用super()语句调用父类的构造方法
如果子类的构造方法中没有使用super显示地调用父类构造方法,也没有使用this关键字调用重载的其它构造方法,则系统默认调用父类无参数的构造方法,相当于super(),如果父类中没有无参的构造方法,则编译出错
super()或者this()必须在构造方法的第一行,只能有一句。
标签:
原文地址:http://www.cnblogs.com/ZhuRenWang/p/4719327.html