一个很简单的 Java 问题

来源:百度知道 编辑:UC知道 时间:2024/06/20 10:11:07
class Dad
{
int i = 10;
public Dad()
{
print();
i = 20;
}

public void print()
{
System.out.println(i);
}
}

class Son extends Dad
{
int i = 30;
public Son()
{
print();
i = 40;
}

public void print()
{
System.out.println(i);
}
}

public class Test
{
public static void main(String[] args)
{
System.out.println(new Son().i);
}
}

为什么结果是0 30 40

而不是10 30 40 ??
楼下的几个答案我觉得都有一个问题要问,不知道这个是不是你们共同犯的错误:
在调用Dad 的print方法时,由于是new Son(),所以,这个print方法应该是调用Son的重写了Dad的print方法吧,(而不是好像大家说的就是调用了Dad的print方法,但是里面的i是Son的i)大家试试用单步调试试试.

回答者: cheng5546 - 魔法师 四级
的说法是错误的!
回答者 shuidao - 举人 四级
的说法是正确的

就是一个简单的继承问题,调用子类构造方法前,先调用父类的构造方法,调用父类的构造方法的时候,先做print(),里面的i是子类的i,要记得变量肯定是对象的,现在是子类的对象调用变量,那么i也就是子类的i了!然后就给父类的i赋值,然后执行子类的构造方法那就是很简单了。再给你好好标记下!
class Dad
{
int i = 10;
public Dad()
{
print(); //调用它的时候i是子类的i
i = 20; //赋值
}

public void print()
{
System.out.println(i);
}
}

class Son extends Dad
{
int i = 30; //没有什么可以讲的,不明白再提问,好好学习天天向上
public Son()
{
print();
i = 40;
}

public void print()
{
System.out.println(i);
}
}

public class Test
{
public static void main(String[] args)
{
System.out.println(new Son().i);
}
}

这个问题很简单的
new Son() 创建了一个对象 先掉用了Son的构造器
public Son()
{
print();
i = 40;
}
同时调用 print() 方法 因为Son 是Dad 的子类 而没有覆盖父类的方法 所以此时用的是父类的方法 而父