父子实例的内存控制--继承成员变量和继承方法的区别

来源:互联网 发布:深宫遗梦 知乎 编辑:程序博客网 时间:2024/06/06 00:23

 实例代码:

package com.Filed;class Base{int count=2;public void display(){System.out.println(this.count);}}class Derived extends Base{    int count=20;@Overridepublic void display() {// TODO Auto-generated method stub  System.out.println(this.count);}}public class FieldAndMethodTest {public static void main(String[] args) {/* * 程序一 */        //声明并创建一个Base对象Base b = new Base();//直接访问count实例变量和通过display访问count实例变量System.out.println(b.count);b.display();/* * 程序二 *///声明并创建一个Derived对象Derived d = new Derived();//直接访问count实例变量和通过display访问count实例变量System.out.println(d.count);d.display();/* * 程序三 *///声明一个Base变量,并将Derived对象赋给该变量Base bd = new Derived();//直接访问count实例变量和通过display访问count实例变量System.out.println(bd.count);bd.display();/* * 程序四 *///让d2b变量指向原d变量所指向的Dervied对象Base d2b = d;//访问得d2b所指对象得count实例变量System.out.println(d2b.count);}}

结果:

2
2
20
20
2
20
2

 

 # 实例分析

     程序一和程序二的调用一目了然,就不过多分析了,看看程序三和程序四。

     程序三的代码声明了一个Base变量bd,却将一个Dervied对象赋给该变量,此时的系统将会自动进行向上转型来保证程序正确。直接通过db访问count实例变量,输出的将是Base(声明时的类型)对象的count实例变量的值;如果通过db来调用display()方法,该方法将表现出Dervied(运行时类型)对象的行为方式。

      程序四的代码直接d变量直接赋值给d2b,只是d2b变量得类型时Base。这意味着d2b和b两个变量指向同一个Java对象,因此如果在程序中判断d2b==b,将返回true。但是,访问d.count时输出20,访问d2b.count时却输出2。这表明:d2b,b变量所指向得Java对象包含了两块内存,分别存放值为2的count实例变量和值为20的count实例变量

  # 总结:

    不管是d变量,还是bd变量,d2b变量,也不管声明它们时用什么类型,只要它们实际指向一个Dervied对象,当通过这些变量调用方法时,方法的行为总是表现出它们实际类型的行为;但如果通过这些变量来访问它们所指的对象的实例变量,这些实例变量的值总是表现出声明所用类型的行为。由此可见,Java继承在处理成员变量和方法时是有区别的。


0 0
原创粉丝点击