继承成员变量和继承方法的区别

来源:互联网 发布:始得西山宴游记悠悠乎 编辑:程序博客网 时间: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中,并没移到子类中,说明了子类和父类可以拥有相同的实例名.

如果子类重写了父类的方法,就意味着子类里定义的方法彻底覆盖父类中的同名方法,而实例变量则不存在这样的现象.因为继承成员变量和继承方法之间存在这样的差别,所以对于一个引用类型的变量而言,当通过该变量访问它所引用的对象的实例变量时,该实例变量的值取决于声明该变量时类型;当通过该变量来调用它所引用的对象的方法时,该方法行为取决于它实际所引用的对象类型.


1 0
原创粉丝点击