Java中,关于在子类构造函数中调用父类构造函数完成对象创建的简单分析
2014-12-13 22:33
821 查看
在使用new进行对象创建时,其实是调用了其相关类的构造方法。也就是说,对象创建时,最先执行的是构造方法。若在构造方法中没有对其类中的成员变量进行初始化,则在构造方法执行完之前,即对象还没有创建完毕,其成员变量是不存在的(此处不存在指的是内存中没有此变量)。下面通过一个小例子来说明这种情况
class Teacher {
private String title;
String name = "A";
int age = 20;
Teacher (String title) {
//System.out.println(name);
this(name,age,title);
}
Teacher (String name, int age, String title) {
System.out.println("OK");
}
}
public class Test {
public static void main (String[] args) {
Teacher teacher1 = new Teacher("John");
Teacher teacher2 = new Teacher("Mike",25,"TA");
}
}
如上:我注释了System.out.println(name);然后编译出错,报如下错误
如果说构造函数未执行完,对象未创建完成,成员变量未完成初始化的,此时name与age不存在的话,那么我将this(name,age,title);此句注释掉,用System.out.println(name);进行打印,结果是编译通过,且成功打印,结果如下
此结果又说明构造函数未执行完毕,成员变量就完成初始化了,也就是name与age有值了。
Java子类初始化的顺序是:
1.静态代码块,此处没有。
2.初始化父类。如果子类构造器没有显式调用父类构造器(即super()语句),也没有用this调用子类的其他构造器,那么系统会在子类构造器的第一行隐式加上super()。此处的父类是Object。
3.初始化子类,先执行类代码块,再执行构造方法。
所以当你将this(name,age,title);此句注释掉,用System.out.println(name);进行打印时,String name= "A"是先于构造器执行的,此时能成功打印。
另外还有一点,this和super语句都必须放在构造器的第一行,也由于这个原因,它们无法共存,有了this就没有super。
当你注释了System.out.println(name); ,用了this语句,Teacher (String title)构造方法就不会再调用父类的无参数构造器,那么当执行this(name,age,title)时,父类(也就是超类)还没有被初始化,子类的代码块也没有得到执行,name处于未初始化的状态,无法被调用。这也就是出错信息所说的“无法在调用超类型构造器之前引用name”。
class Teacher {
private String title;
String name = "A";
int age = 20;
Teacher (String title) {
//System.out.println(name);
this(name,age,title);
}
Teacher (String name, int age, String title) {
System.out.println("OK");
}
}
public class Test {
public static void main (String[] args) {
Teacher teacher1 = new Teacher("John");
Teacher teacher2 = new Teacher("Mike",25,"TA");
}
}
如上:我注释了System.out.println(name);然后编译出错,报如下错误
如果说构造函数未执行完,对象未创建完成,成员变量未完成初始化的,此时name与age不存在的话,那么我将this(name,age,title);此句注释掉,用System.out.println(name);进行打印,结果是编译通过,且成功打印,结果如下
此结果又说明构造函数未执行完毕,成员变量就完成初始化了,也就是name与age有值了。
Java子类初始化的顺序是:
1.静态代码块,此处没有。
2.初始化父类。如果子类构造器没有显式调用父类构造器(即super()语句),也没有用this调用子类的其他构造器,那么系统会在子类构造器的第一行隐式加上super()。此处的父类是Object。
3.初始化子类,先执行类代码块,再执行构造方法。
所以当你将this(name,age,title);此句注释掉,用System.out.println(name);进行打印时,String name= "A"是先于构造器执行的,此时能成功打印。
另外还有一点,this和super语句都必须放在构造器的第一行,也由于这个原因,它们无法共存,有了this就没有super。
当你注释了System.out.println(name); ,用了this语句,Teacher (String title)构造方法就不会再调用父类的无参数构造器,那么当执行this(name,age,title)时,父类(也就是超类)还没有被初始化,子类的代码块也没有得到执行,name处于未初始化的状态,无法被调用。这也就是出错信息所说的“无法在调用超类型构造器之前引用name”。
相关文章推荐
- 关于java 反射 创建对象 调用 有参数 的 构造函数
- 创建子类对象会调用父类的初始化方法,而不只是构造函数
- java创建一个子类对象是会调用父类的构造方法会不会创建父类
- 关于理解Java中的多态性,父类引用创建子类对象
- 关于基类指针指向子类对象,构造函数和析构函数调用的顺序的问题。
- java创建一个子类对象是会调用父类的构造方法会不会创建父类
- java 中关于子类调用父类构造函数问题
- java 程序加载过程---3--类中申明同时申明类的静态对象 创建类的实例 访问类的静态变量 调用类的静态方法 使用反射方法 初始化类的子类对象 直接使用java.exe 调用某个类
- JAVA中关于new子类对象时是否创建父类
- 为什么在创建子类对象的时候会调用父类的构造函数
- 创建子类对象时,父类构造函数中调用被子类重写的方法为什么调用的是子类的方法,而被子类重载的方法不会调用?
- Java继承-子类默认在构造函数中用super()调用父类构造函数
- 创建子类对象时,父类构造函数中调用被子类重写的方法为什么调用的是子类的方法,而被子类重载的方法不会调用?
- java创建一个子类对象是会调用父类的构造方法会不会创建父类
- java程序练习:尝试创建一个父类,在父类中创建两个方法,在子类中覆盖第二个方法,为子类创建一个对象,将他向上转型到基类并调用这个方法。
- 关于子类对象的构造函数和父类构造函数的执行顺序
- 关于子类对象的构造函数和父类构造函数的执行顺序
- 关于创建对象时调用构造函数和析构函数的若干问题
- Java继承,子类默认在构造函数中用super()调用父类构造函数
- 《Java编程思想》之对象的创建、使用、生命期(简单比较java与C++的不同之处)