类继承的基础问题

bluemax 2004-11-30 10:34:40
class a
{
public a()
{System.out.println("a");
}
}
public class b extends a
{ public b()
{System.out.println("b");}
public static void main(String[] arg)
{a A=new a();
b B=new b();
}
}
请问在生成B的时候,编译内部是怎么回事情。为什么会出现程序结果是 a a b
...全文
163 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
xtaotao 2004-12-07
  • 打赏
  • 举报
回复
To: 楼上, 子类构造方法一定要调用父类构造方法的!
xtaotao 2004-12-01
  • 打赏
  • 举报
回复
你的代码实际上编译时是这样的:

class a
{
public a()
{
System.out.println("a");
}
}
public class b extends a
{
public b()
{
super(); //系统会自动添加这行
System.out.println("b");
}

public static void main(String[] arg)
{
a A=new a(); // 该句调用类a的构造方法,输出 a
b B=new b(); // 该句调用类b的构造方法,其中第1句又调用了类a的构造方法,所以先输出a,再输出b
}
}
子类构造方法一定会调用父类构造方法,而且要放在子类构造方法第1句.
如果自己没有显式调用,系统会自动调用父类的无参构造方法,如果父类没有无参构造方法,会出错.
要调用父类有参构造方法,自己必须在子类构造方法第1句加上调用语句.
不徻写代码 2004-12-01
  • 打赏
  • 举报
回复
构造子类会首先调用父类的构造函数
catblue 2004-12-01
  • 打赏
  • 举报
回复
你构造子类的时候,都会首先调用父类的构造函数,在b里其实你省了super()这句话。
draco2002 2004-12-01
  • 打赏
  • 举报
回复
看一下《java虚拟机规范》吧,里面讲的很清楚
huaxin0035 2004-12-01
  • 打赏
  • 举报
回复
引用:子类构造方法一定会调用父类构造方法,而且要放在子类构造方法第1句.


子类构造方法能否不调用父类构造方法???

sylmoon 2004-12-01
  • 打赏
  • 举报
回复
你的代码实际上编译时是这样的:

class a
{
public a()
{
System.out.println("a");
}
}
public class b extends a
{
public b()
{
super(); //系统会自动添加这行
System.out.println("b");
}

public static void main(String[] arg)
{
a A=new a(); // 该句调用类a的构造方法,输出 a
b B=new b(); // 该句调用类b的构造方法,其中第1句又调用了类a的构造方法,所以先输出a,再输出b
}
}
子类构造方法一定会调用父类构造方法,而且要放在子类构造方法第1句.
如果自己没有显式调用,系统会自动调用父类的无参构造方法,如果父类没有无参构造方法,会出错.
要调用父类有参构造方法,自己必须在子类构造方法第1句加上调用语句.



good!!
bestirwiny 2004-11-30
  • 打赏
  • 举报
回复
你这里第一步先是一个a A=new a();于是就打印了一个a
接着你又b B=new b();由于b是继承a的,所以b就继承了a的方法和域,所以先会回到a调用a的方法,于是先打印了一个a,接着调用自己的方法,于是又打印了b
liuguangliang 2004-11-30
  • 打赏
  • 举报
回复
首先a A=new a();后打印一个a;
b B=new b();后首先调用父类构造方法,然后再调用子类构造方法。

62,623

社区成员

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

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