Java的默认构造函数调用

// 注意,这里不能是 public class OOO,否则编译无法通过,需把文件命名成 OOO.java
class OOO {
    // 注意:如果不定义OOO(),那么Shapes(int i)编译出错    OOO() {
        System.out.println(" Construtor() in OOO"); 
    }
    OOO(int i) {
        // this(); // 可以这样调用!
        System.out.println(" Construtor(i) in OOO"); 
    }
}

public class Shapes extends OOO{

    Shapes() {
        super(200); // 必须放在第一行,否则出错。
        // 调用super(200)以后,不再默认调用super()了,否则会自动调用super() // 原因:构造函数通常用于完成一些初始化的工作,比方说类B继承了类A,类A中有一个name属性,在类A的构造函数中name 被初始化,如果在类B构造函数中我们没有先调用父类A的构造函数而先使用了未初始化的资源name,将不能得到我们期望的结果,所以人们就会有了这种约定。
        System.out.println(" Construtor() in Shapes"); 
    }

    Shapes(int i) {
        // 还是会默认调用super()
        System.out.println(" Construtor(int) in Shapes"); 
    }

    public static void main(String[] args) {
        // 例子1:
        System.out.println("==================ex1==================");
        Shapes s1 = new Shapes();

        // 例子2:
        System.out.println("==================ex2==================");
        Shapes s2 = new Shapes(100);
    }
} 

另外有一篇:java构造函数的执行顺序

http://www.blogjava.net/rocket/archive/2008/05/27/203165.html

若创建一个没有构造函数的类,则编译程序会帮我们自动创建一个默认构造函数。
如果已经定义了一个构造函数(无论是否有自变量),编译程序都不会帮我们自动合成一个:
class Bush {
Bush(int i) {}
Bush(double d) {}
}

现在,假若使用下述代码:
new Bush();
编译程序就会报告自己找不到一个相符的构造函数。

你可能感兴趣的:(java)