一道Java笔试题,能详细说明下结果吗

lijin860725 2012-09-10 12:03:53
请写出下面这段代码的输出结果?
class Shape{
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){
super(i);
System.out.println("This is Circle" + i);
}

public static void main(String args[]){
Circle c1 = new Circle(2);
}
}
...全文
384 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ade子夜 2012-09-14
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

引用 9 楼 的回复:

你只需要记住:
1、静态先于非静态,静态包括静态实例变量,静态代码块;
2、父类先于子类;
3、同级的以代码书写顺序执行;
4、同类中实例变量先与构造方法;

所以最后顺序就是:
先父类的静态-子类的静态-父类实例变量-父类构造方法-子类实例变量-子类构造方法
为什么JVM会用这个顺序来初始化对象,其实想都想得明白:如果静态的东西不先初始化,我们的……
[/Quote]

很好!!!
疯狂的球球ww 2012-09-11
  • 打赏
  • 举报
回复
建议楼主看下实现继承中的构造方法 必须实现的条件 默认调用父类无参构造方法或者显示(super())调用构造方法
  • 打赏
  • 举报
回复
Shape s2 = new Shape(3);//////////////11111111
Circle(int i){
super(i);
System.out.println("This is Circle" + i); ///////////////222222222
}
1要比2先执行,同类中实例变量要比构造方法先执行;

如果实例变量没有执行,写程序的时候很多构造函数里都要调用自己类的实例变量。
zhaoming262350 2012-09-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

你只需要记住:
1、静态先于非静态,静态包括静态实例变量,静态代码块;
2、父类先于子类;
3、同级的以代码书写顺序执行;
4、同类中实例变量先与构造方法;

所以最后顺序就是:
先父类的静态-子类的静态-父类实例变量-父类构造方法-子类实例变量-子类构造方法
为什么JVM会用这个顺序来初始化对象,其实想都想得明白:如果静态的东西不先初始化,我们的静态方法就没法调用了;如果实例变……
[/Quote]
这个解释很不错
蓝蜘蛛 2012-09-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

你只需要记住:
1、静态先于非静态,静态包括静态实例变量,静态代码块;
2、父类先于子类;
3、同级的以代码书写顺序执行;
4、同类中实例变量先与构造方法;

所以最后顺序就是:
先父类的静态-子类的静态-父类实例变量-父类构造方法-子类实例变量-子类构造方法
为什么JVM会用这个顺序来初始化对象,其实想都想得明白:如果静态的东西不先初始化,我们的静态方法就没法调用了;如果实例变……
[/Quote]
9楼总结的很好了,可以结贴了
renee12321 2012-09-10
  • 打赏
  • 举报
回复
This is Shape1
This is Shape2
This is Shape3
This is Circle2

分析过程:
1、JVM在运行class时,首先会扫描一次全部的程序,静态块优先级最高,因为它们会存储在JVM的公共内存区域。
2、接着会调用构造方法,构造方法调用的顺序是,JVM会先扫描类的继承关系,然后从最顶层的构造方法向下执行。
3、执行到指定类内部时,会先处理类中定义的实例变量,然后再执行构造方法内部的代码。
所以得到上面的结果。
蓝蜘蛛 2012-09-10
  • 打赏
  • 举报
回复
如上面的写法楼主就没疑问了吧。在构造circle的时候会先调用引用shape2的构造的。的而且顺序在打印之前。
蓝蜘蛛 2012-09-10
  • 打赏
  • 举报
回复
public class Circle extends Shape {

static Shape s1 = new Shape(1);
//Shape s2 = new Shape(3);
Shape s2 = null;
Circle(int i) {
super(i);
s2 = new Shape(3);
System.out.println("This is Circle" + i);
}

public static void main(String args[]) {
Circle c1 = new Circle(2);
}

}
lijin860725 2012-09-10
  • 打赏
  • 举报
回复
还是不明白,我来捋一下,您看中间哪错了。
第一步,static Shape s1 = new Shape(1);这里调用基类的构造函数,输出This is Shape1;
第二步,依据继承关系调用构造函数。由于main函数里是 Circle c1 = new Circle(2);先调用Shape类的构造函数,输出This is Shape2;然后调用Circle类的构造函数,其构造函数是
Circle(int i){
super(i);
System.out.println("This is Circle" + i);
}
我就晕了,第一句是调用Shape类的构造函数吧?那是不是输出This is Shape 2;This is Circle 2 ?
再接着按实例, Shape s2 = new Shape(3);那就是输出This is Shape 3;
最后再执行构造方法内部的代码,又是 super(i);
System.out.println("This is Circle" + i);
不敢往下写了~~~


[Quote=引用 1 楼 的回复:]

This is Shape1
This is Shape2
This is Shape3
This is Circle2

分析过程:
1、JVM在运行class时,首先会扫描一次全部的程序,静态块优先级最高,因为它们会存储在JVM的公共内存区域。
2、接着会调用构造方法,构造方法调用的顺序是,JVM会先扫描类的继承关系,然后从最顶层的构造方法向下执行。
3、执行到指定类内部时,……
[/Quote]
lost_guy_in_scut 2012-09-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

This is Shape1
This is Shape2
This is Shape3
This is Circle2

分析过程:
1、JVM在运行class时,首先会扫描一次全部的程序,静态块优先级最高,因为它们会存储在JVM的公共内存区域。
2、接着会调用构造方法,构造方法调用的顺序是,JVM会先扫描类的继承关系,然后从最顶层的构造方法向下执行。
3、执行到指定类内部时,……
[/Quote]
正解~
老紫竹 2012-09-10
  • 打赏
  • 举报
回复
楼上加分。 静态第一,构造第二,实例第三,其它第四
蓝蜘蛛 2012-09-10
  • 打赏
  • 举报
回复
是先调用Circle的构造函数,然后执行到super(i)在调用基类的
你可以理解为super是执行基类的同名方法
你也可以重写自己的方法不调用基类的,把super去掉就好
JiinYuu 2012-09-10
  • 打赏
  • 举报
回复
你只需要记住:
1、静态先于非静态,静态包括静态实例变量,静态代码块;
2、父类先于子类;
3、同级的以代码书写顺序执行;
4、同类中实例变量先与构造方法;

所以最后顺序就是:
先父类的静态-子类的静态-父类实例变量-父类构造方法-子类实例变量-子类构造方法
为什么JVM会用这个顺序来初始化对象,其实想都想得明白:如果静态的东西不先初始化,我们的静态方法就没法调用了;如果实例变量不先初始化,我们的构造方法里如果用到了那个变量就会出错;如果父类的不先初始化,我们子类的构造方法用到了父类的东西也会出错。
所以结果就是
shape 1(子类静态)
shape 2(父类构造方法)
shape 3(子类实例变量)
circle 2(子类构造方法)
lijin860725 2012-09-10
  • 打赏
  • 举报
回复
super(i);这一句怎么用的,不是调用基类的构造函数吗?
[Quote=引用 6 楼 的回复:]

如上面的写法楼主就没疑问了吧。在构造circle的时候会先调用引用shape2的构造的。的而且顺序在打印之前。
[/Quote]

62,614

社区成员

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

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