Java面向对象--7
多态 instanceof操作符(关键字)
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
1. 多态基本使用
多态可以理解为:事物存在多种体现形态
1). 多态的基本体现
(1). 父类的引用指向了子类的对象
(2). 父类的引用作为函数的参数,可以接收子类对象
e.g.
class Animal{}
class Cat extends Animal{}
class Dog extends Animal{}
Animal ani =newCat();
从这句的语义理解:把猫传给一个动物的名字,说明这个猫也是动物的一种。(多种形态)
*******************************************************************************
但是反过来:
Cat cat =new Animal();
把动物传给一个猫的名字,说明这个动物也是猫的一种,不符合实际意义,编译出错。
2). 多态使用的前提
(1). 前提I:类和类或者类和接口之间存在关系
[1]. 类之间要么有继承关系
[2]. 要么类实现接口
(2). 前提II:在前提I的基础之上,类之间/类和接口之间的方法存在关系
存在类之间的继承关系或者类实现了接口之后,子类必须还覆盖了父类或者接口中的相应的方法。
3). 多态的好处和弊端
[1]. 多态的好处:多态大大提高了程序的可扩展性。
[2]. 多态的弊端:父类引用指向了子类的实例,这时候使用父类的引用只能访问子类从父类继承或者重写的成员,而不能通过父类的引用调用子类特有的成员。
4). 使用多态的注意事项
(1). 向上转型和向下转型
[1]. 向上转型:把子类的实例赋值给父类的引用 (也就是父类的引用指向了子类的实例)
向上转型可以通过Java自动完成。
[2]. 向下转型:把父类的引用强制转换成子类的引用
向下转型通过手动强制类型转化来完成,如果不进行强制类型转换,会编译报错。
【注意】多态自始至终都是将子类的堆内存对象做着变化
不建议:把父类的实例强制转换赋值给子类的引用。
***********这样做,编译能通过(符合语法规则就能通过),但是运行时候,直接抛出ClassCastException异常!!!***********
举例:
class Animal{
public void show(){
System.out.println("Show Animal");
}
}
class Cat extends Animal{
public void show(){
System.out.println("Show Cat");
}
}
class Dog extends Animal{
public void show(){
System.out.println("Show Dog");
}
}
public class TestAnimal{
public static void main(String[] args) {
Animalani =new Cat();
Cat cat=(Cat)new Animal();//子类引用指向了父类的实例,Javac通过!!
cat.show();
}
}
运行的时候,cat.show();抛出了异常:
2. instanceof操作符
1). 用途
(1). 使用格式:a instanceofB
a:是某个类型的实例的引用变量
B:某个类的类名
(2). 用途:用于判定引用变量a指向的实例是否是类型B的一个实例
(3). instanceof 是一个操作符,返回值是boolean类型的值
2). 使用场景
[1]. 如果一个类的子类类型很少,可以用instanceof操作符来判断指向子类实例的父类引用是否是父类的一个实例。instanceof引用到多态中
[2]. 当这个父类的子类类型很多的时候,instanceof使用起来是比较麻烦的,因为需要亲自列出很多判断。
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------