三、多态
3.1 实现多态
3.1.1 什么是多态
- 多态性是面向对象编程的又一个重要特征
- 是指在父类中定义的属性和方法被子类继承之后,具有表现多种形态的能力特征
3.1.2 多态的定义和实现
-
一个特定类型的变量可以引用不同类型的对象,并且能够自动地调用引用对象的方法
-
也可以根据作用到不同对象类,相应不同的操作
-
可以使用父类的对象调用到子类当中被重写的方法
1. 子类到父类的转换( 向上转型 )
-
子类到父类的转换被称为向上转型
-
语法 :< 父类型 > <引用变量名> =new < 子类型 >()
类似于把int类型转为double类型
- 代码演示
父类 Animal类
public class Animal {
//动物名称
String name;
public void eat(){
System.out.println(this.name+"正在吃");
}
}
子类1 Dog类
public class Dog extends Animal{
public void eat(){
name="狗";
System.out.println(this.name+"正在吃骨头");
}
}
子类2 Cat类
public class Cat extends Animal{
public void eat(){
name="猫";
System.out.println(this.name+"正在吃桃子");
}
}
运行类 Application类
public class Application {
public static void main(String[] args) {
Animal animal=new Animal();
//多态
Animal cat=new Cat();
Animal dog=new Dog();
animal.eat();
cat.eat();
dog.eat();
}
}
- 将子类作为对象传给父类,父类可直接调用子类当中重写过父类的方法
- 父类不可以调用子类当中特有的方法
- 向上转型的两种形式
- 使用父类作为方法参数实现
- 使用父类作为方法返回值实现
2. 父类到子类的转换(向下转型)
-
当父类想要调用子类特有的方法时,可以使用向下转型
-
向上转型之后,无法使用子类当中特有的方法
-
使用向下转型,可以调用子类当中特有的方法
-
可以将父类专为子类,但是必须进行强制转换
-
语法 :
< 父类型 > <父类引用变量名> =new < 子类型>()
<子类型> <子类引用变量名> = (<子类型>) 父类引用变量名
父类 Animal类
public class Animal {
//动物名称
String name;
public void eat(){
System.out.println(this.name+"正在吃");
}
}
子类1 Dog类
public class Dog extends Animal{
public void eat(){
name="狗";
System.out.println(this.name+"正在吃骨头");
}
public void play(){
name="狗";
System.out.println(this.name+"正在玩耍");
}
}
运行类 Application类
public class Application {
public static void main(String[] args) {
Animal animal=new Animal();
//多态
Animal ani1=new Dog();
Dog dog=(Dog)ani1;
dog.eat();
dog.play();
}
}
综上所述,向下转型的父类,可以调用子类当中所有的方法
实现多态的三要素
1.继承关系的父类和子类
2.子类重写父类方法
3.父类的引用指向了子类对象
3.1.3 多态的优势
**1. 可替换性 :**多态对已存在的代码具有替换性
**2. 可扩展性:**增加新的子类不影响已存在类的多态性、继承性,已经其他特性的运行和操作。
**3. 灵活性 :**在多态在应用中,体现了灵活多样性,提高了使用效率
**4. 简化性 :**多态简化了应用软件的代码编写和修改过程,尤其是在处理大量对象的运算和操作 时,尤为突出
3.1.4 instanceof 运算符
-
如果父类在进行向下转型时,没有转换为真实的子类类型,就会出现转换异常
-
语法 :对象 instanceof 类
- 左边是对象,右边是类;当对象是右边类或子类所创建对象时,返回true;否则,返回false。
-
instanceof 运算符一般用于对象的强制转换,判断子类是否是真实的子类类型