黑马程序员技术交流社区
标题:
多态中的对象创建是怎样完成的
[打印本页]
作者:
谢振宣
时间:
2014-4-28 02:06
标题:
多态中的对象创建是怎样完成的
本帖最后由 谢振宣 于 2014-4-28 11:25 编辑
正在看基础视频,碰到一个小问题不太明白,哪位帮忙解决一下
毕老师的第10天的面向对象练习中的第6题
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.println("C");
i=5;
}
public static void main(String[] args)
{
int i=4;
Super d=new Demo("A");
System.out.println(d.i);
}
}
复制代码
输出为:B C 5
把int i=4;定义为成员变量后,输出变了
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
{
int i=4;//把int i=4;定义为成员变量后,输出变了
public Demo(String a)
{
System.out.println("C");
i=5;
}
public static void main(String[] args)
{
Super d=new Demo("A");
System.out.println(d.i);
}
}
复制代码
此时输出为:B C 2
多态中,对于成员变量无论编译还是运行都看左边。
第一次,在子类的构造函数中可以修改,已经赋值给子类对象的,父类的成员变量的值
第二次,在子类的构造函数中却不可以修改,已经赋值给子类对象的,父类的成员变量的值
谁能解释一下?
作者:
peku
时间:
2014-4-28 08:46
第一次
class Super
{
int i=0;
public Super(String a)
{
System.out.println("A");
i=1;
}
public Super()
{
System.out.println("B");
i+=2;//[color=Red]三.将成员变量 i 赋值2,i=2[/color]
}
}
class Demo extends Super
{
[color=Red]//一.由于子类中没有定义变量 i ,所以建立子类对象直接继承父类的 i ,此时堆内存中只有一个 i =0[/color]
public Demo(String a)
{ //二.super()
System.out.println("C");
i=5;//[color=Red]四.将成员变量 i 赋值5,[/color]
}
public static void main(String[] args)
{
int i=4;[color=Red]//这个 i 不是成员变量,是局部变量 [/color]
Super d=new Demo("A");
System.out.println(d.i);[color=Red]//五.打印成员变量 i =5[/color]
}
}
复制代码
第二次
class Super
{
int i=0;//[color=Red]三.在堆内存中定义另一个 i (父),此时对象中有两个 i [/color]
public Super(String a)
{
System.out.println("A");
i=1;
}
public Super()
{
System.out.println("B");
i+=2;//[color=Red]四.将i (父)赋值等于2[/color]
}
}
class Demo extends Super
{
int i=4;//[color=Red]一.此时子类在堆内存中定义了 i (子)[/color]
public Demo(String a)
{ //[color=Red]二.super(),然后赋值 i (子)=4[/color]
System.out.println("C");
i=5;//[color=Red]五. i (子)赋值为5[/color]
}
public static void main(String[] args)
{
Super d=new Demo("A");
System.out.println(d.i);[color=Red]//六.由于是父类引用指向子类对象,d.i指向对象中两个 i 中的 i (父)=2[/color]
}
}
复制代码
毕老师有一个视频上讲到了当父类中有变量 i 子类中没有再重新定义的话,新建子类对象时堆内存中只有一个这个变量 i ,所以无论this.i还是super.i都是指向这个 i
作者:
谢振宣
时间:
2014-4-28 11:21
peku 发表于 2014-4-28 08:46
第一次
第二次
有些明白了,就是说子类的构造函数对成员变量的初始化,是有锁定性的。在多态中,如果只有父类有,就锁定为父类的成员变量;子父类中都有,就锁定为自己的成员变量,这时的两个同名变量同时存在。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2