美文网首页Java基础进行时JAVAjava基础
java继承中继承成员变量和继承方法的区别

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

作者: VelyVelyGood | 来源:发表于2017-01-04 18:10 被阅读258次

我们都知道java继承中子类会继承父类的变量和方法,那么我们来看一段简单的代码请你看看运行结果与想的是否相符

图 1 图 2 图 3

请试着看图3的运行打印结果:

.

.

.

.

结果是 2,2; 20, 20; 2,20;2, 20;

跟你的答案是否有出入呢?什么你说我第三和第四组结果错了,应该都是20, 20;!嘿嘿代码很简单,你敲一下试试嘛 :)

运行结果出来了吧,怎么样,嘿嘿。

我们来说下这个东东,第一组2,2;和第二组的20, 20;肯定是没疑问了。第三组明明是父类引用Base指向子类对象Derived,那么bd.count 怎么会是父类中的值2而不是子类中的20呢?

从java编译的角度来说:

如果子类重写了父类方法,就意味着子类里定义的方法彻底覆盖了父类里的同名方法,系统将不可能把父类里的方法转移到子类中。

对于实例变量(成员变量)来说则不存在这样的现象,即使子类中定义了与父类完全同名的实例变量,这个实例变量依然不可能覆盖父类中定义的实例变量

从内存角度来说:

图 3,17行子类Derived初始化先在内存里为其分配内存空间,一块是其本身的count分配空间,一块是其父类变量count分配的空间,默认值都是0。然后会调用它的构造方法进行赋值操作,并且会先隐式调用父类构造方法,所以过程是先隐式调用了Base的构造方法将内存里代表父类count的内存块赋值为2,再在子类构造方法中将内存里代表子类count的内存块赋值为20;如图


子类初始化后在堆内存中会有子类对象的空间,里面包含子类本身的实例变量和它所有父类的成员变量。内存中是没有父类对象的;

因为继承成员变量和继承方法之间这样的差别,所以对于一个引用类型的变量而言,

当通过该变量访问它所引用的对象的实例变量时,该实例变量的值取决于该变量的声明类型;

当通过该变量来调用它所引用的对象的方法时,该方法取决于它实际引用的对象的类型。

所以图 3 的17行bd是以Base声明的,所以bd.count访问的是内存中代表父类count的内存块的值,即2。db.display()因为db实际引用的是Derived对象,所db.display()调用的是子类Derived的display()方法;

同理可以分析第四组的值;

相关文章

  • java

    1.继承: 什么是继承? 继承就是儿子继承老子的东西,获得父类当中的成员变量和方法。 java中只允许单继承,不允...

  • java三大特性

    继承性 extends继承 Java支持单继承,子类得到父类的成员变量和成员方法,(但不包括静态方法和构造方法)...

  • Java中的继承

    学习笔记 目录:一、继承的实现二、继承中成员变量、构造方法、成员方法访问特点1、继承中成员变量访问的特点2、继承中...

  • Java之继承

    继承的概念 继承的格式 继承示例 继承中成员变量的访问特点 继承中成员方法的访问特点

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

    我们都知道java继承中子类会继承父类的变量和方法,那么我们来看一段简单的代码请你看看运行结果与想的是否相符 请试...

  • Java学

    Java中的继承注意事项 1.子类只能继承父类所有的非私有成员(成员变量和成员方法) 2.子类不能继承父类的构造方...

  • JavaForAndroid05

    一、继承定义:在面向对象的世界中,继承就是一个类得到另一个类当中的成员变量和成员方法。Java中只允许单继承,不允...

  • Java07继承

    继承 关键字extends子类继承父类,子类拥有父类的成员变量和方法。Java中所有的类最终都继承与java.lo...

  • python类的继承关系

    python类的继承关系面向对象三大特征:继承/封装/多态 继承的基本形式:成员变量继承,类方法继承例如:成员变量...

  • java 继承 多态

    一、继承 父类的成员变量和成员方法都可以被子类继承。当然父类中的成员变量必须是public 和protected的...

网友评论

    本文标题:java继承中继承成员变量和继承方法的区别

    本文链接:https://www.haomeiwen.com/subject/tutavttx.html