How to Use clone- -| 回首页 | 2005年索引 | - -你尽力了吗?(转)

Java的构造函数- -

TagJava    构造函数                                          


package ector;
class CtorBase {
    int i;
    CtorBase(int k) {
        i = k;
    }
    CtorBase() {
        System.out.println("Base Created");
    }
}

public class CtorTest extends CtorBase {
public static void main(String args[]) {
        CtorBase a = new CtorBase(10);
        System.out.println(a.i);
    }
}

如果把基类的那个无参的构造函数注释掉,这时程序不能通过编译,这是为什么?程序里面并没有调用无参的构造函数,那一行也不会被打印出来。
这是从这里的代码改过来的:http://bobcat.webappcabaret.net/javachina/faq/01_b.htm#construct_Q07。
解释是说CtorTest类中没有定义构造函数。编译器会为程序提供一个。提供的过程中,会去调用基类的无参构造函数。这时基类也没有无参的构造函数。所以就出错了。
但整个程序中并没有创建CtorTest 类的对象,所以这里看起来不明白。
除非有如下的准则:
Rule1:编译器总是确保类至少有一个构造函数。
Rule2:如果类没有构造函数,编译器会为它构造一个无参的构造函数。在这过程中,编译器会去调用其父类的无参构造函数,如果其父类没有默认(无参)的构造函数,则构造过程出错,编译不能通过。
Rule3:如果类已经有了一个构造函数,不管它是有参函数还是无参函数,编译器都不会再为它构造一个构造函数。

solution #1, define a no-parameter constructor for A


class A {
int i;
A() {
}
A(int k) {
i = k;
}
}
class B extends A {
public static void main(String args[]) {
A a = new A(10);
System.out.println(a.i);
}
}



solution #2, define a with-parameter constructor for B, which in turn calls with-parameter constructor for A


class A {
int i;
A(int k) {
i = k;
}
}
class B extends A {
B(int k) {
super(k);
}
public static void main(String args[]) {
A a = new A(10);
System.out.println(a.i);
}
}



solution #3, define a no-parameter constructor for B, which in turn calls with-parameter constructor for A


class A {
int i;
A(int k) {
i = k;
}
}
class B extends A {
B() {
super(56);
}
public static void main(String args[]) {
A a = new A(10);
System.out.println(a.i);
}
}
	这里要强调一下。
	注意看代码中,并没有创建CtorTest类的对象。

因为直觉上有这么一个误解,构造函数是在函数的构造过程中调用的。也就误以为编译器会在构造某类对象的时候,去做那几条规则的检查,并构造相应的构造函数。

但是实际上不是!构造函数是一个类特性,这是跟类相关的。只要编译某个类的代码,这个构造函数就会生成。

所以,既使没有创建CtorTest类的对象,也会去生成它的构造函数。而不是在执行时按需要生成!

- 作者: songix 访问统计: 2005年10月2日, 星期日 17:28 加入博采

Trackback

你可以使用这个链接引用该篇文章 http://publishblog.blogchina.com/blog/tb.b?diaryID=3102722

博客手拉手

[2005-08-28 00:00:00.0]    构造函数小结

[2005-08-30 00:00:00.0]    构造函数分配内存失败时。。。

[2005-09-22 13:48:24.0]    java 异常处理

[2005-09-22 13:43:40.0]    Java中的易混问题收集

[2005-09-22 13:46:58.0]    Java中的易混问题收集

回复

评论内容: