用生命谱写代码的赞歌

0%

Java 类的多态性

类的多态性一般什么时候用?

比如Student是Person的子类

那么Person p = new Student 这个是多态我知道的,用P的引用指向堆中的new Student对象,关键这一般用在什么场合呢?还有什么时候需要用instanceOf来结合呢?

其实这个问题以前也困扰过我。我个人理解的一个应用场合就是,当你拿到一个对象的引用时(例如参数),你可能需要判断这个引用真正指向的类。所以你需要从该类继承树的最底层开始,使用instanceof操作符判断,第一个结果为true的类即为引用真正指向的类。

例如下面的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Person{}
class Student extends Person{}
class Postgraduate extends Student{}
class Animal{}
public class InstanceofTester {
public static void main(String[] args) {
instanceofTest(new Student());
}
public static void instanceofTest(Person p){
// 判断p的真正类型
if (p instanceof Postgraduate){
System.out.println("p是类Postgraduate的实例");
} else if(p instanceof Student){
System.out.println("p是类Student的实例");
} else if(p instanceof Person){
System.out.println("p是类Person的实例");
} else if(p instanceof Object) {
System.out.println("p是类Object的实例");
}
/*if(p instanceof Animal){//此错编译错误,所以做注释
System.out.println("p是类Animal的实例");
}*/
}
}

这个程序的输出结果是:p是类Student的实例

Person类所在的继承树是:Object<–Person<–Student<–Postgraduate。

这个例子中还加入一个Animal类,它不是在Person类的继承树中,所以不能作为instanceof的右操作项。

你可以跑跑程序,应该就明白什么意思了。

instanceof的应用场合应该还有其它,看看其他朋友有没补充。

补充:什么时候用多态:

在定义一个方法时,将方法的形参尽量定义为一个接口,或者是一个抽象类,这样当这个方法被掉用时,需要传入数,这时候,你就可以有选择性的传递参数了,你可以传递实现这个接口的任意一个类,这样程序的可扩展性就是最好的

instanceOf:

  1. 用instanceof来测试它所指向的对象是否是某个类。
  2. instanceof在对象类型的强制转换,先判断是否是某种类型,是的话再强制转换成改类型。