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);这行代码注释掉,代码也会报错,编译不过去。
麻烦哪位高手帮忙指点一下啊。我在此先谢过了。
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);这行代码注释掉,代码也会报错,编译不过去。
麻烦哪位高手帮忙指点一下啊。我在此先谢过了。
解决方案 »
- 来了杭州半个月 居然找不到工作
- 这个最简单的applet用appletview能显示,但在html上就显示不了了?
- 问问问,我的问题很简单
- 在jdbTable 中,如何指定view中的主键?
- 关于“TableHeader.cellBorder“
- 分析文本字符组成结构的程序
- 哪位可以讲讲编写ftp客户端的下载函数(方法)
- 为什么我的IE不能执行applet?
- 我下载java2,不知如何打开
- 寻大神求解,我的老师无力,java环境变量正确,使用JCreator出错
- 怎么用java画矩形?并且可以在后续添加直线?还有Graphics.drawPolyline(int[] a,int[] b,int n);的用法。谢谢了
- 急!!怎样用单链表或者顺序表实现 任意长整数的加减法啊
构造方法中需要先调用父类的构造方法,如果你自己不直接写super(),编译器会给你自动加上。
-----------------------
如果你不写super(i),编译器会自动给你加上super();这样调用的是父类中没有参数的构造方法,而你父类里面没有不带参数的构造方法,所以会报错。
再者,如果你父类里面不自己写构造方法,系统会默认加上没有参数的构造方法,如果写了,系统则不加。
麻烦哪位高手帮忙指点一下啊。我在此先谢过了你在父类加一个public Shape(){
System.out.println("默认构造器");
} 这样就不会报错了。因为你父类没有默认构造器,有自定义构造器,所以继承的子类必须调用父类的构造器super(i);
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