`
iamweiming
  • 浏览: 39680 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Java继承成员和继承方法的区别

 
阅读更多

        几乎所有的Java书籍或资料都会介绍:当子类继承父类时,子类会获得父类中定义的成员变量和方法。当访问权限允许的情况下,子类可以直接访问父类中定义的权限和方法。这种介绍其实有些笼统,而且字面理解上会产生歧义和错误。因为Java继承中对成员变量和成员方法的处理是不通的。

 

比如如下代码:

class Base {
    int count = 2;

    public void display() {
        System.out.println(this.count);
    }
}

class Derived extends Base {
    int count = 20;

    @Override
    public void display() {
        System.out.println(this.count);
    }
}

public class StaticTest {

    final static StaticTest INSTANCE = new StaticTest(2.0);

    public StaticTest(double discount) {
        currentPrice = initPrice - discount;
    }

    static double initPrice = 20;
    double currentPrice;
    String kkk = "dfa";

    /**
     * @param args
     */
    public static void main(String[] args) {
        // 第一组
        Base b = new Base();
        System.out.println(b.count);
        b.display();
        //第二组
        Derived d = new Derived();
        System.out.println(d.count);
        d.display();
        //第三组
        Base bd = new Derived();
        System.out.println(bd.count);
        bd.display();
        //第四组
        Base bd2 = d;
        System.out.println(bd2.count);
    }

}


 

第一组的Base,输出的都是2,这个应该是没有疑问的。

第二组的Derived,因为是子类,而且是覆盖父类的方法,成员变量的取近法则,所以输出都是20,也是没有疑问的。

第三组:讲一个Derived子类赋给Base的父类,此时系统将会自动向上转型以保证程序的正确。问题是,当程序通过db来访问count实例变量时输出到底是多少?通过db的display()方法时输出又是多少?答案是,直接访问实例变量,输出的将是声明时的类型,也就是Base的实例变量的值,而访问方法的时候,则表现的是运行时的类型,也就是子类的行为方式。于是输出的结果就是2和20。

第四组:这组其实有些诡异。因为当把d赋给db2的时候,代表着这两个变量指向了同一个内存。但是,实际访问d.count时输出是20,访问db2.count时输出的却是2。正常来说,两个指向同一个对象的变量,分类访问他们的实例变量时应该是同一个值,但是... 这说明了db2和d所指向的Java对象中包含了两块内存,分别存放值为2的count实例变量和值为20的count实例变量。

 

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

 

 

分享到:
评论

相关推荐

    《java面向对象程序设计-继承和多态》教案.doc

    圆点符号用于访问对象的成员,构造函数在创建对象时初始化对象 包可用package 来申明 ,可用import 来导入包 目标 理解继承及其特点 运用JAVA程序实现继承 理解多态及其特点设计 运用JAVA程序实现多态 掌握访问修饰...

    图解Java继承内存分配

     (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法。  (3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承。  (4)子类中定义的成员...

    Java零基础-继承.md

    建议读者在阅读前具备Java的基础知识,包括类、对象、方法和成员变量等概念。 在阅读过程中,尝试编写简单的Java程序,创建并使用父类和子类。 建议通过阅读相关的Java教材或搜索资料,进一步扩展学习与继承相关的...

    Java面向对象继承.pdf

    继承是面向对象编程中的一个概念,它允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和方法。子类在继承父类的同时也可以添加自己的属性和方法,从而实现代码的复用和扩展。继承是面向对象编程...

    java子类的继承性

    知道子类的继承性,子类创建对象的过程,成员变量的继承和隐藏,方法的继承和重写。

    将子类引用赋给父类对象时,java虚拟主机并没有将那些非继承成员丢弃

    NULL 博文链接:https://fuckdkjlfsaene.iteye.com/blog/767245

    继承、接口和多态java实验

    定义一个台球类Billiards,继承Ball类,包含一个私有成员变量——颜色(String color),两个公有成员方法:设定颜色方法setColor()、输出信息方法show(),其中show()方法可以输出该台球的颜色和半径值。。。。。。

    Java基础讲座.pdf

    如书所言:(1)java不支持多重继承,也就是说子类至多只能有一个父类 (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法 (3)子类中定义的成员变量和父类中定义的成员变量相同时,...

    java 继承访问成员变量代码实例

    主要介绍了java 继承访问成员变量代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    java面试题静态加载顺序构造方法

    Java中的继承与静态static等的执行先后顺序的面试题 java面试题静态加载顺序构造方法 继承与static 面试题目如下:请写出程序执行完成之后的结果。...3、类初始化时,先初始化类的属性成员,在执行构造方法。

    Java中的方法和变量在继承时的覆盖问题

    变量和方法覆盖和隐藏的不同:一个类的实例无法通过使用全局名或者强制自己转换为父类型,以访问父类中被隐藏的方法,然而强制转换子类为父类型之后,可以访问父类中被隐藏的变量。另外静态方法不能覆盖父类的实例...

    Java继承后访问成员的特点.docx

    对象访问成员变量时,会先在子类中查找有没有定义对应的变量,若子类中存在就会就近使用子类中的变量,若子类中没有定义就会沿着继承关系往上找有没有定义相应的变量,若父类中也没有则编译不通过。代码示例:

    Java类中的私有成员的继承机制.pdf

    Java类中的私有成员的继承机制

    Java开发技术大全(500个源代码).

    differ.java 测试静态方法与实例方法之间的区别 forefather.java 一个简单的基类 grandson.java 上面这个类的子类 hasConstructor.java 拥有构造器的类 hasFinalFun.java 拥有最终方法的类 hasRecall.java ...

    JAVA中有关继承的PPT

    父类或超类。实际上是所有子类的公共域和公共方法的集合子类,父类的特殊化,是对公共域和方法在功能、内涵方面的扩展和延伸 ,祖先类的所有成员均将成为子类拥有的“财富” 。

    实验四:Java继承与接口

    本次实验理解继承原理与机制及类继承的声明方法,掌握了成员变量的隐藏及方法的重写和抽象类与抽象方法,掌握了super和final关键字,理解了多态的内涵及实现代码,掌握接口的声明和使用等。

    java继承的小应用

    继承最简单的应用,轻松学继承。电子书版的,此子类继承父类的除私有之外的成员变量。

    Java设计一个银行帐户类(继承与多态)

    Java设计一个银行帐户类,成员变量包括账号、储户姓名、开户时间、身份证号码、存款余额等帐户信息,成员方法包括存款、取款操作。

    Java中this与super的区别

    Java中this与super的区别 this&super; 什么是this,this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针。 Java关键字this只能用于方法的方法体内。当一个对象创建后, Java虚拟机(JVM)就...

    Java中抽象类和接口的区别

    1.abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。  2.在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在...

Global site tag (gtag.js) - Google Analytics