`
iamweiming
  • 浏览: 40966 次
  • 性别: 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 继承和方法重写

    Java 继承是面向对象编程中的一个核心概念,它允许一个类...通过深入理解并灵活运用 Java 的继承和方法重写,可以编写出更具可维护性和扩展性的代码。在实际开发中,合理地利用这些特性,能有效提升软件的质量和效率。

    Java 实现继承实例代码

    这个例子展示了Java继承的核心概念,包括: 1. 使用`extends`关键字创建子类。 2. 访问和覆盖父类的方法。 3. 添加子类特有的方法。 4. 多态性的应用。 通过学习这个实例,开发者能够更好地理解和运用Java的继承...

    java继承例题

    3.继承变量和方法:子类继承了超类的成员变量和成员方法,可以直接访问和使用。 4.覆盖和重写:子类可以对超类的成员变量和成员方法进行覆盖或重写,以实现自己的逻辑。 在下面的例子中,我们将通过多个示例来演示...

    Java方法继承、方法重载、方法覆盖总结

    ### Java方法继承、方法重载、方法覆盖总结 ...综上所述,方法继承、方法重载和方法覆盖是Java面向对象编程中的三个重要概念。正确理解和运用这些概念能够帮助开发者编写出更加灵活、高效和可维护的代码。

    java继承和多态PPT教案学习.pptx

    Java继承和多态PPT教案学习 本PPT教案主要讲解了Java中的继承和多态机制,包括继承、里式代换原则、多态和动态绑定、方法重载、重载构造函数和方法覆盖等概念。 继承是面向对象编程的基本机制之一,允许一个类继承...

    经典java继承例子

    Java继承是面向对象编程的一个核心概念,它允许一个类(子类)继承另一个类(父类)的属性和方法,从而实现代码的复用和扩展。在这个经典的Java继承例子中,我们将深入理解这一机制。 首先,我们要明确的是,继承的...

    java基础学习(继承与接口的区别及产生原因)

    在面向对象编程中,继承是一种使一个类继承另一个类的属性和方法的机制,允许子类扩展或重写父类的行为。接口则是一种定义行为规范的方式,它仅包含抽象方法的声明,不允许实现具体的方法,但允许多个类实现同一个...

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

    综上所述,Java的向上转型机制并不丢弃子类的非继承成员,而是通过类元数据和动态绑定来确保这些成员在需要时可以被正确访问。这种设计不仅提高了代码的可复用性和灵活性,也是面向对象编程中的重要特性。在实际开发...

    论JAVA继承机制中父类与子类的关系

    文章围绕子类继承父类成员的过程、成员变量及方法的赋值、重写、覆盖等问题展开讨论,旨在帮助读者更好地理解Java继承中的重点与难点。 #### 关键词 - 继承机制 - 父类 - 子类 #### 一、超类的属性或方法在继承...

    关于JAVA继承的讲解

    Java 继承是面向对象编程中的一个重要概念,它允许一个类(子类)从另一个类(父类)中继承属性和方法,从而实现代码的复用和类的层次结构。这种方式使得子类能够继承父类的特性,同时可以添加自己的特性和功能,而...

    java继承与多态

    ### Java继承与多态知识点详解 #### 一、引言 在面向对象编程语言中,继承和多态是非常重要的概念。它们提供了强大的机制来管理代码的复杂性,并且能够有效地复用现有代码。本文将详细介绍Java中的继承和多态概念...

    java关于继承的思维导图(Xmind)

    - 子类自动继承父类的所有非私有(public和protected)成员变量和方法。私有(private)成员不被继承,但可以通过内部访问机制在子类中使用。 - 如果子类和父类有同名的方法,子类的方法会覆盖(override)父类的...

    Java 继承 小程序

    // 子类的成员变量和方法 } ``` 在这个小程序中,可能会包含一个父类和一个或多个子类,每个子类通过`extends`关键字扩展父类。例如,一个`Person`类作为父类,然后有`Student`和`Teacher`两个子类分别表示学生和...

    java 继承和多态的讲解

    在Java中,类的继承允许一个类(子类)从另一个类(父类)继承属性和方法,从而实现代码的共享和结构的层次化。这使得子类可以拥有父类的所有非私有属性和方法,同时还能添加自己的特性和功能。 继承的关键字是 `...

    Java继承习题

    ### Java继承习题知识点解析 #### 一、基础概念与选择题分析 1. **final修饰的方法** - **题目**: 若在某一个类定义中定义有如下的方法:`final void workDial()`该方法属于 - A. 本地方法 - B. 最终方法 - C....

    java中继承与多态的题目

    * 子类继承父类的所有成员变量和方法 * 子类可以重写父类的方法 * 子类可以添加新的成员变量和方法 * 子类可以 override 父类的方法 继承的应用 继承的应用非常广泛,例如: * 在游戏开发中,继承可以用于实现...

    Java中extends类的继承

    类的继承是面向对象编程的一个核心特性,它允许一个类(子类)继承另一个类(父类)的属性和方法,从而实现代码的复用和扩展。下面将详细探讨`extends`关键字在Java中的使用、特点以及相关知识点。 1. **类的继承...

    Java 接口与继承

    继承是Java中创建新类的一种方式,它允许一个子类(SubClass)从一个已存在的父类(SuperClass)中获取属性和方法。这种机制使得子类可以扩展父类的功能,而无需重新编写父类的代码。在Java中,创建子类的语法如下:...

    Java 类和继承相关代码集

    - Java提供了四种访问修饰符:`private`、`default`(无修饰符)、`protected`和`public`,它们控制类的字段和方法的可访问性。 - `private`:只能在同一个类中访问。 - `default`:在同一包内可见。 - `...

    JAVA 继承和多态实验报告.pdf

    在Java中,继承是一种机制,允许一个类继承另一个类的成员变量和方法。继承的目的是为了实现代码的重用和提高代码的灵活性。通过继承,可以将公共的成员变量和方法提取出来,放在父类中,然后在子类中继承父类的成员...

Global site tag (gtag.js) - Google Analytics