因为在多态中,成员变量和成员函数,静态和非静态是有区别的.我给你归纳一下(我的笔记,直接剪切过来了,稍微再括号里加了点注释)
Fu f=new Zi();
|-- 非静态成员变量的特点 编译时期特点 |-- 引用型变量所在的类中(即父类),没定义这个变量编译失败(父类中没有这个变量,不管子类有没有都会编译失败,因为你这时候是相当于父,父不能用子的属性) |-- 引用型变量所在的类中,定义了这个变量编译成功 运行时期特点 |-- 运行时期,参考引用型变量所属的类中的结果(所以你输出的是父类中的3而不是子类中的4)
|-- 非静态成员方法的特点
编译时期特点
|-- 编译时期,参考引用型变量所在的类中,有没有定义这个方法,有编译成功,没有编译失败(父类必须有这个类)
运行时期特点
|-- 运行时期,虚拟机动态的绑定到了子类对象中,运行的是子类中重写的方法(这句还算好懂)
|-- 静态成员变量特点
编译时期特点
|-- 参考引用型变量所在的类中,是否定义了静态变量,定义了编译成功,没定义编译失败
运行时期特点
|-- 参考引用型变量所以在类中的结果
|-- 静态成员方法特点
编译时期特点
|-- 参考引用型变量所在类中,是否定义了这个静态方法,没有定义编译失败,定义了就编译成功
运行时期特点
}-- 参考引用型变量所在类中的静态方法
总结:
成员变量
|-- 不论是静态成员变量还是非静态成员变量
编译时期参考等号左边
运行时期参考等号左边
成员方法
|-- 静态成员方法
编译时期参考等号左边
运行时期参考等号左边
|-- 非静态成员方法
编译时期参考等号左边
运行时期参考等号右边 虚拟机将动态绑定到子类对象中
这么多晕了吧??其实上面的没必要太过较真的去理解,这里只需要简单的记住下面的话就好
非静态成员方法,编译看左边,运行看右边
其他情况,编译运行都看左边
多态的理解,我把我以前在不加分区域帖子上的内容给你复制过来吧
- class KD//孔子爹()
- {
- int age=55;//年龄属性;
- void teach()//讲课功能(){讲做官}
- {
- System.out.println("怎么做官");
- }
- }
- class K extends KD//孔子 继承 孔子爹
- {
- int age=33;//年龄属性;
- void teach()//讲课功能(){讲论语}
- {
- System.out.println("学论语");
- }
- void play()
- {
- System.out.println("玩象棋");
- }
- }
复制代码 一个人来孔子家来找孔子爹,但孔子爹不在,这时要只能孔子去办成孔子爹
KD k=new K()
//孔子化妆成孔子爹,孔子提升为孔子爹,自动转向转型
k.teach()
//调用孔子爹的讲课功能,但是孔子已经将这个功能覆盖了,只能讲论语了
System.out.println(k.age);
//此时打印的为55,因为如果你打印33,孔子就穿帮了……嗯,就这样记吧……
//这时,孔子的朋友来找孔子,却碰到了化妆成孔子爹的孔子,所以此时,孔子会还原,卸妆
K kk=(K)k;
//将以提升为孔子爹的孔子向下转型为孔子,强制类型转换。
//格式:目标类型 变量名=(目标类型))提升为父类类型的引用
kk.play();
//此时相当于纯子类对象的引用。
差不多明白就好了,以后用的多了就懂了
|