关于继承的构造方法的问题,高手指点一下啊。

gengliangyu 2008-10-14 10:10:53
class Shape{
public Shape(int i){
System.out.println("This is Shape" + i);
}
}

public class Circle extends Shape {
static Shape s1 = new Shape(1);
Shape s2 = new Shape(3);
Circle(int i) {
//System.out.println(555);
super(i);
System.out.println("This is Circle" + i);
}
public static void main(String args[]) {
Circle c1 = new Circle(2);
}
}
不明白这段代码的执行顺序,请高手指点一下,还有就是为什么我把System.out.println(555);这段代码上的注释去掉,代码就会报错,编译都过不去。
再有就是我把super(i);这行代码注释掉,代码也会报错,编译不过去。
麻烦哪位高手帮忙指点一下啊。我在此先谢过了。
...全文
107 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
以梦为马 2008-10-14
  • 打赏
  • 举报
回复
Circle c1 = new Circle(2); 执行步骤如下:
1、进入Circle(int i){...}
2、进入Shape(int i){...}
3、调用Object(){...}
4、返回到Shape(int i){...}
5、返回到Circle(int i){...}


System.out.println(555);这段代码上的注释去掉,报错,因为:
Circle(int i)中第一句未显式调用“super();”或“super(i);”时,系统首先会默认调用父类的无参数构造方法“super();”,此时Circle(int i)中即使第一句你写“System.out.println(555);”,也会被当作是在调用“super();”之后;
但你在写了“System.out.println(555);”之后又显式调用父类的带参数构造方法“super(i);”,当然会报错,因为调用父类的构造方法2次就搅乱了子类对象的初始化步骤。
这就是所谓“super();”或“super(...);”必须是构造方法中的第一句的原因,与此相关的话题还有:“this();”或“this(...);”必须是构造方法中的第一句;构造方法中有“super();”或“super(...);”就不能同时有this();”或“this(...);”。(不仅要知道结论,更重要的是要理解原因。)


把super(i);这行代码注释掉,代码也会报错,前面已经部分讲到了:
Circle(int i)中第一句未显式调用“super();”或“super(i);”时,系统首先会默认调用父类的无参数构造方法“super();”;
而class Shape中,若没有写任何构造方法,系统会默认添加一个无参数构造方法,如你这里的Shape(){};
但若你写了一个带参数的构造方法,如你这里的Shape(int i){},而没写无参数构造方法的话,系统不再会给你添加无参数构造方法;
回到前面,系统默认调用父类的无参数构造方法“super();”时,找不到Shape(){}。

over
xujiaxiang 2008-10-14
  • 打赏
  • 举报
回复
再有就是我把super(i);这行代码注释掉,代码也会报错,编译不过去。
麻烦哪位高手帮忙指点一下啊。我在此先谢过了

你在父类加一个public Shape(){
System.out.println("默认构造器");
}

这样就不会报错了。因为你父类没有默认构造器,有自定义构造器,所以继承的子类必须调用父类的构造器super(i);
ZangXT 2008-10-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 gengliangyu 的回复:]
我想问一下,你们都执行这段程序了吗?知道结果是什么吗??
希望大家执行一下程序看看然后再说可以吗? 我为什么没有贴结果出来,就是因为这个,如果我把结果贴出来了,
那么肯定会有一大堆人直接看着结果给我说程序怎么走,还不知道对不对。
给别人解决问题的时候我希望大家都好好考虑,不要自己都不知道对不对完了上来就说。
[/Quote]
gengliangyu 2008-10-14
  • 打赏
  • 举报
回复
我想问一下,你们都执行这段程序了吗?知道结果是什么吗??
希望大家执行一下程序看看然后再说可以吗? 我为什么没有贴结果出来,就是因为这个,如果我把结果贴出来了,
那么肯定会有一大堆人直接看着结果给我说程序怎么走,还不知道对不对。
给别人解决问题的时候我希望大家都好好考虑,不要自己都不知道对不对完了上来就说。
gongyali2005 2008-10-14
  • 打赏
  • 举报
回复
如果父类写了带参数的构造方法,类就不能提供不带参数的默认的构造方法了.
子类就必须提供相同的构造方法.
SUPER(I)必须写在第一行
ZangXT 2008-10-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 gengliangyu 的回复:]
注释去掉报错的那个问题我已经明白了,这个先不用说了。

大家执行一下这个程序,帮忙看一下执行顺序可以吗? 我不明白执行顺序为什么是这样的。
[/Quote]
在ide里 让程序单步的走一下,你自己就弄明白了。
gengliangyu 2008-10-14
  • 打赏
  • 举报
回复
注释去掉报错的那个问题我已经明白了,这个先不用说了。

大家执行一下这个程序,帮忙看一下执行顺序可以吗? 我不明白执行顺序为什么是这样的。
richard_2010 2008-10-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lihan6415151528 的回复:]
System.out.println(555);

这句注释报错,不可能吧
[/Quote]
见1楼解释。
richard_2010 2008-10-14
  • 打赏
  • 举报
回复
再有就是我把super(i);这行代码注释掉,代码也会报错,编译不过去。
-----------------------
如果你不写super(i),编译器会自动给你加上super();这样调用的是父类中没有参数的构造方法,而你父类里面没有不带参数的构造方法,所以会报错。
再者,如果你父类里面不自己写构造方法,系统会默认加上没有参数的构造方法,如果写了,系统则不加。
lihan6415151528 2008-10-14
  • 打赏
  • 举报
回复
System.out.println(555);

这句注释报错,不可能吧
ZangXT 2008-10-14
  • 打赏
  • 举报
回复
super();必须写在构造方法的第一句。不允许你前面写别的代码。
构造方法中需要先调用父类的构造方法,如果你自己不直接写super(),编译器会给你自动加上。

62,628

社区成员

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

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