Java中关于子类成员变量与父类成员变量同名
2016-06-24 14:19
483 查看
重写和重载是针对方法的,子类的变量可以覆盖父类的变量,但是不能改变父类的变量。
打印结果:
Animals enjoy!
10
Dog enjoy!
20
Dog enjoy!
10
20
由此可见,父类和子类的变量是同时存在的,即使是同名。
子类中看到的是子类的变量,父类中看到的是父类中的变量。
它们互相隐藏,而同名的方法则是实实在在的覆盖(重写)。
如Animals d1 = new Dogg();
d1即是一个Animals的对象,也是一个Dogg的对象,
那么调用方法时,是根据对象的实际类型调用的,
实际类型是Dogg,所以永远调用子类的方法。
而访问成员变量就不同了,它是Animals时,访问的是父类的成员变量,
转型为Dogg的话,访问的就是子类的成员变量了。
class Animals { int age = 10; void enjoy() { System.out.println("Animals enjoy!"); } } class Dogg extends Animals { int age = 20; int weight; void enjoy() { System.out.println("Dog enjoy!"); } } public class TestDuoTai { public static void main(String[] args) { Animals a = new Animals(); a.enjoy(); System.out.println(a.age); Dogg d = new Dogg(); d.enjoy(); System.out.println(d.age); Animals d1 = new Dogg(); d1.enjoy(); System.out.println(d1.age); Dogg s = (Dogg)d1; System.out.println(s.age); } }
打印结果:
Animals enjoy!
10
Dog enjoy!
20
Dog enjoy!
10
20
由此可见,父类和子类的变量是同时存在的,即使是同名。
子类中看到的是子类的变量,父类中看到的是父类中的变量。
它们互相隐藏,而同名的方法则是实实在在的覆盖(重写)。
如Animals d1 = new Dogg();
d1即是一个Animals的对象,也是一个Dogg的对象,
那么调用方法时,是根据对象的实际类型调用的,
实际类型是Dogg,所以永远调用子类的方法。
而访问成员变量就不同了,它是Animals时,访问的是父类的成员变量,
转型为Dogg的话,访问的就是子类的成员变量了。
相关文章推荐
- java基础集合之Map
- 解决Error:java.lang.OutOfMemoryError: GC overhead limit exceeded
- Spring整合Mybatis简要概括
- myeclipse中java.lang.OutOfMemoryError: PermGen space
- ant编译OpenACS和myeclipse下使用ant编译OpenACS
- 深入JDK源码之Arrays类中的排序查找算法(转)
- 【风马一族_Java】java的一种IDE
- Java Synchronized Blocks
- java jms
- java基础集合之TreeSet练习2(带答案)
- java用JNA调用DLL文件
- Java线程及多线程技术及应用(二)
- Java任务调度框架Quartz教程实例
- Struts2学习(四)—表单处理
- 【Java基础】类和接口
- spring Bean管理
- JAVA单例模式
- An internal error occurred during: "Computing size". The profile is
- 判断jar包中class文件的java编译版本
- eclipse 重新加载项目遇到的问题