您的位置:首页 > 编程语言 > Java开发

Java默认构造函数的一些发现

2015-09-28 18:48 393 查看
程序1:

package com.org.demos;

public class Base {

public Base(){
System.out.println("this is a Base Class!");
}
}


程序2:

package com.org.demos;

public class Child extends Base {

public Child () {
System.out.println("Child Class!");
}

public Child (String str) {
// super();
System.out.println("this is another constructor!" + str);
}

public static void main(String[] args) {
Child child = new Child ();
}
}




上面的是两个很简单的程序说明了:如果继承父类的子类没有显示的调用super();子类的构造函数中仍然会自动先调用父类的无参构造函数。当然也可以自己添加有参的,如:super( int a);

如果在主函数中通过有参构造函数实例化,也会默认的先执行父类的无参构造函数。这在以后的继承是需要注意。另外补充一点,Java中不支持多继承。

程序3:

package com._09._30;

class Meal{
public Meal(){
System.out.println("Meal constructor!");
}
}

class Bread{
public Bread(){
System.out.println("Bread constructor!");
}
}

class Cheese{
public Cheese(){
System.out.println("Cheese constructor!");
}
}

class Lunch extends Meal{
public Lunch(){
System.out.println("Lunch constructor!");
}
}

public class ConstructorDemo extends Lunch{

public ConstructorDemo(){
//super();
new Bread();
new Cheese();
new Lunch();
System.out.println("ConstructorDemo constructor!");
}
public static void main(String[] args) {
new ConstructorDemo();
}

}




下面这段程序逻辑上或许看起来比上面的稍微复杂一点,其实本质上还是默认构造器的调用(子类总是会调用父类的构造器,不管程序员是否显示的使用super();)。在这个程序中,就涉及到构造器的递归调用,总是先调用基类的构造器。对于ConstructorDemo这个类,它的父类往上依次是Lunch、Meal,其中Meal是基类,因此肯定是先默认调用基类的构造器,再调用Lunch构造器,最后再依次执行ConstructorDemo的构造器中的代码。

有一种特殊情况就是当一个类没有显示的使用extends继承任何类的时候,此时该类的默认父类是Object这个超类(当然任何类的基类都是超类),此时会自动调用Object的构造器。如果有显示继承的话,就像上面的例子,并不会去调用Object的构造器。

最后想再补充一点,class A中定义了一个有参的构造器,如果class B想继承class A,则在class A这个父类中必须重新定义一个无参的构造器(任何定义了构造器的类,系统是不会再提供默认的无参构造器),否则会编译出错。原因很简单,还是上面说的这些,任何子类中的构造器都会默认的调用父类中的无参构造器。

如有误,请拍砖,相互学习!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  构造函数 java