标题: 关于多态执行的小问题 [打印本页] 作者: 安浦鑫 时间: 2012-5-27 15:11 标题: 关于多态执行的小问题 Fu f = new Zi();
A:成员变量:编译和运行都看Fu。
B:非静态方法:编译看Fu,运行看Zi。
C:静态方法:编译和运行都看Fu。
我现在知道这3条规则,但是关于这三条规则为何这样实现不了解,想知道在这三种情况下内存中都发生了什么作者: 李红飞 时间: 2012-5-27 15:58
1:
class Fu
{
int num = 5;
}
class Zi extends Fu
{
int num = 8;
}
class DuoTaiDemo4
{
public static void main(String[] args)
{
Fu f = new Zi(); 运行后,子类对象由两个 变量(一个继承,一个自定义),当父类引用调用时,先找从父类继承的变量
System.out.println(f.num); 5
Zi z = new Zi();
System.out.println(z.num); 8
}
}
在多态中,成员变量的特点:
无论编译和运行,都参考左边(引用型变量所属的类)。
内存状况: 因为在子类栈内存中有俩个同名的变量当父类引用调用时,先找从父类继承的变量
2:
class Fu
{
static void method4()
{
System.out.println("fu method_4");
}
}
class Zi extends Fu
{
static void method4()
{
System.out.println("zi method_4");
}
}
class DuoTaiDemo4
{
public static void main(String[] args)
{
Fu f = new Zi();
f.method4(); //fu method_4
Zi z = new Zi();
z.method4(); //zi method_4
}
}
(因为静态方法没有覆盖功能,静态方法不属于对象,属于类型 这里属于绑定概念,静态方法静态绑定在其所属类上(即左边) 属于编译时干的事)
而 Fu f = new Zi();
f.method1();属于动态绑定在其所属对象(new Zi())(即右边)(属于运行时干的事)上
在多态中,静态成员函数的特点:
无论编译和运行,都参考做左边。
前两个问题是一个问题:A:成员变量:编译和运行都看Fu和 B:非静态方法:编译看Fu,运行看Zi------------------------------首先你要理解多态的含义:(如果要讲多态的话估计一两天都能丢进去,多态的应用太广,太大,在这不扩展,楼主可以查看下)我在这讲我的理解:多态必须依靠继承关系,并且在“通用”情况下是由于有函数复写机制造成的。
好了,明白上面2点后,我们在来分析Fu f = new Zi();----------我们首先了解变量F到底是什么,我们把这句子分2段:Fu f;这是声明一个变量f为Fu这个类,那么我们知道了f肯定是Fu类。然后我们f=new Zi();中建立一个子类对象赋值给了f,结果是什么难??
结果是,拥有了被Zi类函数覆盖后的Fu类对象----f------。