Java多态

  • 多态的介绍: 
    • 同一个行为具有多个不同的表现形式或形态能力

  •  多态的前提:
    • 有继承/实现关系
    • 有方法重写
    • 有父类引用指向子类对象
  • 对象多态:
    • Animal a1 = new Dog();
    • Animal a2 = new Cat();
    • 好处:方法的形参定义为父类类型, 这个方法可以接受到该父类的任意子类对象
    • public class mAnimal{
          public static void main(String[] args) {
              Animal a1 = new Dog();
              Animal a2 = new Cat();
              useAnimal(new Dog());
              useAnimal(new Cat());
          }
      
          public static void useAnimal(Animal a){
              a.eat();
          }
      }
      
      abstract class Animal{
          public abstract void eat();
      }
      
      class Dog extends Animal{
          @Override
          public void eat(){
              System.out.println("狗吃肉");
          }
      }
      
      class Cat extends Animal{
          @Override
          public void eat(){
              System.out.println("猫吃鱼");
          }
      }
      

  • 行为多态
    • 好处:同一个方法,具有多用不同的表现形式,或形态能力
  • 多态的成员访问特点:
    • 成员变量:编译看左边(父类), 运行看左边(父类)
    • 成员方法: 编译看左边(父类), 运行看右边(子类)
    • public class PolymorphismTest {
          /*
              多态的成员访问特点:
       
                    1. 成员变量 : 编译看左边(父类), 运行看左边(父类)
       
                    2. 成员方法 : 编译看左边(父类), 运行看右边(子类)
       
                                      在编译的时候, 会检查父类中有没有这个方法
                                              没有 : 编译出错
                                              有 : 编译通过, 但是运行的时候, 一定会执行子类的方法逻辑
       
                                      原因: 担心你调用的方法, 在父类中是一个抽象方法
       
              --------------------------------------------------------------------------
       
                  多态创建对象, 调用静态成员 :
       
                          静态的成员, 推荐类名进行调用
                          细节: 静态的成员, 可以使用对象名调用, 但这是一种假象
                                          - 生成字节码文件后, 会自动将对象名调用, 改成类名调用
           */
          public static void main(String[] args) {
              Fu f = new Zi();
              System.out.println(f.num);
              f.show();
              f.print();          // Fu.print();
       
              System.out.println("-----------------");
       
              Inter i = new InterImpl();
              i.method();
          }
       
      }
       
      interface Inter {
          void method();
      }
       
      class InterImpl implements Inter {
       
          @Override
          public void method() {
              System.out.println("method...");
          }
      }
       
      class Fu {
          int num = 10;
       
          public void show() {
              System.out.println("Fu...show");
          }
       
          public static void print(){
              System.out.println("Fu...print");
          }
      }
       
      class Zi extends Fu {
          int num = 20;
       
          @Override
          public void show() {
              System.out.println("Zi...show");
          }
       
          public static void print(){
              System.out.println("Zi...print");
          }
      }
  • 多态的好处:提高程序的扩展性
  • 多态的弊端: 不能调用子类特有的成员
  • import java.util.Scanner;
     
    public class Test {
        /*
            ClassCastException : 类型转换异常
     
                    在引用数据类型的强转中, [实际类型]和[目标类型]不匹配, 就会出现此异常
         */
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入:  1. 国内订单   2. 国外订单");
     
            OrderService orderService = null;
     
            int choice = sc.nextInt();
            switch (choice) {
                case 1:
                    // 创建国内订单的业务类
                    orderService = new OrderServiceImpl(); //向上转型
                    break;
                case 2:
                    // 创建国外订单的业务类
                    orderService = new OverseasServiceImpl();
                    break;
            }
     
            // instanceof : 判断左边的引用, 是否是右边的数据类型
            if(orderService instanceof OverseasServiceImpl){
                OverseasServiceImpl osi = (OverseasServiceImpl) orderService; //向下转型
                osi.check();
            }
     
            orderService.create();
            orderService.findOne();
            orderService.findList();
            orderService.cancel();
            orderService.finish();
            orderService.paid();
        }
    }

​​​​​

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java多态指的是同一个方法名可以根据不同的对象调用出不同的行为。具体来说,多态是一种面向对象编程的特性,实现多态的方式主要有两种:方法重载和方法覆盖。方法重载指的是在一个类中定义多个同名方法,但这些方法有不同的参数列表,编译器会根据参数列表的不同选择合适的方法进行调用。方法覆盖指的是子类重写父类的方法,使得在使用父类对象调用该方法时,实际调用的是子类中的方法。 多态的好处在于,它可以提高代码的灵活性和可扩展性。通过多态,我们可以为不同的对象提供不同的行为,从而使得程序更加具有扩展性。此外,多态还可以让程序的调用更加简洁、清晰,提高了代码的可读性和可维护性。 下面是一个简单的Java多态的例子: ```Java class Animal { public void makeSound() { System.out.println("动物发出声音"); } } class Cat extends Animal { public void makeSound() { System.out.println("猫发出“喵喵”的声音"); } } class Dog extends Animal { public void makeSound() { System.out.println("狗发出“汪汪”的声音"); } } public class PolymorphismExample { public static void main(String[] args) { Animal animal1 = new Animal(); Animal animal2 = new Cat(); Animal animal3 = new Dog(); animal1.makeSound(); // 动物发出声音 animal2.makeSound(); // 猫发出“喵喵”的声音 animal3.makeSound(); // 狗发出“汪汪”的声音 } } ``` 在上面的例子中,Animal是一个父类,Cat和Dog是Animal的子类。Animal类中定义了一个makeSound()方法,Cat和Dog类分别重写了这个方法。在main()方法中,我们创建了三个Animal类型的对象,并分别调用它们的makeSound()方法。由于animal2和animal3都是Animal类型的对象,但实际上它们分别是Cat和Dog类型的对象,因此在调用它们的makeSound()方法时,实际上是调用了它们各自的实现,也就是Cat类和Dog类中重写的makeSound()方法。这就是Java多态的表现。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值