`

009 面向对象之多态

 
阅读更多

面向对象之多态

 

 

在Java中,对象变量是多态的。一个类型为Aclass的变量既可以指向类型为Aclass的对象,又可以指向Aclass的任何子类的对象。


以多态的形式来传递参数,增强了参数类型的灵活性。


现在假设有一个类Aclass,由它派生了一个子类Bclass,那么,我们可以将子类Bclass的对象赋给父类变量:
Aclass a = new Bclass();


这其实体现了Java中的所谓“替换原则(substitution principle)”:无论何时,只要程序需要一个父类对象,那么就可以用一个子类对象来替代它。


多态带来的一个明显的好处就是:以多态的形式来传递参数,增强了参数类型的灵活性


例如,我们需要在学校管理系统的某个类(假设为CalClass)中定义一个方法来根据学生或老师的年龄来计算相应的出生年代(此处“Teacher”类和“Stucent”类均为“Person”类的子类),可以这样来定义这个方法:
public class CalClass{
 … …
 public int calTeacherBirthYear(Teacher t){
  // 根据参数t的年龄来计算教师的出生年代
 }
 public int calStudentBirthYear(Student s){
  // 根据参数s的年龄来计算学生的出生年代
 }
}
如果使用多态的概念,我们只要定义一个方法来计算就可以了:
public class CalClass{
 .. …
 public int calPersonBirthYear(Person p) {
  // 根据参数p的年龄来计算出生年代
 }
}


如果需要计算某个学生的出生年代,只需要将这个学生对应的对象当作参数传递给这个方法,如果需要计算某个老师的出生年代,只需要将这个老师对应的对象当作参数传递给这个方法。


在使用多态来传递参数的时候,有一个问题需要注意:一个对象只能有一种确切的数据类型,如果将一个变量声明为父类的引用类型,那么,即使它引用的对象是某个子类的对象,编译器也只是将这个对象当作是父类型对象,因此,若一个引用类型变量如果声明为父类的类型,但实际引用的是子类对象,那么该变量就不能再访问子类中添加的属性和方法。


比如,我们用Person来声明一个变量,然后再将这个变量指向Teacher,这个时候,就不能用这个变量来调用子类Teacher特有的方法或属性了:
 Person p;
 p = new Teacher();
 p.setDepartment(“数学教研室”);//错误


除了父类和子类之间的这种多态机制外,接口和实现它的类之间也可以象父类和子类一样实现多态机制,只需要简单的将接口看成实现它的类的“父类”即可

 

 

1. 多态(Polymorphism):我们可以这样表达:子类是父类(玫瑰是花,男人是人),因此多态的意思就是:父类型的引用可以指向子类的对象。<PolyTest.java>

2. 当使用多态方式调用方法时,首先检查父类中是否存在被调用的方法,如果没有则编译错误;如果有,再去调用并执行子类的方法,注意,父类的方法并不被执行。

理解:如果一个父类型的引用指向子类型的对象,那么用这个引用只能调用父类中存在的方法。因为,在编译时,程序会先去父类中寻找相应的方法。<PolyTest.java>

3. 一共有两种类型的强制类型转换:

a) 向上类型转换(upcast):比如说将Cat类型转换为Animal类型,即将子类型转换为父类型。对于向上类型转换,不需要显式指定。

b) 向下类型转换(downcast):比如将Animal类型转换为Cat类型。即将父类型转换为子类型。对于向下类型转换,必须要显式指定(必须要使用强制类型转换)。

理解:

1、父类引用指向子类对象时,此引用若想调用子类中有但父类中没有的方法,可以通过把父类引用向下类型转化来完成。

2、子类上层类型的引用最多可以被强制向下转化他所指向的对象的类型,在引用类型和子类对象之间的类型都可以强制转化。不能转化为跟子类对象同级的其他对象类型。

c)向下类型转化的作用

由于指向子类对象的父类引用不能调用子类独有的方法,因此通过向下类型转化为子类后就可以调用了。

d)向上类型转换的作用

[ PolyTest3.java]

 

多态是一种运行中的行为,在编译阶段Java是不知道其实际行为的。

[PolyTest5.java]

 

e)多态的好处

比较程序:[ PolyTest6.java][PolyTest7.java]

 

一个随机取数据程序:

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics