多态............

什么是多态

多态是同一个行为具有多个不同表现形式或形态的能力。
多态就是同一个接口,使用不同的实例而执行不同操作多态性是对象多种表现形式的体现

多态的的使用

Father p = new Son();

多态的优点

  1. 消除类型之间的耦合关系
  2. 可替换性
  3. 可扩充性
  4. 接口性
  5. 灵活性
  6. 简化性
    多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。

多态存在的三个必要条件

继承
重写
父类引用指向子类对象:Father p = new Son();

public class Test {
    public static void main(String[] args) {
      show(new Cat());  // 以 Cat 对象调用 show 方法
      show(new Dog());  // 以 Dog 对象调用 show 方法
                
      Animal a = new Cat();  // 向上转型  
      a.eat();               // 调用的是 Cat 的 eat
      Cat c = (Cat)a;        // 向下转型  
      c.work();        // 调用的是 Cat 的 work
  }  
            
    public static void show(Animal a)  {
      a.eat();  
        // 类型判断
        if (a instanceof Cat)  {  // 猫做的事情 
            Cat c = (Cat)a;  
            c.work();  
        } else if (a instanceof Dog) { // 狗做的事情 
            Dog c = (Dog)a;  
            c.work();  
        }  
    }  
}
 
abstract class Animal {  
    abstract void eat();  
}  
  
class Cat extends Animal {  
    public void eat() {  
        System.out.println("吃鱼");  
    }  
    public void work() {  
        System.out.println("抓老鼠");  
    }  
}  
  
class Dog extends Animal {  
    public void eat() {  
        System.out.println("吃骨头");  
    }  
    public void work() {  
        System.out.println("看家");  
    }  
}

向上转型

//向上转型一定是安全的,没有问题的,正确的。
//但是也有一个弊端:对象一旦向上转型 就无法调用子类特有的内容
public class Demo01Main{
public static void main(String[] args){
    // 对象的向上转型,就是:父类引用指向之类对象。
Animal animal = new Cat();
animal.eat();//猫吃鱼
animal.catMouse();//错误写法 无法调用子类特有的方法
}
}

向下转型

/向上转型一定是安全的,没有问题的,正确的。
//但是也有一个弊端:对象一旦向上转型 就无法调用子类特有的内容
public class Demo01Main{
public static void main(String[] args){
    // 对象的向上转型,就是:父类引用指向之类对象。
Animal animal = new Cat();
animal.eat();//猫吃鱼
animal.catMouse();//错误写法 无法调用子类特有的方法
// 向下转型,进行“还原”动作
Cat cat=(Cat)animal;cat.catchMouse();//猫抓老鼠
//下面是错误的向下转型
// 本来new的时候是一只猫,现在非要当做狗
// 错误写法!编译不会报错,但是运行会出现异常:
// java.lang.ClassCastException,类转换异常
Dog dog=(Dog)animal;

}
}

用instanceof运算符对向下转型的对象和类型进panduan

/*
如何才能知道一个父类引用的对象,本来是什么子类?
格式:对象 instanceof 类名称这将会得到一个boolean值结果,
也就是判断前面的对象能不能当做后面类型的实例。
*/
public class Demo02Instanceoff
public static void main(String[] args){
    Animal animal= new Cat();// 本来是一只猫
    animal.eat();//猫吃鱼
//如果希望掉用子类特有方法,需要向下转型//判断一下父类引用animal本来是不是Dog
if(animal instanceof Dog){
    Dog dog=(Dog)animal;
    dog.watchHouse();
// 判断-下animal本来是不是Cat
if(animal instanceof Cat){
    Cat cat=(Cat)animal;
    cat.catchMouse();
}
}
}
giveMeAPet(new Dog())
publicstatic void giveMeAPet(Animal animal){
    if(animal instanceof Dog){
        Dog dog =(Dog)animal;
        dog.watchHouse();
    }
    if(animal instanceof Cat){
        Cat cat=(Cat)animal;
        cat.catchMouse();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值