内存控制之父子实例

来源:互联网 发布:linux安装cuda8.0 编辑:程序博客网 时间:2024/05/17 08:00

父子实例的内存控制

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

package qianglih;public class FieldAndMethodTest {public static void main(String[] args) {//声明并创建一个Base对象Base b =new Base();//1//直接访问count实例变量和通过display访问count实例变量System.out.println(b.count);b.display();//声明并创建一个Derived对象Derived d=new Derived();//2//直接访问count实例变量和通过display访问count实例变量System.out.println(d.count);d.display();//声明一个Base变量,并将Derived对象赋值给该变量Base bd=new Derived();//3System.out.println(bd.count);bd.display();//让d2b变量指向原d变量所指向的Derived对象Base d2b =d;//4System.out.println(d2b.count);d2b.display();System.out.println(d2b ==d);}}class Base{int count = 2;public void display(){System.out.println(this.count);}}class Derived extends Base{int count = 20;public void display(){System.out.println(this.count);}}

结果:

222020220220true


d2b ==d返回true,两个指向同一个对象的变量,分别访问他们的实例变量时却输出不同的值,这表明d2b、d变量所指向的java对象中包含了两块内存,分别存放值为2的count实例和值为20的count的实例变量。

当通过这些变量调用方法时,方法的行为总是表现出他们实际类型的行为;但通过这些变量来访问他们所指对象的实例变量时,表现出声明这些变量所有类型的行为.

由此可见,java继承在处理成员变量和方法时是有区别的。

注:当Derived继承Base时,编译器会直接将Base里的display()方法移到Derived里去,但如果它已重写了该方法就不能移动了。编译器在处理方法和成员变量存在区别,不会将父类的实例变量移到子类里去,这使得父类与子类可以同时拥有同名的实例变量。

1.2 内存中子类实例



0 0
原创粉丝点击