文章目录
- 💨更多相关知识👇
 - 
- 一、多态的概述
 - 二、多态的前提
 - 
- 🌟代码演示
 
 - 三、多态中成员访问特点
 - 
- 🍂成员方法的访问特点
 - 
- 🌟代码演示
 
 - 🍂成员变量的访问特点
 - 
- 🌟代码演示
 
 
 - 四、多态的优缺点
 - 
- 🍍多态的优点
 - 🍍多态的缺点
 
 - 五、多态的类型转换
 - 
- 🍖向上转型:子类到父类(自动类型转换)(小变大)
 - 🍖向下转型:父类到子类(强制类型转换) (大变小)
 - 🍖向下转型的风险
 - 
- 💯 解决方法
 - 
- 🌟代码演示
 
 
 
 - 六、多态的应用
 - 
- 🌟代码演示
 
 - 七、多态的综合案例
 - 
- 🌟代码演示
 
 
 - 作者:KJ.JK
 
💨更多相关知识👇
💖基于Spring+SpringMVC+Mybatis在线weiit-saas微信小程序电商系统
💖Spring中的bean的配置、作用范围、生命周期详细描述及使用(XML版上篇)
💖异常处理与解决方案详解上篇
💖异常处理与解决方案详解下篇
💖Math类与System类的常用方法使用
💖JavaEE中的静态方法定义、方法重载要求、return作用详解
💖List接口的常用方法,精华总结
💖JavaEE中的Stream流的常用方法
💖JavaEE中的Stream流知识点使用,精华总结,一文直接上手
🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈
🍂个人博客首页: KJ.JK
欢迎大家点赞👍收藏💖评论💬关注🔒
💖源码获取 | 💻学习交流 | 🤝商务合作 | 💨私信作者
💨推荐一款实用的模拟面试、刷题练习算法的神器、适用于所有的程序猿👉点击开始免费刷题,跟着博主走上巅峰💪
一、多态的概述
         多态是"同一个行为"具有"多种不同表现形式"   (同一个对象,在不同时刻表现出来的不同形态)
             
在Java中的体现形式是:
               * 父类的引用指向子类的对象
               * 接口的引用指向实现类的对象
二、多态的前提
 多态的前提:
             1.有继承关系/接口的实现
                 
             2.方法重写
                 
             3.父类引用指向子类对象               (还可以接口指向实现类)
                //Animal  d=new Dog();      //Usb u=new Mouse();
🌟代码演示
//父类动物
public class Animal {
public  void eat(){
    
    System.out.println("吃饭");
}
    public void run() {
    }
}
//子类猫
public class cat extends Animal{
    @Override
    public void eat() {
        
        System.out.println("猫吃鱼");
    }
}
//子类狗
public class Dog extends  Animal{
    @Override
    public void eat() {
        System.out.println("狗吃肉");
    }
}
//测试类
public class Test {
    public static void main(String[] args) {
        //父类引用指向子类对象
        Animal  d=new Dog();
        d.eat();
        Animal  c=new cat();
        c.eat();
    }
}

三、多态中成员访问特点
🍂成员方法的访问特点
               编译看左边(父类), 执行看右边(子类)
🌟代码演示
//父类人
public class Person {
    public void eat(){
        
        System.out.println("人吃饭");
    }
}
//子类狗
public class Dog extends  Person{
    @Override
    public void eat() {
        System.out.println("狗吃饭");
    }
    public  void run(){
        System.out.println("狗跑");
    }
}
//测试类
public class Test {
    /*
    多态的成员特点:
        对象 d 能调用什么方法,由对象 d左边 的父类 Person决定
        方法运行起来的效果,由对象 d 右边 new出来的子类 Dog决定
     */
    public static void main(String[] args) {
        Person  d=new Dog();
        d.eat();
//        d.run();    //报错,父类Person里面没有这个方法
                     //这个是多态的缺点,  多态下不能使用子类的特有功能
    }
}

🍂成员变量的访问特点
          编译看左边(父类),执行看左边 (父类)    (变量没有多态性)
🌟代码演示
//父类人
public class Person {
    String name="人类";
}
//子类狗
public class Dog extends  Person{
    String name="萨摩耶";
}
//测试类
public class Test {
    /*
     变量的访问特点:
     
             编译看左边(父类),运行也看左边(父类)
            对象 d能够访问哪些成员变量,以及变量的结果是多少,全部
            取决于 d 左边的父类Person(即变量没有多态性)
     */
    public static void main(String[] args) {
        Person d=new Dog();
        System.out.println(d.name);
    }
}

🔥系列热门专栏🔥:
⚡《JavaEE进阶序列 | 从小白到工程师》系列文章⚡
⚡《JavaEE项目实战》系列文章⚡
⚡《JavaSwing项目合集》系列文章⚡
⚡《数据分析中的pandas》系列文章⚡
四、多态的优缺点
🍍多态的优点
                 * 提高代码的扩展性
                  
                 * 定义方法时,如果将 "父类" 或 "接口" 作为参数,在调用方法时,可以传递任意子类对象极大提高方法的通用性
🍍多态的缺点
             多态下不能使用子类的特有功能    (可以通过强转解决)

