继承成员变量和继承方法的区别
来源:互联网 发布:始得西山宴游记悠悠乎 编辑:程序博客网 时间:2024/05/28 20:20
继承是面向对象的3大特征之一,也是Java语言的重要特性,而父,子继承关系则是Java编程中需要重点注意的地方.下面将继续深入分析父子实例的内存控制.
几乎所有Java书籍,资料都会介绍:当子类继承父类时,子类会获得父类中定义的成员变量和方法.当访问权限允许的情况下,子类可以直接访问父类中定义的成员变量和方法.这种介绍其实稍嫌笼统,因为Java继承中对成员变量的方法的处理是不同的.
package com.lic.array;public class Demo16 {public static void main(String[] args) {Base_16 b = new Base_16(); // 1System.out.println(b.count);b.display();Drived_16 d = new Drived_16(); // 2System.out.println(d.count);d.display();Base_16 bd = new Drived_16(); // 3System.out.println(bd.count);bd.display();Base_16 b2d = d; // 4System.out.println(b2d.count);b2d.display();}}class Base_16{int count = 2;public void display(){System.out.println(this.count);}}class Drived_16 extends Base_16{int count = 20;@Overridepublic void display(){System.out.println(this.count);}}运行程序输出:
222020220220对于1,2两处代码分别输出2,2,20,20没有疑问.但是对于3,4处代码,输出2,20,2,20值得探讨一下.
在3处代码,声明了一个Base_16对象,但却给它赋值为Drived_16对象.此时系统将会自动向上转型确保程序正确.如果直接通过bd访问count实例变量,将会输出Base_16(声明时类型)对象的count的实例变量的值.如果通过display()方法来访问count实例变量,将会输出Ddrived_16(运行时类型)对象的count的实例变量的值.
再来看4处代码.直接将一个Drived_16对象 d 变量赋值给一个声明为Base_16的变量b2d.这意味着d和b2d指向了同一个Java对象.如果程序执行b2d == d,将会返回true.但是d.count输出的是2,而b2d.count输出的确实20.这是不是很奇怪呢. 这表明d和b2d所指向的Java对象中包含了2块内存,它们分别存放count为2和count为20的实例变量.
由此可见,只要变量指向Drived_16对象,访问实例变量时,总是表现出声明这些变量时所用类型的行为.而访问方法时,总是表现出它们实际类型的行为.
这表明Java继承在处理成员变量和方法时是有区别的.
package com.lic.array;public class Demo17 extends Animal_17 {private double weight;public void info(){System.out.println("123");}}class Animal_17{public String name;private void info(){System.out.println(name);}}上述程序中,Demo17继承了Animal_17,它会获取父类Animal_17的成员变量和方法,但是是有区别的.我们用javap工具来分析.
由上图看到,Demo17中并没有父类的成员变量name,但是却直接将父类的void info()方法移过来了.这意味着,如果子类中也有void info()方法,则会导致编译器无法将Animal_17中的void info()方法移到Demo17中.同时,系统将public成员变量保留在了Animal_17中,并没移到子类中,说明了子类和父类可以拥有相同的实例名.
如果子类重写了父类的方法,就意味着子类里定义的方法彻底覆盖父类中的同名方法,而实例变量则不存在这样的现象.因为继承成员变量和继承方法之间存在这样的差别,所以对于一个引用类型的变量而言,当通过该变量访问它所引用的对象的实例变量时,该实例变量的值取决于声明该变量时类型;当通过该变量来调用它所引用的对象的方法时,该方法行为取决于它实际所引用的对象类型.
- java 继承成员变量和继承方法的区别
- 继承成员变量和继承方法的区别
- 继承成员变量和成员方法的区别
- 如何理解继承成员变量和方法的区别?
- 父子实例的内存控制--继承成员变量和继承方法的区别
- 继承成员与继承方法的区别
- 继承中的成员方法和变量
- [疑问]继承中的方法和成员变量的调用
- java 继承中成员变量和方法的问题
- java成员变量的继承和隐藏
- java基础(八)Math/代码块/继承成员方法指南的关系/继承中成员变量之间的关系/方法的重写/继承中构造方法之间的关系/this和super的区别
- JAVA中继承时成员变量和成员函数的区别
- java中的成员方法与成员变量的继承
- java中的成员方法与成员变量的继承
- Java成员变量的继承
- java 父子实例的内存控制 继承变量和继承方法的区别
- Java 拾遗补阙 ----- 继承父类的成员变量与方法区别
- [转]Java继承中的成员方法和变量
- appium 中手势密码的定位坐标
- php下foreach()错误提示Warning Invalid argument supplied for foreach() 的解决方法
- 数据挖掘学习清单
- Spring学习笔记之泛型依赖注入
- 编译错误error: invalid storage class
- 继承成员变量和继承方法的区别
- linux 安装git
- iOS开发 支持https请求以及https请求的抓包
- 记单词010
- SQLite学习
- appium 中swipe()方法向左滑动时
- I2C学习
- Android实现XML解析的三种方式
- RecyclerView item刷新动画问题