0 0

一道高级java面试题5

public class Shape {

private int i=10;
public Shape(){
i = 20;
print();
}
public Shape(int m){

i = m;
print();

}
public void print(){
System.out.println("This shape=>"+i);
}
}

public class Circle extends Shape{

private int i = 20;

public void print(){
System.out.println("this circle=>"+i);
}
public Circle(){
this.i = 30;
print();
super.print();

}


public static void main(String[] args){
Shape shap = new Circle();


}
}

请问输出什么结果呢?
为何第一输出的是this circle=>0??实在是搞不懂。
2010年3月19日 22:33

4个答案 按时间排序 按投票排序

0 0

采纳的答案

new操作明确一点首先调用的是父类的构造方法:

引用
public Shape(){
i = 20;
print();
}

在调用print()时,print被重写,去调用Circle的print()方法。

public void print(){ //Circle
System.out.println("this circle=>"+i); 
} 

Circle 的i还没被被赋值,在加载类的时候整型变量均被赋值为0。所以输出 “this circle=>0”
'''''''''''如果你把shape里的print()方法改为private,
'''''''因为没有被重写,不存在多态。这时调用的为父类Shape中的print方法。
==========================================

2010年3月19日 22:59
0 0

代码就执行顺序是这样子的。下面用(1),(2),(3)......表示它们执行顺序
(1)private int i = 0;(Circle类)
(2)private int i = 0;(Shape类)
(3)i = 10;(Shape类)
(4)i = 20;(Shape类)
(5)print();(Circle类)(因为前面i只是被定义过,但是没有被赋值,所以打印的时候是0)
(6)i = 20;(Circle类)
(7)Circle()(Circle类)

2010年3月19日 23:54
0 0

将父类的print改为私有方法,不存在多态。

class Shape { 

private int i=10; 
public Shape(){ 
i = 20; 
print(); 
} 
public Shape(int m){ 

i = m; 
print(); 

} 
private void print(){ 
System.out.println("This shape=>"+i); 
} 
} 

public class Circle extends Shape{ 

private int i = 20; 

public void print(){ 
System.out.println("this circle=>"+i); 
} 
public Circle(){ 
this.i = 30; 
print(); 
//super.print(); 因为父类为私有的print,不能在这个类里调用。

} 


public static void main(String[] args){ 
Shape shap = new Circle(); 


} 
} 


/*****output
This shape=>20
this Circle=>30

2010年3月19日 23:07
0 0

参考 我的文章说明

http://lovewhzlq.iteye.com/admin/blogs/452636


初始化的实际过程:
1.在其他任何事物发生之前,将分配给对象的存储空间初始化成二进制的0。
2.调用基类构造器。(这个步骤会不断反复递归下去,首先是构造这种层次结构的根,然后是下一层子类,等等,直到最低层的子类)
3.按声明顺序调用成员的初始化方法。
4.调用子类的构造器主体。

2010年3月19日 22:53

相关推荐

Global site tag (gtag.js) - Google Analytics