`
瘋叻ハ.兩
  • 浏览: 81976 次
  • 性别: Icon_minigender_1
  • 来自: 宁德
社区版块
存档分类
最新评论

Java进阶 ---- 多态(Polymorphism)

阅读更多

      从前面的继承(Inheritance)到比较this和super,所用的例子都夹杂着多态(Polymorphism)的味道。所以,这篇就是阐述个人总结的多态(Polymorphism)

 

      多态,并没有关键字,可以视之为Java的三大特性之一,也可以视为继承“is a”的另一阐述“substitution principle(代理准则)”的体现。在Java中,对象变量(引用变量)是多态的,如:

Employee e;    // e为对象变量
e = new Employee(...);
e = new Manager(....);

      变量是多态的,但是还有有些规律可循的,那就是父类的对象变量既可以指向父类实例,也可以指向子类实例,但是子类的对象变量只能指向子类实例

      相关代码

package com.PolymorphismTest;

/**************************************************
 * simply introduce something about basic polymorphism,群:152380972                                               
 * @author:      瘋叻ハ.兩                                                                              
 * @revision:    1.0                                                        
 * @create-time: 2011-9-6 下午06:30:33                                               
 ***************************************************/
public class PolymorphismTest1 {
	
	public static void main(String[] args){
		// create arrays Employee
		Employee1[] e1 = new Employee1[2];
		
		// create a manager object
		Manager1 boss = new Manager1("John", 8000, 500);
		
		// it's correct for superclass object to refer subclass object or its'object
		e1[0] = boss;
		e1[1] = new Employee1("Kevin", 4500);
		
		// it's wrong for subclass object refers to superclass object
		// Manager1 m = e1[1];
		
		// e1[i] was considered to be only an Employee1 object by the compiler(编译器)
		e1[0].getSalary();
		// e1[0].setBonus();	// won't work
		
		for(Employee1 e : e1){
			System.out.println(e.getName() + "的工资是:" + e.getSalary());
		}
	}
}

class Employee1{
	
	private String name;
	private int salary;
	
	// default constructor
	public Employee1(){
		
	}
	
	// constructor with fields
	public Employee1(String n, int s){
		name = n;
		salary = s;
	}

	public String getName() {
		return name;
	}

	public int getSalary() {
		return salary;
	}
	
}

class Manager1 extends Employee1{
	
	private int bonus;
	
	public Manager1(String n, int s, int b){
		super(n, s);
		this.bonus = b;
	}
	
	// override method getSalary
	@Override
	public int getSalary(){
		int baseSalary = super.getSalary();
		return  baseSalary + bonus;
	}
}
 

      运行结果:   

                   John的工资是:8500
                   Kevin的工资是:4500

 

        分 析  :且看下文

 

      从上面程序的结果,我们会有这样的疑惑,编译时都是是Employee1类型的变量,为什么结果不是“8000,4500”而是“8500,4500”呢? 答案就是方法的动态绑定(Dynamic Binding),多态的表现形式。简单的说,Java中的对象变量有2中:编译类型运行类型。编译类型由声明该变量使用的类型决定,运行类型由实际赋给该变量的对象决定。当执行至e1[0].getSalary( )时,因为e1[0]指向boss,而boss是Manager1类型,所以此时的getSalary( )方法是Manager1中的。下面代码希望助你理解编译类型和运行类型。

      相关代码

package com.PolymorphismTest;

/**************************************************
 * differentiate from compiled type and running type,群:152380972                                               
 * @author:      瘋叻ハ.兩                                                                              
 * @revision:    1.0                                                        
 * @create-time: 2011-9-6 下午08:04:15                                               
 ***************************************************/
public class TypeTest {

	public static void main(String[] args) {

		// declare the Animal object 
		Animal a = new Lion();
		
		// print the actual class of a
		System.out.println(a.getClass());
		
		// use photo 1 to identify what compiled type the variable is
		a.run();
	}

}

class Animal{
	// what does it work?
	// in fact, a's compiled type is Animal. when program is compiled, "a.run()" use this method not Lion's 
	public void run(){
		System.out.println("Animal can run!");
	}
}

class Lion extends Animal{
	
	@Override
	public void run(){
		System.out.println("Lion is running...");
	}
}

      运行结果: 

                   class com.PolymorphismTest.Lion
                   Lion is running...

 

         分  析 :看代码注释

 

     

      关于Animal处的代码注释如果意思不懂,且看多态方法调用的4步曲,知道的可忽视而过。(选自Java核心技术卷1:基础知识)以【 x.f(param) x是C类,x的子类是D类 】为例:

      1、根据对象编译类型确定方法名。 编译器首先找的是对象的声明类型和方法名称。所以可以通过x的类型排除其他类型的f方法。但是不能排除f的重载方法,即不同参数类型的同一方法。在本例中,编译器以C类型排除非C类型的f方法,而不是D

 

      2、根据形参类型名确定具体方法名。 根据传入的形参类型查找相应的方法就能确定具体是哪个方法了,这个过程也称为“overloading resolution”。

 

      3、根据修饰词确定绑定状态。  如果方法被private、static、final修饰,那么这些方法就是static binding,否则是dynamic binding。

 

      4、根据绑定状态执行方法体。 当方法是dynamc binding,虚拟机会找到方法执行者的指向类型,即运行类型。如果运行中有同名方法,则执行该方法的方法体,否则执行父类中的方法体。在本例中,如果D类中有f方法,便执行D类的方法,否则执行C类的f方法。当方法是static binding,在多态中是没有意义的,所以就不介绍了

 

 

      多态,其实就是对象变量的多态,它的表现形式就是控制方法。可以发现,它的成立条件就是有继承关系。所以说,多态也是继承“is a”的另一阐述“substitution principle(代理准则)”的体现!

 

      事后补充,请原谅我的疏忽

      对象变量的多态,并不影响到属性的访问,即通过引用变量访问其包含的实例属性时,系统总是访问其编译时类所定义的属性,而不是它运行时类所定义的属性。

      相关代码

/**************************************************
 * whether polymorphism influence to access attribute! 群:152380972                                               
 * @author:      瘋叻ハ.兩                                                                              
 * @revision:    1.0                                                        
 * @create-time: 2011-9-7 上午12:07:06                                               
 ***************************************************/
public class TypeTest1 {

	public static void main(String[] args) {

		Animal1 a1 = new Lion1();
		System.out.println("名称是:" + a1.name);
	}

}

class Animal1{
	public String name = "动物";
}

class Lion1 extends Animal1{
	public String name = "Lion";
}

 

      运行结果

                     名称是:动物

 

        分  析  :对象变量的多态不影响属性的访问

 

 

  • 大小: 12.1 KB
1
0
分享到:
评论
2 楼 瘋叻ハ.兩 2011-09-06  
ttff2234 写道
全部是基础,我正好也在学习,支持你继续发出来,顺便说说方法作为形参与方法作为返回值类型来描述下多态吧,这个用到的很少

方法作为形参我见过,但是请恕我的见识有限,还没见过以方法作为返回值类型 ,欢迎示例回复
1 楼 ttff2234 2011-09-06  
全部是基础,我正好也在学习,支持你继续发出来,顺便说说方法作为形参与方法作为返回值类型来描述下多态吧,这个用到的很少

相关推荐

    Java面向对象(进阶)- 面向对象特征之三:多态性

    多态性(Polymorphism)是程序设计中的一种重要概念,它允许我们使用一个父类类型的引用来调用子类的方法,从而实现不同对象对同一方法的不同响应。 ### 一、多态的形式和体现 **1. 为什么需要多态性** 在实际...

    Java编程实训 Java开发基础入门教程1-06 面向对象编程-继承和多态(共28页).ppt

    多态(Polymorphism)是面向对象的另一大特性,它允许使用父类类型的引用指向子类的对象,这意味着可以设计更加通用的代码,而无需关心具体的实现细节。多态提供了更大的灵活性,使得程序可以处理多种类型的对象,只...

    面向对象进阶(多态&包&final&权限修饰符&代码块)

    本篇将深入探讨面向对象进阶中的几个关键概念:多态、包、final关键字、权限修饰符以及代码块。 1. **多态(Polymorphism)**: 多态是指同一个接口,使用不同的实例而产生不同的效果。在Java中,多态主要体现在...

    Java课程介绍.pdf

    - Java中的面向对象的概念包括类(Class)、对象(Object)、继承(Inheritance)、封装(Encapsulation)、多态(Polymorphism)。 - Java的集合框架提供了丰富的数据结构,如List、Set、Map等。 2. Java编程...

    java代码-习题4-5

    6. 继承(Inheritance)和多态(Polymorphism):如果习题复杂度较高,可能会涉及这些面向对象的特性。 `README.txt`文件通常用来提供关于项目、代码或练习的说明和指导。在这个场景中,它可能包含了题目要求、解题...

    java代码-34ljc 实训4-2

    在Java编程中,我们还会学习到类(Class)、对象(Object)、继承(Inheritance)、多态(Polymorphism)等核心概念。类是对象的蓝图,它定义了对象的属性(Fields)和行为(Methods)。对象是类的实例,具有类所...

    Java面向对象程序设计(第二版)-电子教案.rar

    - 多态(Polymorphism):一个接口可以有多种不同的实现,允许同一消息发送给不同类型的对象。 2. Java类和对象: - 构造器(Constructor):用于初始化新创建的对象,确保对象在使用前状态正确。 - 访问修饰符...

    30天学通java-项目案例开发

    1. **chap07**:这部分可能涉及到Java面向对象编程的基础概念,包括类(class)、对象(object)、封装、继承(inheritance)和多态(polymorphism)。此外,还可能讲解了接口(interface)和抽象类(abstract class...

    java基础课件(11---20).rar

    3. 多态(Polymorphism):多态是Java中另一种重要的面向对象特性,它允许使用父类引用操作子类对象,实现不同的行为。你将学习抽象类、接口和方法的覆盖与重载。 4. 内部类(Inner Classes):Java支持内部类,...

    java英语语法知识树

    - 多态(Polymorphism):同一接口,不同实现,提供了灵活的代码设计。 - 接口(Interface):完全抽象的类,只包含常量和抽象方法。 - 抽象类(Abstract Class):不能被实例化,为其他类提供模板。 3. **异常...

    Thinking in java 4th eidtion

    《Thinking in Java》第四版是一本备受推崇的经典Java编程教材,由Bruce Eckel撰写,适用于初学者及进阶读者。本书自出版以来,便成为众多Java程序员首选的学习资料之一,不仅因其详尽而深入的内容,还因为作者对...

    Java实验报告(包含课后习题).docx

    实验报告涵盖了Java编程的基础到进阶概念,主要分为10个章节,每个章节都包含了具体的实验内容和课后习题。以下是各个实验的重点知识点: 实验3:Java流程控制 1. `continue` 和 `break` 语句的使用:在循环中,`...

    Thinking+in+Java+4th+Edition

    通过对类(class)、对象(object)、继承(inheritance)、封装(encapsulation)、多态(polymorphism)等概念的详细介绍,使读者能够熟练掌握面向对象编程的思想。 - **Java SE 5与SE 6新特性**:本书特别关注了这两个版本...

    JAVA英语语言词汇

    - **Polymorphism**: 多态,同一种类型的不同对象可以有不同的行为。 - **Interface**: 接口,定义一组方法签名,类可以实现接口以符合其规范。 2. **核心Java API词汇**: - **Collections Framework**: 集合...

    JAVA的教程.txt

    为了进一步深入学习Java,可以阅读《Java进阶教程》等权威书籍,参加在线课程,阅读技术博客,参与开发者社区讨论等。这些都是提升实战能力的优秀资源和途径。综上所述,学习Java是一个系统而深入的过程,需要持续...

    java学习资料

    OOP的核心概念包括类(Class)、对象(Object)、继承(Inheritance)、封装(Encapsulation)、多态(Polymorphism)等。通过这些概念,开发者可以构建出模块化、易于维护的代码结构。 - **类与对象**:类是具有相似属性和...

    java面试综合.zip

    二、Java进阶 对于有经验的Java开发者,面试中还会考察更高级的主题: 1. 设计模式:单例、工厂、观察者、装饰者等23种设计模式的理解和应用。 2. 泛型:泛型的使用,类型擦除,通配符等。 3. I/O流:流的分类,缓冲...

    java示例代码

    3. 多态(Polymorphism):允许你使用父类型的引用来引用子类型对象,使得同一个方法可以根据实际对象类型表现出不同的行为。 4. 接口(Interface):Java中的接口是一种完全抽象的类型,定义了一组方法的签名,...

    JAVA核心技术(一)(二)

    9. **类与对象**:深入了解类的继承(extends)、多态(polymorphism)、封装(encapsulation)和抽象(abstraction)。 10. **接口与内部类**:接口作为实现多继承的方式,以及内部类(成员内部类、局部内部类、...

    北京圣思园张龙老师JavaSE 01-11章的课堂笔记 pdf文件

    - 更深入地讨论面向对象特性,如继承(inheritance)、多态(polymorphism)、抽象(abstraction)。 - 讨论如何设计和使用类,以及类与对象之间的关系。 9. **面向对象之封装 续**: - 可能包括构造函数、方法...

Global site tag (gtag.js) - Google Analytics