Java面向对象之--多态

1.多态的基本使用

1.前提:
  a.必须有子父类继承关系,或者接口实现关系
  b.必须有方法的重写(没有方法的重写多态没有意义)
  c.父类引用指向子类对象:
    父类类型 对象名 = new 子类对象() -> 好比是 double b = 10
     
2.使用:
  a.创建子类,继承父类
  b.重写父类方法
  c.创建对象,调用重写的方法

3.注意:
  多态条件下,不能直接调用子类特有功能

public class Animal {
    public void eat(){
        System.out.println("动物要进食");
    }
}

public class Dog extends Animal{
    public void eat(){
        System.out.println("狗");
    }
    public void lookDoor(){
        System.out.println("狗能看家");
    }
}

public class Test01 {
    public static void main(String[] args) {
        //原始方式
        Dog dog = new Dog();
        dog.eat();
        dog.lookDoor();

        Animal animal = new Dog();
        animal.eat();//重写的
        //animal.lookDoor();//多态前提下,不能直接调用子类特有方法
    }
}

2.多态的条件下成员的访问特点

成员变量的访问:看等号左边是谁
public class Fu {
   int  num=1000;
}

public class Zi extends Fu{
    int num=100;
}

public class test02 {
    public static void main(String[] args) {
        Fu fu=new Zi();
        System.out.println(fu.num);
    }
}

成员方法的访问:看new的是谁
public class Fu {
   int  num=1000;
   public void method(){
      System.out.println("我是父类中的method方法");
   }
}

public class Zi extends Fu{
    int num=100;
    @Override
    public void method(){
        System.out.println("我是子类中的method方法");
    }
}

public class test02 {
    public static void main(String[] args) {
        Fu fu=new Zi();
        System.out.println(fu.num);

        fu.method();
    }
}

3.多态的好处(为什么学多态)

1.原始方式:
  a.好处:既能调用重写的,还能调用子类特有的,还能调用继承的
  b.弊端:扩展性差
      
2.多态方式:
  a.好处:扩展性强
  b.不能直接调用子类特有功能,只能调用重写的

4.多态中的转型

向上转型

父类引用指向子类对象 -> 向上转型 -> 多态默认的

向下转型

1.概述:向下转型其实就是强转,实质上就是将父类类型转成子类类型
2.比如:
  Animal animal = new Dog() -> 向上转型
  Dog dog = (Dog)animal; -> 向下转型  ->可以访问子类特有方法

 public static void method(Animal animal){
        animal.eat();

        //向下转型
        Dog dog = (Dog) animal;
        dog.lookDoor();
    }

5.转型可能会出现的问题

1.向下转型容易出现的问题:
  ClassCastException:类型转换异常
2.什么时候出现:
  当转型的时候等号左右两边类型不一致时
3.解决:
  先判断类型,再强转成对应的类型
4.关键字: instanceof -> 判断类型
    
5.使用:
  对象名 instanceof 类型   -> 判断关键字前面的对象是否属于关键字后面的类型

public class Test01 {
    public static void main(String[] args) {
        Dog dog = new Dog();
        method(dog);

        Cat cat = new Cat();
        method(cat);
    }

    public static void method(Animal animal){
        animal.eat();

        if (animal instanceof Dog){
            //向下转型
            Dog dog = (Dog) animal;
            dog.lookDoor();
        }

        if (animal instanceof Cat){
            Cat cat = (Cat) animal;
            cat.catchMouse();
        }

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值