五、多态的类型转换
🍖向上转型:子类到父类(自动类型转换)(小变大)
        例子:
                Dog dog = new Dog();
                
                Animal a = dog;  //向上转型
🍖向下转型:父类到子类(强制类型转换) (大变小)
        例子:
               Animal a=new cat();
               
               cat c= (cat) a;
               
               c.catchMouse();
/*
向下转型好处:
         由于多态下不能使用子类的特有功能
         所以向下转型后,就"可以调用子类的特有功能"
*/

🍖向下转型的风险
      如果父类引用的 "实际类型" 与要转换的 "目标类型" 不同,就会出现类型转换异常:ClassCastException

💯 解决方法
使用 "instanceof" 关键字进行类型判断
              
          格式: 对象名 instanceof 类名             
              
          范例: a instanceof  cat
              
          作用: 判断左边的对象是否属于右边的类型,是返回true,否返回false  
🌟代码演示
//父类动物
public class Animal {
    public void eat(){
        System.out.println("动物吃饭");
    }
}
//子类猫
public class cat extends  Animal{
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }
    public void catchMouse(){
        System.out.println("猫抓老鼠");
    }
}
//子类狗
public class Dog extends  Animal {
    @Override
    public void eat() {
        System.out.println("狗吃饭");
    }
    public void run() {
        System.out.println("狗跑");
    }
}
//测试类
public class Test {
    public static void main(String[] args) {
        cat c=new cat();
        showskill(c);
        System.out.println("------");
        Dog dog=new Dog();
        showskill(dog);
    }
    public  static  void showskill(Animal a){
        a.eat();
        if(a instanceof  cat){
           cat  c2 =(cat) a;
           c2.catchMouse();
        }
        if(a instanceof  Dog){
            Dog dog=(Dog) a;
            dog.run();
        }
    }
}

六、多态的应用
         将 "方法的参数" 设计为 "父类" 或 "接口" ,调用方法时可以传入 "任意的子类"
             
         好处: "提高方法的适用性"    
🌟代码演示
//父类动物
public class Animal {
    String name="动物";
    public  void eat(){
        System.out.println("吃饭");
    }
}
//子类猫
public class Cat extends Animal{
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }
}
//子类狗
public class Dog extends Animal {
    String name="狗子";
    @Override
    public void eat() {
        System.out.println("狗吃肉");
    }
}
//测试类
public class Person {
    public static void main(String[] args) {
        Dog d=new Dog();
        feed(d);
        System.out.println("-----");
        Cat c=new Cat();
        feed(c);
    }
    //改进后
    //多态的应用:将方法的参数设计为父类或接口,调用方法时可以传入任意的子类
    //好处:提高方法的适用性
    public  static  void feed(Animal d){
        System.out.println("开始");
        d.eat();
        System.out.println("结束");
    }
    /*
        原来太过繁琐这样子
     */
//    public  static  void feed(Dog d){
//        System.out.println("开始");
//
//        d.eat();
//
//        System.out.println("结束");
//    }
//
//    public  static  void feed(Cat c){
//        System.out.println("开始");
//
//        c.eat();
//
//        System.out.println("结束");
//    }
}

七、多态的综合案例

🌟代码演示
//接口类
public interface USb {
    public  abstract  void connect();
    public  abstract  void exit();
}
//子类键盘
public class KeyBoard implements USb{
    @Override
    public void connect() {
        System.out.println("键盘连接");
    }
    @Override
    public void exit() {
        System.out.println("键盘退出");
    }
    public  void input(){
        System.out.println("键盘输入");
    }
}
//子类鼠标
public class Mouse implements   USb{
    @Override
    public void connect() {
        System.out.println("鼠标连接");
    }
    @Override
    public void exit() {
        System.out.println("鼠标退出");
    }
    public void click(){
        System.out.println("鼠标单击");
    }
}
//测试类
public class Computer {
    public static void main(String[] args) {
        Computer c=new Computer();
        Mouse mouse=new Mouse();
        c.useDevice(mouse);
        System.out.println("---------");
        KeyBoard keyBoard=new KeyBoard();
        c.useDevice(keyBoard);
        System.out.println("---------");
    }
    public  void useDevice(USb u){
        u.connect();
        if(u instanceof  Mouse){
            Mouse m=(Mouse) u;
            m.click();
        }
        if( u instanceof  KeyBoard){
            KeyBoard k=(KeyBoard) u;
            k.input();
        }
        u.exit();
    }
}

作者:KJ.JK
文章对你有所帮助的话,欢迎给个赞或者 star,你的支持是对作者最大的鼓励,不足之处可以在评论区多多指正,交流学习
 
                    版权声明:程序员胖胖胖虎阿 发表于 2022年9月3日 下午5:48。
转载请注明:【JavaEE进阶系列 | 从小白到工程师】JavaEE中的面向对象之多态,长文解析使用 | 胖虎的工具箱-编程导航
                    
            转载请注明:【JavaEE进阶系列 | 从小白到工程师】JavaEE中的面向对象之多态,长文解析使用 | 胖虎的工具箱-编程导航
相关文章
暂无评论...
