`

深入理解Java的方法调用二(多态性)

阅读更多

Java的多态性表现在2个方面,1方法的覆盖、2方法的重载。

 

/**
 * @ClassName  Polymorphic 
 * @author derick
 * @date   2013-5-13
 * @Description 
 */
public class PolymorphicTest {
	public static class Human{
		public void say(){
			System.out.println("Human say!");
		}
	}
	
	public static class Man extends Human{
		public void say(){
			System.out.println("Man say!");
		}
	}
	
	public static class Woman extends Human{
		public void say(){
			System.out.println("Woman say!");
		}
	}
	
	public static void say(Human h){
		System.out.println("say Human!");
	}
	
	public static void say(Man h){
		System.out.println("say Man!");
	}
	
	public static void say(Woman h){
		System.out.println("say Woman!");
	}

	public static void main(String[] args) {
		Human man = new Man();
		Human woman = new Woman();
		//重载
		say(man);
		say(woman);
		//覆盖
		man.say();
		woman.say();
	}

}

 

运行结果
say Human!
say Human!
Man say!
Woman say!

 

 

        从输出结果来看,方法的覆盖和重载表现的不太一致。方法的覆盖安照预期的结果调用了子类的say方法;但方法的重载视乎超预期没有调用相应的子类参数的方法。在方法重载的选择中,为什么会选择形参类型为Human的重载呢?在解决这个问题前,我们先按照如下代码定义两个重要的概念:

        Human man = new Man();

        我们把上面的代码中“Human”称为变量的静态类型或者外观类型,后面的“Man”则称为变量的实际类型。静态类型编译期可知,实际类型运行时才可确定。

        在上面main方法的代码中刻意定义了2个静态类型相同、实际类型不同的变量,但虚拟机(准确地说编译器)在重载时是通过参数的静态类型而不是实际类型作为判定的依据的。并且静态类型是编译期可知的,所以在编译阶段,Javac就根据参数的静态类型决定使用哪个重载版本,所以选择了say(Human)作为调用目标。

        对于方法覆盖所表现出来的多态的输出结果,大家并不奇怪,它是在运行期根据实际类型来确定的。

 

 

 

1
5
分享到:
评论
1 楼 2007yn 2013-05-14  
  这个还真没试过

相关推荐

    深入理解Java多态

    深入理解 Java 多态性 在 Java 编程语言中,多态性是指一个对象可以有多种形式的能力,具体来说就是一个对象可以有多个不同的类形态。多态性是面向对象程序设计代码重用的一个最强大机制,Java 多态性的概念也可以...

    实验二:java多态性.rar

    Java多态性是面向对象编程中的一个重要概念,它在Java中起到了关键的作用,使得程序更加灵活,可扩展性更强。...通过本实验,你将能深入理解多态性如何工作,以及如何在实际项目中有效利用这一特性。

    Java基础知识:多态性

    Java 基础知识:多态性 Java 语言是一种面向对象的编程语言,多态性是其核心特性之一。多态性是指同一个方法在不同对象上具有不同的行为。...希望读者通过本文的学习,能够深入理解和灵活应用 Java 中的多态性特性。

    java多态性练习

    总结一下,这个“java多态性练习”将带你深入理解Java中的多态性和抽象类。通过实际的代码示例和分析,你将学会如何在自己的项目中有效地应用这些概念,以实现更高效、更灵活的代码设计。这个练习对于任何希望提升...

    Java多态性实验报告

    本次实验主要目的是让学生通过实践操作,深入理解Java中的多态性概念,并掌握如何利用多态性实现代码的灵活性和可扩展性。实验中,学生将通过编写一个处理复数运算的类来实现这一目标。 #### 多态性简介 多态性是...

    Java多态性探悉()

    本文将深入探讨Java多态性的概念、实现机制以及相关的编程规则。 一、基本概念 多态性意味着一个接口可以有多种不同的表现形式。在Java中,可以通过子类对象引用赋值给超类对象引用变量来实现这一特性。这意味着,...

    java多态性详解——父类引用子类对象

    本文将深入探讨Java中的多态性,特别是“父类引用子类对象”的概念,以及这一特性如何在实际编码中体现。 ### 多态性概述 多态性主要通过方法的重写(Overriding)、重载(Overloading)和动态绑定(Dynamic Binding)来...

    【深入Java虚拟机(5)】多态性实现机制-静态分派与动

    动态分派则是在运行时根据实际对象的类型来确定调用哪个方法,它是多态性的重要体现,主要体现在方法的重写(Overriding)上。例如: ```java class Parent { void printType() { System.out.println("Parent"); }...

    Java 线程同步调用

    在深入探讨Java线程同步调用这一主题之前,我们首先需要理解线程同步的基本概念及其在多线程环境中的重要性。线程同步是多线程编程中的一个关键概念,它确保了多个线程在访问共享资源时不会发生冲突,避免了数据不...

    Java的多态性

    具体到Java语言中,多态性主要通过方法重写(Overriding)、方法重载(Overloading)以及动态绑定来实现。 #### 二、方法重写与方法重载 - **方法重写(Overriding)**:发生在继承或实现关系中,子类覆盖父类或...

    283.281.JAVA基础教程_面向对象(中)-虚拟方法调用的再理解(283).rar

    Java是一种广泛使用的...总之,理解Java中的虚拟方法调用是深入学习面向对象编程的关键。它涉及到类的继承、多态性以及JVM的内部工作原理。通过深入掌握这些概念,开发者可以编写出更加灵活、可扩展且易于维护的代码。

    ATM项目存取款操作代码.zip_java方法调用_存取款_存取款操作

    在实际项目中,这些方法可能会组织在一个BankingService类或者ATMController类中,通过面向对象的设计原则,如封装、继承和多态性,来实现良好的代码结构。同时,考虑到银行系统的实时性和并发性,可能还会涉及到...

    Java动态调用实例

    这使得代码更加模块化,增强了可扩展性和多态性。在动态调用中,接口可以作为通信的契约,确保不同组件间的兼容性。 在描述中提到的“通过配置文件进行组件的装配”,这是依赖注入(Dependency Injection,DI)的一...

    Java实验报告——类的继承、多态的应用

    实验主要目标是加深对抽象类和抽象方法的理解,并掌握如何在实际编码中实现类的继承以及多态性。 首先,让我们理解抽象类和抽象方法的概念。在Java中,一个类如果包含至少一个抽象方法,那么这个类就必须被声明为...

    深入理解Java多态.pptx.pptx

    - **多态性** 在继承中的体现是,一个父类引用或接口引用可以指向其子类对象,这样在调用父类方法时,实际上执行的是子类重写或实现的方法,实现了不同的行为。 2. **接口与多态**: - **接口** 是一组方法签名的...

    成员的初始化顺序和多态性

    ### 成员的初始化顺序 #### 实验背景与目标 在Java编程语言中,...通过本次实验,我们不仅掌握了成员变量的初始化顺序,还深入理解了Java中多态性的概念及其具体应用。这对于编写灵活、可扩展的代码具有重要意义。

    java调用c++demo(避免不必要的通信调用)

    首先,Java调用C++最常用的技术是JNI(Java Native Interface)。JNI是一种原生接口,允许Java代码直接调用C或C++编写的库。以下步骤介绍了使用JNI的基本过程: 1. **创建Java接口**:在Java中定义一个native方法,...

    290.288.JAVA基础教程_面向对象(中)-多态练习:调用方法和属性(290).rar

    在这个"290.288.JAVA基础教程_面向对象(中)-多态练习:调用方法和属性(290)"的教程中,我们将深入探讨Java中的多态性,这是面向对象编程中的一个重要概念。多态性允许我们使用一个类的引用来调用子类的方法和属性,...

    JAVA核心知识点整理.pdf

    Java的动态多态性依赖于方法的绑定机制——晚期绑定(Late Binding),也叫虚方法调用。 JVM(Java虚拟机)是Java程序运行的基础,它负责解析并执行字节码,提供了线程支持、内存管理等服务。JVM内存区域可以分为...

Global site tag (gtag.js) - Google Analytics