先举个小例子引出问题吧://多态例子:
//父类
class Fu
{
int num = 3;
void print(){
System.out.println("父类");
}
}//子类
class Zi extends Fu
{
int num = 4;
void print(){
System.out.println("子类");
}
}
class DuoTaiDemo3
{
public static void main(String[] args)
{
Fu f = new Zi();
System.out.println(f.num);//输出结果:3f.print();//输出结果:子类
}
}
输出结果为什么会一个按父类输出,一个按子类输出?看完下面的解释就会明白了。^^
引用型变量:
TV yaokongqi=new TV();其中yaokongqi指的就是引用
一, 非静态成员变量的特点
①,编译时期特点
|-- 引用型变量所在的类中(即父类),没定义这个变量编译失败(父类中没有这个变量,不管子类有没有都会编译失败,因为你这时候是相当于父,父不能用子的属性)
|-- 引用型变量所在的类中,定义了这个变量编译成功
②,运行时期特点
|-- 运行时期,参考引用型变量所属的类中的结果
二,非静态成员方法的特点
①,编译时期特点
|-- 编译时期,参考引用型变量所在的类中,有没有定义这个方法,有编译成功,没有编译失败(父类必须有这个类)
②,运行时期特点
|-- 运行时期,虚拟机动态的绑定到了子类对象中,运行的是子类中重写的方法
三,静态成员变量特点
①,编译时期特点
|-- 参考引用型变量所在的类中,是否定义了静态变量,定义了编译成功,没定义编译失败
②,运行时期特点
|-- 参考引用型变量所在类中的结果
四,静态成员方法特点
①,编译时期特点
|-- 参考引用型变量所在类中,是否定义了这个静态方法,没有定义编译失败,定义了就编译成功
②,运行时期特点
|--参考引用型变量所在类中的静态方法
总结:
成员变量
|-- 不论是静态成员变量还是非静态成员变量
编译时期参考等号左边
运行时期参考等号左边
成员方法
|-- 静态成员方法
编译时期参考等号左边
运行时期参考等号左边
|-- 非静态成员方法
编译时期参考等号左边
运行时期参考等号右边 虚拟机将动态绑定到子类对象中
说明:
public static void main(String[] args)
{
Fu f = new Zi();
System.out.println(f.num);//非静态成员变量运行时期,输出结果参考引用型变量所属的类中的结果,即要参考Fu类中的值"3"
f.print();//非静态成员方法运行时期,虚拟机动态的绑定到了子类对象中,运行的是子类中重写的方法,即要参考Zi类中的方法,所以输出"子类"
}