从前面的继承(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
分享到:
相关推荐
多态性(Polymorphism)是程序设计中的一种重要概念,它允许我们使用一个父类类型的引用来调用子类的方法,从而实现不同对象对同一方法的不同响应。 ### 一、多态的形式和体现 **1. 为什么需要多态性** 在实际...
多态(Polymorphism)是面向对象的另一大特性,它允许使用父类类型的引用指向子类的对象,这意味着可以设计更加通用的代码,而无需关心具体的实现细节。多态提供了更大的灵活性,使得程序可以处理多种类型的对象,只...
本篇将深入探讨面向对象进阶中的几个关键概念:多态、包、final关键字、权限修饰符以及代码块。 1. **多态(Polymorphism)**: 多态是指同一个接口,使用不同的实例而产生不同的效果。在Java中,多态主要体现在...
- Java中的面向对象的概念包括类(Class)、对象(Object)、继承(Inheritance)、封装(Encapsulation)、多态(Polymorphism)。 - Java的集合框架提供了丰富的数据结构,如List、Set、Map等。 2. Java编程...
6. 继承(Inheritance)和多态(Polymorphism):如果习题复杂度较高,可能会涉及这些面向对象的特性。 `README.txt`文件通常用来提供关于项目、代码或练习的说明和指导。在这个场景中,它可能包含了题目要求、解题...
在Java编程中,我们还会学习到类(Class)、对象(Object)、继承(Inheritance)、多态(Polymorphism)等核心概念。类是对象的蓝图,它定义了对象的属性(Fields)和行为(Methods)。对象是类的实例,具有类所...
- 多态(Polymorphism):一个接口可以有多种不同的实现,允许同一消息发送给不同类型的对象。 2. Java类和对象: - 构造器(Constructor):用于初始化新创建的对象,确保对象在使用前状态正确。 - 访问修饰符...
1. **chap07**:这部分可能涉及到Java面向对象编程的基础概念,包括类(class)、对象(object)、封装、继承(inheritance)和多态(polymorphism)。此外,还可能讲解了接口(interface)和抽象类(abstract class...
3. 多态(Polymorphism):多态是Java中另一种重要的面向对象特性,它允许使用父类引用操作子类对象,实现不同的行为。你将学习抽象类、接口和方法的覆盖与重载。 4. 内部类(Inner Classes):Java支持内部类,...
- 多态(Polymorphism):同一接口,不同实现,提供了灵活的代码设计。 - 接口(Interface):完全抽象的类,只包含常量和抽象方法。 - 抽象类(Abstract Class):不能被实例化,为其他类提供模板。 3. **异常...
《Thinking in Java》第四版是一本备受推崇的经典Java编程教材,由Bruce Eckel撰写,适用于初学者及进阶读者。本书自出版以来,便成为众多Java程序员首选的学习资料之一,不仅因其详尽而深入的内容,还因为作者对...
实验报告涵盖了Java编程的基础到进阶概念,主要分为10个章节,每个章节都包含了具体的实验内容和课后习题。以下是各个实验的重点知识点: 实验3:Java流程控制 1. `continue` 和 `break` 语句的使用:在循环中,`...
通过对类(class)、对象(object)、继承(inheritance)、封装(encapsulation)、多态(polymorphism)等概念的详细介绍,使读者能够熟练掌握面向对象编程的思想。 - **Java SE 5与SE 6新特性**:本书特别关注了这两个版本...
- **Polymorphism**: 多态,同一种类型的不同对象可以有不同的行为。 - **Interface**: 接口,定义一组方法签名,类可以实现接口以符合其规范。 2. **核心Java API词汇**: - **Collections Framework**: 集合...
为了进一步深入学习Java,可以阅读《Java进阶教程》等权威书籍,参加在线课程,阅读技术博客,参与开发者社区讨论等。这些都是提升实战能力的优秀资源和途径。综上所述,学习Java是一个系统而深入的过程,需要持续...
OOP的核心概念包括类(Class)、对象(Object)、继承(Inheritance)、封装(Encapsulation)、多态(Polymorphism)等。通过这些概念,开发者可以构建出模块化、易于维护的代码结构。 - **类与对象**:类是具有相似属性和...
二、Java进阶 对于有经验的Java开发者,面试中还会考察更高级的主题: 1. 设计模式:单例、工厂、观察者、装饰者等23种设计模式的理解和应用。 2. 泛型:泛型的使用,类型擦除,通配符等。 3. I/O流:流的分类,缓冲...
3. 多态(Polymorphism):允许你使用父类型的引用来引用子类型对象,使得同一个方法可以根据实际对象类型表现出不同的行为。 4. 接口(Interface):Java中的接口是一种完全抽象的类型,定义了一组方法的签名,...
9. **类与对象**:深入了解类的继承(extends)、多态(polymorphism)、封装(encapsulation)和抽象(abstraction)。 10. **接口与内部类**:接口作为实现多继承的方式,以及内部类(成员内部类、局部内部类、...
- 更深入地讨论面向对象特性,如继承(inheritance)、多态(polymorphism)、抽象(abstraction)。 - 讨论如何设计和使用类,以及类与对象之间的关系。 9. **面向对象之封装 续**: - 可能包括构造函数、方法...