1.为什么要使用多态
-
同一个对象拥有多种形态
-
作用:把不同的数据类型进行统一
##2.实现多态
实现多态需要三个必要条件
-
一、要有继承关系的父类和子类;
-
二、要有子类重写父类方法;
-
三、父类的引用指向子类的对象。
1.子类到父类的转换(向上转换)
-
子类到父类的转换被称为向上转换
-
系统会自动进行类型转换
-
通过父类引用变量调用的方法是子类覆盖或继承的子类方法,不是父类的方法。
-
通过父类引用变量无法带哦用子类特有的方法
-
语法:<父类行> <引用变量名> =new <子类型>();
//子类向父类转换被称为向上转换
Aoology aoology2=new DaXiang();
//父类转向子类被称为向下转换 需要强制转换
Cat cat=(Cat) aoology2;
先创建一个父类 Aoology 动物类 里边有一个吃的方法
public class Aoology {
public void eat(){
}
}
创建一个人类 Person 里边写人要做什么事情 人要喂动物 把动物类对象作为参数
public class Person {
public void Wei(Aoology aoology)
{
aoology.eat();
}
}
在创建一个子类 Cat 猫类 继承了 Aoology 动物类 在子类里重写父类的eat方法
public class Cat extends Aoology{
public void eat()
{
System.out.println("猫在咬狗");
}
}
在 Main 方法里 创建父类对象 将父类的引用指向子类对象 然后创建 人类对象 调用方法 把父类指向子类对象的引用 放到参数里
public class Main {
public static void main(String[] args) {
Aoology aoology=new Cat();
Person person=new Person();
person.Wei(aoology);
}
}
-
将一个父类的引用指向子类对象被称为向上转换,系统会自动进行类型转换
-
通过父类引用变量调用的方法是子类重写或继承的子类方法,不是父类的方法
-
通过父类引用变量无法调用子类特有的方法
把子类的对象赋值给父类 -->向上转型
缺点
-
向上转型会自动屏蔽掉 子类中特有的方法
-
向上转型只能父类调用子类中重写过父类的方法,无法调用子类中特有的方法。
2.父类到子类的转换(向下转型)
语法
<子类型> <引用变量> =(<子类型>) <父类型的引用变量>
-
向上转型 父类无法调用子类里的特有的方法
-
向下转型 可以使用子类里特有的方法
public class Main {
public static void main(String[] args) {
Aoology aoology=new Cat();
Cat cat=(Cat)aoology;
cat.asdas();
}
}
先创建一个父类 Aoology 动物类 里边有一个吃的方法
public class Aoology {
public void eat(){
}
}
创建一个人类 Person 里边写人要做什么事情 人要喂动物 把动物类对象作为参数
public class Person {
public void Wei(Aoology aoology)
{
aoology.eat();
}
}
在创建一个子类 Cat 猫类 继承了 Aoology 动物类 在子类里重写父类的eat方法
public class Cat extends Aoology{
public void eat()
{
System.out.println("猫在咬狗");
}
}
在 Main 方法里 创建父类对象 将父类的引用指向子类对象 然后创建 人类对象 调用方法 把父类指向子类对象的引用 放到参数里
public class Main {
public static void main(String[] args) {
Aoology aoology=new Cat();
Person person=new Person();
person.Wei(aoology);
}
}
3.instanceof运算符
instanceof 运算符一般作用于向下转型 进行强制转换的时候使用
public class Main {
public static void main(String[] args) {
Aoology aoology=new Cat();
//判断 类的引用变量是否属于一个类
if(aoology instanceof Cat)
{
((Cat)aoology).asdas();
}
在强制类型转换之前通过 instanceof 运算符检查对象的真实类型,在进行相应的强制类型转换,这样避免类型转换一场,从而提高代码的健壮性。
##4.多态的优势
-
可替换性:多态对已存在的代码具有可替换性。
-
可扩充性:多态多对吗具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。
-
灵活性:在多态的应用中,体现了领过多样的操作,提高了使用效率。
-
简化性:简化了代码的编写和修改过程,提高了代码的可读性