Java中子类和父类构造方法的问题
2015-03-10 11:57
323 查看
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">转载自http://www.dedecms.com/knowledge/program/jsp-java/2013/0130/20935.html,本人对原文进行了一部分加工。</span>
在讲之前,一些基本知识是应该具备的:
1、如果一个类中没有定义构造器,编译器在编译时会自动加上默认无参构造器:
public ClassName() {}2、this 和 super 的区别。
3、每个类直接或间接是Object的子类,Object只有一个无参构造方法。
4、编译器会在每个构造方法的第一行隐式添加父类的默认无参构造器,即添加super()。
新手容易犯的错误:
class Employee extends Object { public Employee(int id) { } } class Teacher extends Employee { public Teacher() { } }以上代码会产生编译错误:
Implicit super constructor Employee() is undefined. Must explicitly invoke another constructor
因为父类定义了一个带参数的构造器,因此编译器不会添加默认无参构造方法,但是因为在子类的构造器中没有显式调用父类的某个构造方法,因此编译器会自动添加super()方法,
但是父类中不存在默认无参构造方法,因此会提示默认无参构造方法未定义错误。
修改后的代码:
class Employee { public Employee(int id) { } } class Teacher extends Employee { public Teacher() { super(10); } }这样,在子类的构造器中显式调用了父类的某个构造器,所以编译器不会自动添加super()方法。
另外,非常值得一提的是,super()...之类的构造方法使用必须在第一行。
class Employee { public Employee(int id) { } } class Teacher extends Employee { public Teacher() { statement;//语句 super(10); } }以上就是错误的,可以认为,Java首先查看构造函数第一行,若不是super(...);则默认应用super();
构造器的访问修饰符:
一般可以用public,protected,default和private修饰,但是对于private,子类是无法调用该类构造器的。
多层次调用父类构造方法:
假设我们有这样一个层次结构:
Object->Employee->Teacher->Professor
class Employee { public Employee() { System.out.println("Employee constructor called"); } } class Teacher extends Employee { public Teacher() { System.out.println("Teacher constructor called"); } } class Professor extends Teacher { public Professor() { System.out.println("Professor constructor called"); } } public class Test { public static void main(String args[]) { Employee p = new Professor(); } }打印结果:
Employee constructor called
Teacher constructor called
Professor constructor called
在创建Professor对象时(new Professor()),首先会找到该类的无参构造方法,然后首先调用super()方法,调用Teacher类的无参构造方法,接着再调用 Employee的无参构造方法,最后再调用Object的无参构造方法。最后再打印出信息。
相关文章推荐
- Java中子类调用父类构造方法的问题分析
- java中子类与父类构造方法的问题
- Java里子类调用父类构造方法问题
- Java里子类调用父类构造方法问题
- java中关于子类实例化时调用父类无参构造方法的问题
- Java子类继承父类,构造方法的执行顺序问题
- Java里子类调用父类构造方法问题
- Java里子类调用父类构造方法问题
- java中子类继承父类自动调用父类无参构造方法的问题
- [转]Java中子类调用父类构造方法的问题分析
- Java子类调用父类的有参和无参的构造方法
- java中 静态成员、实例成员、构造方法在子类和父类中的执行顺序
- 关于java中子类,父类中,静态代码块: staic{},动态代码块:{},构造方法,类属性,对象属性等执行顺序做个总结:
- 黑马程序员--java中父类和子类都有构造方法时,子类对象的初始化过程
- java中子类调用父类的构造方法
- Java中子类与父类的构造方法的调用关系
- java方法重写的时候,一个调用父类还是子类方法的问题
- Java中静态代码块,非静态代码块,以及父类与子类的构造方法的之间调用顺序
- java 子类重写父类的方法应注意的问题
- java创建一个子类对象是会调用父类的构造方法会不会创建父类