黑马程序员技术交流社区
标题:
求问这代码的执行初始化问题,弄不明白!
[打印本页]
作者:
聂益飞
时间:
2013-3-20 16:55
标题:
求问这代码的执行初始化问题,弄不明白!
本帖最后由 聂益飞 于 2013-3-20 20:38 编辑
class Collection_Test
{
public static void main(String[] args)
{
Person p=new Son_1("234");//1
Son_1 son=new Son_1("234");//2
System.out.println(p.get());//3
System.out.println(p.name);//4
System.out.println(son.get());//5
//如果输出的结果是null我就理解了,但是3,4,5结果均为
//234,我理解的多态是,1中的name是从Person中继承过来的
//子类并没有name,那p应该要向上转型才对,p.name就
//跟p.get()是一个性质的,此时我操作的是子类继承过来的
//name,父类的name并没有被赋值啊。还是说子类继承了name
//后,并对其赋值,但终究操作的都是父类的name,求解。。。。。。。
//此时输出的p.name是不是父类的name??(向上转型)
Person p3=new Person();
System.out.println(p3.name);
//此时输出为123,不理解,
//子类初始化顺序为
//隐式初始化--显示初始化--代码块初始化--构造函数初始化
//一层覆盖一层,最终执行到new Person()时,name="123"被
//null覆盖才对啊。。。。。。。。求解。。。
}
}
class Person
{
String name="123";
int age;
Person(){}
public String get()
{
return name;
}
}
class Son_1 extends Person
{
Son_1()
{
super();
}
Son_1(String name)
{
this.name=name;
}
}
作者:
聂益飞
时间:
2013-3-20 18:13
class Collection_Test
{
public static void main(String[] args)
{
Person p=new Son_1("234");//1
Son_1 son=new Son_1("234");//2
System.out.println(p.get());//3
System.out.println(p.name);//4
System.out.println(son.get());//5
//如果输出的结果是null我就理解了,但是3,4,5结果均为
//234,我理解的多态是,1中的name是从Person中继承过来的
//子类并没有name,那p应该要向上转型才对,p.name就
//跟p.get()是一个性质的,此时我操作的是子类继承过来的
//name,父类的name并没有被赋值啊。还是说子类继承了name
//后,并对其赋值,但终究操作的都是父类的name,求解。。。。。。。
//此时输出的p.name是不是父类的name??(向上转型)
Person p3=new Person();
System.out.println(p3.name);
//此时输出为123,不理解,
//子类初始化顺序为
//隐式初始化--显示初始化--代码块初始化--构造函数初始化
//一层覆盖一层,最终执行到new Person()时,name="123"被
//null覆盖才对啊。。。。。。。。求解。。。
}
}
class Person
{
String name="123";
int age;
Person(){}
public String get()
{
return name;
}
}
class Son_1 extends Person
{
Son_1()
{
super();
}
Son_1(String name)
{
this.name=name;
}
}
复制代码
是这样子么?????????????
作者:
michaelchen
时间:
2013-3-20 18:14
class Collection_Test
{
public static void main(String[] args)
{
Person p=new Son_1("234");//1 父类引用指向子类对象,调用的是带参数的构造函数,p的成员变量name发生改变,由原来的123变成234
Son_1 son=new Son_1("234");//2 调用的还是带参数的构造函数
System.out.println(p.get());//3 p调用person类的get方法,其实传进去的实参就是234
System.out.println(p.name);//4 p的成员变量name发生改变,由原来的123变成234
System.out.println(son.get());//5 调用从person类继承来的get方法,返回的是构造函数里传入的参数
Person p3=new Person();
System.out.println(p3.name);//重新创建对象,直接返回成员变量的值
}
}
class Person
{
String name="123";
int age;
Person(){}
public String get()
{
return name;
}
}
class Son_1 extends Person
{
Son_1()
{
super();
}
Son_1(String name)
{
this.name=name;
}
}
复制代码
希望能帮到楼主
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2