多态:指的是同一种事务(或者对象)的 在不同时刻表现出来的不同状态
多态的前提:
1.类与类之间存在继承关系
2.子类重写父类方法
3.父类引用指向子类对象
多态的体现
- 父类引用指向子类对象
- 子类对象赋值给父类引用
父类名 引用名 = new 子类名()
多态成员的访问方式
成员变量
- 编译看左边 运行看左边
(先左边父类的属性,,如果没有就报错)
Animal an = new Cat();
System.out.println(an.name);
成员方法
编译看左边 运行看右边(编译方法看左边,运行方法要看右边的子类当中的方法)
- 首先子类必须重写父类的同名方法
- 如果子类当中没有这个方法,会执行父类的方法
- 如果父类当中没有这个方法会报错
多态的好处
- 提高程序的可拓展性 同一个方法 我们传入不同的对象 可以实现不同的功能
- 因为 引用数据类型 不光可以接收本类型,也可以接收自己的子类对象(包含了子子孙孙无穷尽也!)对象
// 多态的应用 可拓展性,传入不同的对象 实现功能不同
public static void main(String[] args) {
Animal cat = new Cat();
Animal dog = new Dog();
show(cat);//小猫
show(dog);//狗
}
public static void show (Animal an){
System.out.println("-----调用方法");
an.eat();
}
父类
abstract class Animal {
private String name = "动物";
public abstract void eat();
}
子类
public class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗吃骨头");
}
}
public class Cat extends Animal {
private String name ="小猫";
@Override
public void eat(){
System.out.println("小猫爱吃鱼");
}
}
多态的弊端
父类引用不能访问子类的特有功能. 怎样解决 通过向下转型 实现
问题 父类引用指向子类对象是向下转型, 如果我此时只想调用子类的特有方法 需要向下转型 (强转)
public static void main(String[] args) {
Animal cat = new Cat();
Animal dog = new Dog();
cat = show(cat);//小猫
show(dog);//狗
//如果我想使用子类特有方法 向下转型 经常用 因为你一个
Dog dog1 = (Dog) dog;
dog1.call();
}
网友评论