class Super
{
int i=0;
public Super(String a)
{
System.out.println("A");
i=1;
}
public Super()
{
System.out.println("B");//4、打印B
i+=2;//5、对i进行赋值运算。 此时的i为父类中的i,即i=i+2=0+2=2;
}
}
class Demo extends Super
{
public Demo(String a)
{
//super(); 3、隐式调用父类无参构造函数。
System.out.println("C");//6、打印C
i=5;//7、对i赋值,i=5;
}
public static void main(String[] args)
{
int i = 4; //1、对i赋值。
Super d = new Demo("A");//2、调用构造函数。
System.out.println(d.i);//8、打印i,此时i为5.
}
}
如果去掉第七步 i=5 的话i的值为2.作者: 孙旌棋 时间: 2014-5-3 12:01
这里, 第17行, 这里会有一句super(); 调用父类的构造方法, 如果你不写, 由虚拟机加载, 所以第一个结果是 B, 因为调用了父类的构造方法
第18行, 程序执行这一句, 所以第二个结果是C
第19行, 这里你把5赋值给 i ,不管以前 i 是多少, 你给 i 赋值为5, 那答案自然就是 5 的啊, 如果你把这句注释掉的话, 答案就是 2 的哦
第24行, 这句没有意义, 因为没有被操作
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) {
// super(); 调用父类的构造方法, 如果你不写, 由虚拟机加载, 所以第一个结果是 B
System.out.println("C");// 程序执行这一句, 所以第二个结果是C
i = 5;// 这里你把5赋值给 i ,不管以前 i 是多少, 你给 i 赋值为5, 那答案自然就是 5 的啊, 如果你把这句注释掉的话,
// 答案就是 2 的哦
}
public static void main(String[] args) {
int i = 4;// 这句没有意义, 因为没有被操作
// 创建Demo实例对象
Super d = new Demo("A");
System.out.println(d.i);
}
}// 结过怎么不是2是5?【正解】B C 5
复制代码
作者: 爱翚 时间: 2014-5-3 12:03
class Super {
int i = 0;
public Super(String a) {
System.out.println("A");
i = 1;
}
public Super() {
System.out.println("B");
i += 2;
System.out.println("第一次修改时对象所属的类:="+(this instanceof Demo));
System.out.println("第一次修改结果:="+i);
}
}
public class Demo extends Super {
public Demo(String a) {
System.out.println("C");
i = 5;
System.out.println("第二次修改时对象所属的类:="+(this instanceof Demo));
System.out.println("第二次修改结果:="+i);
}
public static void main(String[] args) {
//下面这个局部变量没有使用到
int i = 4;
/*
* 创建Demo类的对象,调用Demo(String a)构造函数
* 1、由于有继承关系,所以先调用了父类Super的无参构造函数Super(),此为第一步打印,所以先输出"B"
* 输出"B"后,将父类的成员变量i的值由0修改为2。
* 但成员变量i所属的对象引用是刚刚对类Demo进行对象实例化缠身的d
* 2、父类构造函数执行完之后开始执行子类构造函数Demo(String a),此为第二步打印,所以其次输出"C"
* 由于Demo类继承了Super类,而Demo类自己又没有成员变量,所以Demo类使用的成员变量都是父类的。
* 输出"B"后,将父类的成员变量i的值由2修改为"5"。
* 但原理同上边是一致的,这个i仍然是对象d的i
*/
Super d = new Demo("A");
//基于上边的第2点,此处数据的结果为"5"
System.out.println(d.i);
}
}作者: 邵景伦 时间: 2014-5-3 16:05
class Super
{
int i=0;
public Super(String a)
{
System.out.println("A");
i=1;
}
public Super()
{
System.out.println("B");
i+=2;//3.对i进行赋值运算。 此时的i为父类中的i,即i=i+2=0+2=2;
}
}
class Demo extends Super
{ // super();2.先调用了父类Super的无参构造函数Super(),输出B,
public Demo(String a)//执行子类构造函数Demo(String a),输出C
{
System.out.println("C");
i=5;//对i赋值,i=5;
}
public static void main(String[] args)
{
int i = 4;
Super d = new Demo("A");//1.创建Demo类的对象,调用Demo(String a)构造函数
System.out.println(d.i);
}
}//首先弄懂创建对象时构造函数初始化的先后顺序。作者: 依然精彩 时间: 2014-5-3 16:38 本帖最后由 依然精彩 于 2014-5-3 16:41 编辑