标题: 比较变态的题,好多人算错 [打印本页] 作者: 何伟 时间: 2012-12-25 21:15 标题: 比较变态的题,好多人算错 class A
{
private int i = 2;
public A()
{
fun();
}
public void fun ()
{
System.out.println(i);
}
}
class B extends A
{
private int i = 22;
public B()
{
i = 222;
}
public void fun()
{
System.out.println(i);
}
}
public class Test
{
public static void main(String[] args)
{
B b = new B();
}
}
这个代码绕的有点变态,大家说出自己的答案和运算步骤。
作者: 李培根 时间: 2012-12-25 22:24
答案应该是先输出22吧
new B的对象,B的构造函数第一句隐式的super指向父类A构造函数,子类覆盖了父类的构造函数,打印22作者: 黄锦成 时间: 2012-12-25 23:28
输出0,这个关系到class文件加载,变量初始化过程
其实B的构造函数其实是:
public B() {
super();
i = 222;
}
super();//调用父类的无参构造函数,因为A中的i是private,所以继承不了,只有B中的i,当new B()时,加载B.class文件,定义了i,为它初始化默认值为0,父类的构造函数中调用了run方法(其实是子类的run方法了),此时的i为0,所以打印0 作者: 孙辉辉 时间: 2012-12-26 16:06
黄锦成 发表于 2012-12-25 23:28
输出0,这个关系到class文件加载,变量初始化过程
其实B的构造函数其实是:
public B() {
可以看到,就算class内的i定义为public,输出也为0作者: 酸溜溜 时间: 2012-12-26 16:13
子类覆盖了父类的构造函数作者: 黑马-邢广耀 时间: 2012-12-27 18:22
class A
{
private int i = 2;//被封装
public A()
{
fun();//第二步
}
public void fun ()
{
System.out.println(i);//第三步 i被封装外部类无法看到,成员变量 int类型 默认=0
}
}
class B extends A
{
private int i = 22;//被封装,但是可以访问
public B()
{
super();//子类构造函数默认访问父类构造函数 第一步
//System.out.println(i);//输出结果是22;
i = 222;//这时i已经变化,但是没有输出语句 第四步
// System.out.println(i);//输出结果是222;
}
public void fun()
{
System.out.println(i);
}
}
class Test
{
public static void main(String[] args)
{
B b = new B();
}
}
此题结果为0作者: 何伟 时间: 2012-12-27 21:49
黑马-邢广耀 发表于 2012-12-27 18:22
class A
{
private int i = 2;//被封装