作业帮 > 综合 > 作业

java这个程序为什么会等于0

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/07/17 11:46:59
java这个程序为什么会等于0
class B {
private int num = 10;
public void draw()
{
System.out.println("B.draw(),num"+num);
}
public B()
{
System.out.println("B constructor");
draw();
}
}
class A extends B{
/**
* @param args
*/
private int num = 1;
public void draw()
{
System.out.println("A.draw(),num="+num);
}
public A(int num)
{
this.num = num;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
A a = new A(5);
}
}
结果为什么会等于0
首先,等于0是对的:
仔细看下过程:A继承了B,A也覆盖了B的draw()方法.
根据java继承原理,A a = new A(5);
new出一个对象A,那么由于A继承了B,所以先要去B执行其B的构造:
public B()
{
System.out.println("B constructor");
draw();
}
控制台首先喷出“B constructor”.
当继续执行 draw();方法时,发现已经被子类A覆盖了,所以转入子类A的方法draw();
这时由于A里定义的是private int num = 1; 私有变量,而B中的也是私有变量private int num = 10;
所以可以说这两个名字同为num的变量是不相干的.
这样就可以理解了:
一开始子类A中的num就没有被初始化,而先执行了A中的draw方法.
所以只是输出的就是num=0(java中默认没有初始化的int值为0);
但是随后B的构造方法执行完以后将会继续执行A的构造.
这时A中的num将会被赋值为5!
你可以在A的构造中加一个输出验证下:
public A(int num)
{
this.num2 = num;
System.out.println("num="+num);
}
输出一定时num=5;
这么写你是否能理解.