Java基础之——多态的基本使用
多态的定义
- 同一方法可以根据发送对象的不同而采用多重不同的行为方式
- 一个对象的实际类型是确定的,但可以指向对象的引用类型有很多
- 多态就是同一个接口,使用不同的实例而执行不同操作
- 一个对象拥有多种形态,这就是:对象的多态性(Multi)
研究的问题:对象的不同形态
多态的优点
-
消除类型之间的耦合关系
-
可替换性
-
可扩充性
-
接口性
-
灵活性
-
简化性
-
提高了程序的扩展性
- 具体体现:定义方法的时候,使用父类型作为参数,将来在使用的时候,使用具体的子类型参与操作
-
弊端:不能使用子类的特有功能
多态存在的条件
- 存在继承关系
- 子类重写父类方法
- 父类引用指向子类对象
比如:Parent p = new Child();
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
class Animal {
public void eat() {
System.out.println("动物吃东西");
}
}
class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
public class Demo {
public static void main(String[] args) {
Animal a = new Cat();
}
}
成员方法/方法的访问特点
看new的是谁,就优先用谁,没有则向上找
- 父子都有,优先用子
- 子类没有,父类有,向上找到父类
Fu o = new Zi();
编译看左边,左边是Fu,Fu中没有methodZi方法,编译报错
o.methodZi(); //报错
运行看右边,运行子类的
多态中的转型
- 对象的向上转型:其实就是多态的写法,从小范围转向了大范围
- 对象的向下转型:对象一旦向上转型,那么就无法调用子类的特有方法
- 是一个还原动作:通过向下转型可以使用子类的特有方法
- 可能会丢失本来的方法
类型之间的转换:父与子之间
低类型转换为高类型,不需要强转,例如:Person obj= new Student()
高类型转化为低类型:Student s = (Student) obj
格式:
子类名称 对象名 = (子类名称) 父类对象;
Animal a = new Cat();
Cat c = (Cat) a;
instanceof操作符
如何才能知道一个父类引用的对象,本来是什么子类,这里使用instanceof判断
- X instanceof Y:如果Y是X的子类,则返回true
对象 instanceof 类型
//如果希望调用子类特有方法,需要向下转型
//判断前面的对象能不能当作后面类型的实例
if(p instanceof Dog) {
Dog dog = (Dog) p;
dog.watch();
}