Java基础问题

我哭了谁来疼 2012-09-28 11:00:12
父类:
public class FatherCalss {

public FatherCalss(){
System.out.println("FatherCalss Create");
}
}
子类:继承了父类

public class ChildClass extends FatherCalss {

public ChildClass(){
System.out.println("ChildClass Create");
}
}
答案是:
FatherCalss Create
FatherCalss Create
ChildClass Create

问题:为什么父类的FatherCalss Create打印出了两次
...全文
329 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
Mourinho 2012-10-01
  • 打赏
  • 举报
回复
LZ去看看类的初始化过程吧
hero_top 2012-10-01
  • 打赏
  • 举报
回复
你new FathCslss时打印一次,newChildClass时实现父类的方法,在实现子类的,所以由2次
zcmbuer 2012-10-01
  • 打赏
  • 举报
回复
new父类时一次,子类继承了父类,故new子类时还有一次
Qw_Yx 2012-10-01
  • 打赏
  • 举报
回复
ChildClass cc=new ChildClass(); 会调用父类的无参构造方法
小气包yuzhi 2012-09-30
  • 打赏
  • 举报
回复
因为创建对象new的时候默认会把构造函数走一边;继承关系表示儿子有的东西他有,父亲有的东西儿子也拥有,所以new的时候就把两个构造函数走了一遍了;
zhaoming262350 2012-09-30
  • 打赏
  • 举报
回复
new创建对象子类的时,new调用默认的构造方法(),而在调用构造方法时,因为子类是继承父类的,因此会先调用父类的默认的构造方法,然后在调用子类的默认构造方法(),这样就先回打印出一个父类的输出,在打印出一个子类的输出,父类执行时,也会打印出父类的又一个输出
smail歇歇 2012-09-29
  • 打赏
  • 举报
回复
为什么 都是public class

好像是直接class吧

  • 打赏
  • 举报
回复
在创建子类对象时必须先创建父类的对象
a8509190 2012-09-29
  • 打赏
  • 举报
回复
你new FathCslss时打印一次,newChildClass时实现父类的方法,在实现子类的,所以由2次
pingchangxinli 2012-09-29
  • 打赏
  • 举报
回复
看到你的main方法,
1.首先调用父类的构造方法,打印出东西,无可厚非;
2.其次调用子类的构造方法,子类构造方法中,首先默认要做的事为: super(),即调用父类的无参构造方法,然后再打印出你子类的内容。
package extend;

public class ChildClass extends FatherClass{

ChildClass(){
System.out.println("子类无参构造方法");
}
ChildClass(int i){
System.out.println("子类有参构造方法,参数i:"+this.i);
}
/**
* @param args
*/
public static void main(String[] args) {
new ChildClass();
new ChildClass(1);
}

}

class FatherClass{
int i;
FatherClass(){
System.out.println("父类无参构造");
}
FatherClass(int i){
System.out.println("父类有参构造方法,参数i:"+i);
}
}
Gary_Cui_1st 2012-09-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

你new FathCslss时打印一次,newChildClass时实现父类的方法,在实现子类的,所以由2次
[/Quote]

这个《Thinking in Java》里有解说的,JAVA的构造是上溯构造

当你new Child()的时候,是先调用父类的构造,再调用子类的构造
ycagml 2012-09-29
  • 打赏
  • 举报
回复
子类继承父类的时候,new的时候,先调用父类的无参的构造方法,然后执行继承了的父类的无耻的构造方法!再执行子类的,所以如果你new的话,这个FatherCalss Create则会执行两次。。。 楼主,你再去试试静态代码块和无参的构造方法,看谁先执行吧!这个自己试了才会记得,面试题经常有。
zly361814478 2012-09-28
  • 打赏
  • 举报
回复
建议 继承这一块 楼主该多加复习。 当执行 FatherCalss fc=new FatherCalss();的时候 会先打印一行(FatherCalss Create) 再当你执行 ChildClass cc=new ChildClass();的时候
因为ChildClass 是FatherClass 的子类, 子类在调用构造方法的时候,会先去调用父类的无参数的构造方法,这个时候就会再打印一行FatherCalss Create 最后实例化自己的对象时,打印ChildClass Create
halfsuccess 2012-09-28
  • 打赏
  • 举报
回复
你好,楼主,你可以这样测试:
class FatherCalss {

public FatherCalss() {
System.out.println("先调用父类的构造方法");
System.out.println("FatherCalss Create");
}
}

class ChildClass extends FatherCalss{

public ChildClass() {
System.out.println("再调用子类的构造方法");
System.out.println("ChildClass Create");
}
}

public class Hello {
public static void main(String[] args) {
FatherCalss fc = new FatherCalss();
ChildClass cc = new ChildClass();
}
}

运行结果:

先调用父类的构造方法
FatherCalss Create
先调用父类的构造方法
FatherCalss Create
再调用子类的构造方法
ChildClass Create

有运行结果可以看出,调用了两次父类的构造方法,说明在new父类对象的时候调用了一次父类的构造方法,在new子类对象的时候,先调用了父类的构造方法,再调用自身的构造方法!
wonkju 2012-09-28
  • 打赏
  • 举报
回复
大哥,你的“FatherCalss fc=new FatherCalss();
”已经打印了“FatherCalss Create
”,
还有的是你创建子类对象的时候,默认先调用父类的构造器,(如果你没有显示设置有参数的构造函数)
见习老狼 2012-09-28
  • 打赏
  • 举报
回复
你new FathCslss时打印一次,newChildClass时实现父类的方法,在实现子类的,所以由2次
我哭了谁来疼 2012-09-28
  • 打赏
  • 举报
回复
public class Mainmain {
public static void main(String[] args) {
FatherCalss fc=new FatherCalss();
ChildClass cc=new ChildClass();
}
}

62,621

社区成员

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

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