标题: 毕老师讲的练习题,看不明白 虚心求解。谢谢! [打印本页] 作者: 刘宁 时间: 2012-3-17 22:39 标题: 毕老师讲的练习题,看不明白 虚心求解。谢谢! class Super
{
int i = 0;
public Super(String a)
{
System.out.println("A");
i = 1;
}
public Super()
{
System.out.println("B");
i+=2;
}
}
class Demo extends Super
{
public Demo(String a)
{
System.out.print("c");
i=5;
}
public static void main(String[] args)
{
int i = 4;
Super d = new Demo("A");
System.out.println(d.i);
}
}
疑问1: 这道题的结果是什么?
疑问2:main函数中的 int i = 4 是不是存在地方区,为什么子类继承了int i = 0而没有用到 int i =
5?
疑问3:最后的d.i是什么意思? 作者: 魏群 时间: 2012-3-17 22:53
1: 结果是
B
c5
2:main中的int i=4 只在main方法里有效属于main方法。
3:d.i是子类重父类继承的属性。由于 i 没有被访问修饰符private修饰 子类可以直接使用作为本类的属性。
Super d = new Demo("A");创建一个子类对象,创建子类对象时会先创建父类对象所以先执行super类的构造器输出 System.out.println("B");然后在执行子类的构造器System.out.print("c");并把继承的 i 的值=5, System.out.println(d.i);输出的时候就是5了。作者: 冯林 时间: 2012-3-17 22:59
结果是 B c 5
在对子类对象进行初始化时,父类的构造函数也会运行,
那是因为子类的构造函数默认第一行有一条隐式的语句 super();
super():会访问父类中空参数的构造函数。而且子类中所有的构造函数默认第一行都是super();
1、答案是:
B
c5
2、mian方法中的i存在于堆内存,方法区存放的是静态变量和方法代码。
3、实际执行过程中mian方法里定义的int i = 4属于局部变量,而d.i 调用的是能作为d的成员变量使用的 i ,即不是定义在方法的语句块里的,而是定义在class语句块里的变量,本例里面也就是从Super类继承的 i
最后分析一下语句的执行过程,
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
a、首先是mian方法执行 Super d = new Demo("A");
/*即调用Demo的Demo(String a){}构造函数来产生对象。而子类构造函数执行时会首先执行一句super();这里调用的是调用父类的空参数构造函数*/
b、即执行了 Super(){ System.out.println("B"); i+=2; }
/*也就是在控制台上打印了B ,同时 d 在建立对象的时候也继承了Super类的 i,初始值为0,在Super()执行后 i 经运算改为 2 。
至此,Demo(String a)的第一句的super();执行完毕*/