子类调用父类构造方法的问题?

maggie926 2009-06-21 02:26:02
如下关于static方法运行结果为?
public class Hello extends BaseClass {
public static void main(String[] arg) {
new Hello();
}

public final static void test() {
System.out.println("Hello");
}
}

class BaseClass {
BaseClass() {
test();
}
public static void test() {
System.out.println("BaseClass");
}
}
这个题运行的结果是baseclass。
我知道他是调用咯父类的构造函数,所以会输出baseclass,但是我在Hello{}里写了一个构造函数,他还是会先调用父类的构造函数,再调用自己再定义的构造函数,意思就是父类的构造函数和自身的构造函数都要调用,不解呀,子类是不是在没构造函数的时候,如果要用就会调用父类的?但是为什么子类自身有了构造函数,这里为什么他还要调用父类的构造函数??为什么呀??
...全文
386 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
weiluo12 2009-06-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 qiheia 的回复:]
这样理解

先是有父类,然后才有子类,父类都没有,子类如何存在呢

所以在调用构造方法的时候,是先调用父类的构造方法,在调用子类的构造方法。。。
[/Quote]
UP!
sangshusen_1988 2009-06-21
  • 打赏
  • 举报
回复
1楼正解
ZiSheng 2009-06-21
  • 打赏
  • 举报
回复
如果你的父类没有无参的构造函数,就会出错了。
ZiSheng 2009-06-21
  • 打赏
  • 举报
回复
[Quote=引用楼主 maggie926 的帖子:]
如下关于static方法运行结果为?
public class Hello extends BaseClass {
public static void main(String[] arg) {
new Hello();
}

public final static void test() {
System.out.println("Hello");
}
}

class BaseClass {
BaseClass() {
test();
}
public static void test() {
System.out.println("BaseClass");
}
}

[/Quote]
原因很简单,你并没有写子类的构造函数
会为你生成一个没有参数的默认的构造函数
public Hello(){
supper();//注意这里会自动的产生一句,调用你的父类的默认的无参的构造函数。
}
sebatinsky 2009-06-21
  • 打赏
  • 举报
回复
[Quote=引用楼主 maggie926 的帖子:]
如下关于static方法运行结果为?
public class Hello extends BaseClass {
    public static void main(String[] arg) {
        new Hello();
    }

    public final static void test() {
        System.out.println("Hello");
    }
}

class BaseClass {
    BaseClass() {
      test();
    }
    public static void test() {
        System.out.println("BaseClass…
[/Quote]

呵呵,楼上的几位大虾都说过了,我也不多说了,建议楼主设置断点来判断一下就知道运行的过程了,

这样一目了然,你设置的断点地方注意一下就OK了,这个不用多说子类父类关系,你一看就会很明白他们的关系了。而且还能够驱除你的心理上的疑惑。

希望能够通过这个手段帮助你,
linuxlsx 2009-06-21
  • 打赏
  • 举报
回复
每一次调用子类的构造函数都会调用父类的构造器的, 你应该知道super 关键字吧。 每一个子类的构造器的第一行都隐式的使用
super()来调用父类的无参构造器, 如果父类没有无参的构造器, 你自己就要手动的使用super(参数列表)来调用父类的构造器。
所以 无论什么情况下子类都会调用到父类的构造器。 否则是会报错的。

至于为什么要这么做 是为了保整对象的完整性。创建子类时, 每一次子类对象都包含了一个父类对象,这个对象和你直接使用
new关键字创建的父类对象是一样的。 所以 如果子类不调用父类的构造器是 就会导致这个隐含的父类对象 没有, 子类对象
就不完整了。

这里输出的是 "baseclass", 但是如果你的test()方法不定义为 static的话,输出的将会是 "hello". 这是因为构造器多肽的
原因。 所以在 构造器中最好只调用 private方法。
mianfeidog 2009-06-21
  • 打赏
  • 举报
回复
儿子像爸爸,要把爸爸的那些特征拿过来先。
emon123 2009-06-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 qiheia 的回复:]
这样理解

先是有父类,然后才有子类,父类都没有,子类如何存在呢

所以在调用构造方法的时候,是先调用父类的构造方法,在调用子类的构造方法。。。
[/Quote]正解!~
qiheia 2009-06-21
  • 打赏
  • 举报
回复
这样理解

先是有父类,然后才有子类,父类都没有,子类如何存在呢

所以在调用构造方法的时候,是先调用父类的构造方法,在调用子类的构造方法。。。

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