`
chen592969029
  • 浏览: 110229 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Java多态

    博客分类:
  • Java
阅读更多
先来看一个例子程序:DuoTaiTest.java
class Animal {
	void breathe() {
		System.out.println("animal breathe");
	}
	final static void live(Animal an) {
		an.breathe();
	}
}

class Fish extends Animal {
	void breathe() {
		System.out.println("fish bubble");
	}
}

class Cat extends Animal {
        void breathe() {
                System.out.println("cat breathe");
        }
}

public class DuoTaiTest {
	public static void main(String[] args) {
		Fish fish = new Fish();
                Cat cat = new Cat();
		Animal.live(fish);
                Animal.live(cat);
	}
}

Cat和Fish都继承于Animal,但都有自己的呼吸方式,因此覆盖了Animal类的breathe方法。但是并不用在Animal类中单独为Cat编写一个live方法。因为Animal类中的live方法就像是一个万能接口,当传递过来的Fish类的对象,它就会调用Fish类的breathe方法,当传递过来的是Cat类的对象,它就会调用Cat类的breathe方法。这就是面向对象的多态。

多态性是和继承密切相关的,他的含义就在于同一操作对不同对象可以呈现不同的行为。这些不同的对象必须是一组各具个性却同属于一个继承关系的不同个体。如Animal类中的Fish和Cat,他们有着不同的呼吸方式,但都通过覆盖Animal类的breathe方法来描述这一行为。此时,当执行Animal类的live方法时,将根据传递的具体对象的引用来决定调用相应的呼吸方法。显然这种可以根据传递不同对象的引用来调用不同对象的方法的机制,为实现面向对象编程赋予了更大的灵活性。

到这里,读者有没有想一下,在Animal类的live方法中接受一个Animal类的引用作为参数时,编译器是怎么知道这个Animal类的引用时指向Cat类而不是Fish类的呢?这种指向是发生在程序运行的那个阶段的呢?

为了深入理解内部的运行原理,首先看看什么是绑定机制。通常把对方法的调用连到方法本身的过程称为绑定。当绑定发生在程序运行之前时,称为前绑定。而在程序运行的时候根据对象的类型来决定绑定到哪个方法的机制称为后绑定,也称为动态绑定或者运行时绑定。对于上面的例子程序来说,在运行程序之前我们是无法决定live方法中的形参该指向哪一个对象的,因为这时候对象还没有产生,堆内存中并没有分配任何空间。因此,这是的编译器是不知道该指向哪一个对象类型的,只有在程序运行的时候,内存中有了实际存在的对象实体,才能在方法调用时判断出对象类型,进而调用正确的方法。可见,后绑定机制才是多态性真正的本质所在。

在多态性问题上一直有两个容易混淆的概念,这两个概念就是重载(overload)和覆盖(override)。重载是指在一个类里面允许存在多个同名方法的机制,这些方法必须保证拥有不同的参数列表,这种不同表现在参数个数,参数类型。而覆盖则是在子类中重新定义父类中的非私有方法,这种机制发生在继承关系中。

重载的实现其实是在程序编译阶段就被确定下来的事情,在编译时,编译器会根据方法不同德参数表决定具体讲调用哪个被重载的方法。首先,编译器将这些同名的方法的名称重新命名。由于这个过程是在编译阶段实现的,是静态的,因此这种绑定就是前绑定。它的好处就是整个绑定的过程是在编译阶段完成,因此程序执行效率很高。

重载机制好像有多态性的表现,但是重载绝对不是多态,他只是一种语言特性,不属于面向对象编程,因此与多态无关,与面向对象也无关。

真正和多态性有关的是覆盖机制。只有当子类重新定义了父类的同名方法后,父类的对象引用才可以格局赋给他的不同子类对象的引用,带太调用属于子类的该方法,从而使得方法的嗲用和方法本身只能在程序运行期间被动态绑定。因此,如果它不是后绑定,它就不是多态。
分享到:
评论

相关推荐

    java多态练习题

    java多态、继承练习题,包含题目与答案,............................................................................................................

    Java多态的讲解

    Java多态的讲解

    Java 多态中的类型转换

    本篇将深入探讨Java多态中的类型转换,包括向上转型(Upcasting)和向下转型(Downcasting),以及相关的注意事项。 1. **向上转型(Upcasting)** 向上转型是指将子类的对象引用赋值给父类的引用。在Java中,这是...

    JAVA多态图文详解ppt

    JAVA多态图文详解ppt,详细通过各种举例介绍JAVA多态的ppt

    java基础-java多态详解

    Java 多态详解 Java 多态是 Java 编程语言中的一种基本概念,它允许开发者定义一个接口,并且可以通过不同的类来实现该接口。多态性是 Java 面向对象编程的核心机制之一,它使得程序更加灵活、可维护和可扩展。 ...

    C++和Java多态的区别

    ### C++和Java多态的区别 #### 一、概述 多态是面向对象编程语言中的一个核心特性,它允许程序员能够使用基类的指针或引用指向派生类的对象,并在运行时根据对象的实际类型来选择合适的方法进行调用。这一特性增强...

    java 多态 经典讲解

    ### Java多态经典讲解 #### 一、理解Java多态 多态,作为面向对象编程的三大特性之一,是继抽象和继承之后的关键概念。它允许我们以统一的接口处理不同类型的对象,增强了代码的灵活性和可扩展性。在Java中,多态...

    从虚拟机角度看Java多态->(重写override)的实现原理

    Java多态是面向对象编程中的一个核心特性,它允许我们以一种统一的方式处理不同类型的对象。在Java中,多态性主要通过继承、接口和方法重写(Override)来实现。这里我们将深入探讨从虚拟机(JVM)的角度来看,Java...

    Java多态,面向对象编程题demo.zip

    Java多态是面向对象编程中的一个核心概念,它允许我们以一种统一的方式处理不同类型的对象。在Java中,多态性主要体现在方法的重写(Override)和重载(Overload)。通过多态,我们可以编写出更加灵活、可扩展的代码...

    【Java面试题】谈谈对Java多态的理解

    【Java面试题】谈谈对Java多态的理解

    java多态作业

    在给定的“java多态作业”中,可以看到多态性的应用主要体现在实现多个接口(MouseMotionListener、MouseListener和ActionListener),这些接口代表了不同的事件监听器,每个接口都定义了一系列方法来处理特定类型的...

    java多态的总结

    在Java中,多态分为编译时多态和运行时多态。编译时多态主要体现在方法的重载(Overloading),即在同一个类中可以有多个同名方法,但参数列表不同。编译器会根据传入参数的类型和数量来决定调用哪个方法。运行时...

    java多态实验

    Java多态是面向对象编程中的一个核心概念,它允许我们使用父类的引用指向子类的对象,从而实现更灵活的代码编写。在这个“java多态实验”中,我们可以看到一系列小代码实例,这些实例旨在帮助理解和应用多态特性。...

    java多态理解

    Java多态理解 java中的多态性是面向对象编程的精髓所在。多态性是指父类引用指向子类对象,例如父类Animal,子类Cat和Dog。其中Animal可以是类也可以是接口,Cat和Dog是继承或实现Animal的子类。Animal animal = ...

    Java多态的实现机制

    Java多态的实现机制 Java 多态的实现机制是面向对象程序设计中代码重用的一个重要机制。多态性是 Java 的三大属性之一,在开发中很重要的一个环节。多态性使对象能够调用正确的方法版本,从而提高代码的重用性和...

    java 多态的含义和例子经典讲解

    多态在Java中有着深远的影响,它提高了代码的可重用性、灵活性和可扩展性。本篇将通过一个经典例子深入解析多态的含义,并通过实际代码展示其应用。 首先,我们要理解多态的定义。在Java中,多态性(Polymorphism)...

    Java 多态应用,掌握多态

    6. ** finalize 方法**:虽然不是直接与多态相关的,但值得注意的是,Java中每个对象都有一个finalize()方法,这是垃圾收集器在回收对象前调用的,子类可以重写这个方法进行资源清理,但这并不保证一定会被调用,...

    java 多态的泛型实现

    在Java中,多态主要体现在两个方面:方法重载(Overloading)和方法重写(Overriding)。方法重载是指在一个类中可以有多个同名方法,但参数列表不同;方法重写则是在子类中重新定义父类已有的非私有方法,以提供...

    java多态小结

    ### Java多态详解 #### 什么是多态? 多态(Polymorphism)是面向对象编程的一个核心特性,指的是一个接口可以被多个类所实现或一个类可以被多个类所继承,进而表现出不同的行为。在Java中,多态主要体现在两个...

    Java多态案例及源码.rar

    Java多态是面向对象编程中的一个核心概念,它允许我们使用父类引用处理子类对象,从而实现更灵活的代码设计。在这个“Java多态案例及源码.rar”压缩包中,你将找到一系列关于Java多态的实例和源代码,非常适合教师在...

Global site tag (gtag.js) - Google Analytics