1,什么是 多态:
- 在同一个行为(对象),在不同时刻表现出来的不同形态。核心还是继承。
多态,是面向对象中最重要的概念,在Java中的体现形式是:父类的引用指向子类的对象。
2,多态 的 前提 和 体现:
前提:
还有一种更推荐的格式:(先new子类或父类对象,再赋值转型)
- 这样子就能又拥有类的对象,又能互相转型;
子类/接口 对象名A = new 父类/接口();
父类/接口 对象名2 = 对象名A;
如:
SmartAudi sa = new SmartAudi();
Audi aa = sa ;
//狗是animal的子类;
Animals a=new Dog();
//注意:!!!!!!!!!!
//还有一种情况:子类对象赋值给父类对象也是多态(向上转型)的一种形式哦:
//Audi类(父类)
//smartAudi继承Audi类:
SmartAudi sa = new SmartAudi();
Audi aa = sa ;
//或者
Audi aa=new Audi();
aa = sa ;
//实际上这里的标准格式为:
Audi aa = new SmartAudi();
// 向下转型 同理;
Audi aaa=new Audi();
SmartAudi saa = (SmartAudi) aaa;
4,多态的 调用:
- 编译看左边,运行看右边;
- 看左边,父类有什么方法就只能调什么方法;看右边,运行的是子类重写父类的方法。 ```java //狗是animal的子类; Animals a=new Dog(); //这里的eat是父类的抽象方法,运行的是子类的重写方法 a.eat();
//如果子类没有,那子类将会继承父类的方法,在子类中运行父类方法
<a name="uK6ub"></a>
## 5,多态的好处和坏处:
1. 好处:多态右边可以给任意子类,提高代码的拓展性。
```java
public class Demo01 {
public static void main(String[] args) {
Animals a=new Dog();
a.setEat();
Animals a2=new Cat();
a2.setEat();
setText01(a);
setText01(a2);
}
//使用多态就可以将参数设置一个父类作引用类型来传多个子类对象,来调用对应的子类方法
public static void setText01(Animals a){
a.setEat();
}
}
- 坏处:
不能使用子类的特有功能,因为多态只能使用父类已有的方法,子类需要去重写调用;
6,多态的 引用类型的转换:
- 向上转换(自动):(见多态的格式)
父类 变量名 = new 子类();
弊端:不能使用子类特有方法。
- 向下转换(强制):
子类 变量 = (子类)父类对象名;
好处/作用:能让父类调用子类特有方法,或使用子类的属性内容。
//向上转型(多态):
Animals a=new Dog();
a.setEat();
//向下转型(强转):
Dog d=(Dog) a;
7,instanceof 关键字 (用于强转):
作用:用于判断强转的对象类型是否为需要强转的对象类型;
- 避免强制转换出现问题: 关键字 instanceof;
- 格式:变量(对象)名 instanceof类型
```java
例1:
Animals a=new Cat();
a.setEat();
//instanceof关键字,避免强制转换出现转错类型的问题
//这里要将父类对象a转成狗的对象类型b。所以先判断这个多态的子类是不是狗;
boolean b=a instanceof Dog;
//如b==true则
if (b){
Dog d=(Dog) a;
a.setEat();
}else {
System.out.println(“不是狗”);
}
例2: public void setText01(Usb u){ u.connect();
if (u instanceof Usbmouse){
Usbmouse us=(Usbmouse) u;
us.clicks();
}else if (u instanceof Usbkeyborad){
Usbkeyborad uk=(Usbkeyborad) u;
uk.Qiao();
}
u.disConnect();
} ```