java三大特性之多态的认识,以及多态的实际应用(二)

简介: java三大特性之多态的认识,以及多态的实际应用(二)

多态的实际作用:将不同子类对象统一当作父类对象,屏蔽了不同子类之间的差异。

使用多态的好处:

  1. 应用程序不必为每一个派生类编写功能调用,只需要对抽象基类进行处理即可。大大提高程序的可复用性。//继承
  2. 派生类的功能可以被基类的方法或引用变量所调用,这叫向后兼容,可以提高可扩充性和可维护性。 //多态的真正作用,

多态的两种常见用法:

  • 1, 多态用在方法参数上, 形参可以是父类引用,实参可以传子类对象; M(A a) : 可以用A的任何子类对象作为参数
    下面程序解释了将多态定义在方法参数上,
      package test;
      /**
       * 3、定义一个动物类(Animal),里面有一个吃方法。该类有两个子  类Dog和Cat,
       * 覆盖父类中的吃方法,Dog类为打印狗 喜欢  吃骨头,Cat类为猫喜欢吃鱼。
       * 定一个饲养员类,该类中有一  个给动物喂食的方法,形参定义为Animal类型的引用。
       * 定义 Test类,创建饲养员,调用喂食方法,
       * 传入Dog对象打 印狗喜欢吃骨头,传入Cat对象打印猫喜欢吃鱼。
       */
      public class lt3{
        public static void main(String[] args) {
          //定义  Test类,创建饲养员,调用喂食方法,
          Feeder f = new Feeder();
          //创建dog对象
          Dog d = new Dog();
          //创建cat对象
          Cat c = new Cat();
          // 传入Dog对象打 印狗喜欢吃骨头,传入Cat对象打印猫喜欢吃鱼。
          f.feed(d);// 传入Dog对象打 印狗喜欢吃骨头
          f.feed(c);//传入Cat对象打印猫喜欢吃鱼。
        }
      }
      //定一个饲养员类,该类中有一个给动物喂食的方法,形参定义为Animal类型的引用。
      class Feeder{
        public void feed(Animal animal){
          animal.eat();
        }
      }
      //定义一个动物类(Animal),里面有一个吃方法。该类有两个子 类Dog和Cat,
      class Animal{
        public void eat(){
          System.out.println("Animal eat ");
        }
      }
      //覆盖父类中的吃方法,Dog类为打印狗 喜欢 吃骨头,Cat类为猫喜欢吃鱼。
      class Dog extends Animal{
        public void eat(){
          System.out.println("狗 喜欢  吃骨头");
        }
      }
      class Cat extends Animal{
        public void eat(){
          System.out.println("Cat类为猫喜欢吃鱼。");
        }
      } 
  • 2, 多态用在方法的返回值上, A m() : m方法完全可以返回A的某个子类对象

为便于理解代码已加详细注释说明:

      package testUse;
        public class useDuoT2{
          public static void main(String[] args) {
          Dog d = new Dog();
          //d作实参,调用m1;
          m1(d);
            //实参传子类对象
            m2(d);
          //再创建一个cat,用猫做对象,猫也想调用这个m1.
          Cat c = new Cat();
          //这句话就不对了,因为函数类型是Dog,这里传一个cat类型进去肯定不对了
          //想用这个可以再重载一个函数;
          m1(c);
            Animal a = m33();
            Animal a1 = m33(5);//返回Cat
            Animal a2 = m33(6);//返回Dog
        }
        //函数,dog类型
        static void m1(Dog d){
          d.sleep();
        }
        static void m1(Cat c){
          c.sleep();
        }
        //如果动物类里面有一万个子类,这种方法就不行了,难道去重载一万次?
        //不用重载,把函数参数类型改为Animal
        //然后传的时候,就可以传任何一种动物了
        //这就是多态的第一种用法:
        //1,多态用在方法参数上,  形参可以是父类引用,实参可以传子类对象;
        //M(A a) :   可以用A的任何子类对象作为参数
        static void m2(Animal a){//Animal a,形参,传父类引用,
          //如果传入的是dog类型,就输出Dog  sleep,子类会重写父类方法
          //如果传入的是cat类型,就输出Cat  sleep,
          a.sleep();
        }
        //以一个dog对象作为返回值,返回类型可以写Dog,static Dog m3(){}
        //但是实现可能会修改,如果返回值是Cat,那么返回值类型也得跟着改,
        //类型一改所有调用这个方法的代码都得跟着修改
        static Dog m3(){
          return new Dog();
        }
          //所以这个返回值类型可以写成Animal,所以只要是动物就都可以返回
          //所以调用的时候就需要一个Animal类型的引用去接这个返回值;Animal a = m33();
          //
          static Animal m33(){
            return new Dog();
          }
          //这个代码还可以再改一下;
          //这个代码可以返回dog也可以返回猫。所以只能用多态。
          //多态的第2中用法:
          //这是把多态用在方法的返回值上,
          //A   m() :  m方法完全可以返回A的某个子类对象
          static Animal m33(int n){
            if (n % 2 == 0) {
              System.out.println("return new Dog()");
              return new Dog();
            }else
              System.out.println("return new Cat()");
              return new Cat();
          }
      }
      class Animal{
        public void sleep(){
          System.out.println("Animal  sleep");
        }
      }
      class Dog extends Animal{
        public void sleep(){
          System.out.println("Dog  sleep");
        }
      }
      class Cat extends Animal{
        public void sleep(){
          System.out.println("Cat  sleep");
        }
      }

这样就实现了多态的作用:将不同子类对象统一当作父类对象,屏蔽了不同子类之间的差异。


目录
相关文章
|
1天前
|
Java 编译器 ice
【Java开发指南 | 第二十六篇】Java多态
【Java开发指南 | 第二十六篇】Java多态
11 1
|
1天前
|
Java 测试技术
Java一分钟之-正则表达式在Java中的应用
【5月更文挑战第14天】正则表达式是Java中用于文本处理的强大力量,通过`java.util.regex`包支持。常见问题包括元字符的理解、边界匹配和贪婪/懒惰量词的使用。错误通常涉及未转义特殊字符、不完整模式或过度匹配。要避免这些问题,需学习实践、使用在线工具和测试调试。示例代码展示了如何验证邮箱地址。掌握正则表达式需要不断练习和调试。
15 2
|
1天前
|
Java 编译器 开发者
Java一分钟之-Java注解的理解与应用
【5月更文挑战第12天】本文介绍了Java注解的基础知识和常见应用,包括定义、应用和解析注解。注解在编译检查、框架集成和代码生成等方面发挥重要作用。文章讨论了两个易错点:混淆保留策略和注解参数类型限制,并提供了避免策略。提醒开发者避免过度使用注解,以保持代码清晰。理解并恰当使用注解能提升代码质量。
13 3
|
1天前
|
Java API 开发者
Java中Lambda表达式的深入理解与应用
【5月更文挑战第12天】在Java 8之后,Lambda表达式已经成为了Java开发者必备的技能之一。Lambda表达式以其简洁、灵活的特点,大大提高了编程的效率。本文将深入探讨Lambda表达式的基本概念,语法规则,以及在实际开发中的应用,帮助读者更好地理解和使用Lambda表达式。
|
1天前
|
Java 程序员 API
Java 8新特性之Lambda表达式与Stream API的深度解析
【5月更文挑战第12天】本文将深入探讨Java 8中的两个重要新特性:Lambda表达式和Stream API。我们将从基本概念入手,逐步深入到实际应用场景,帮助读者更好地理解和掌握这两个新特性,提高Java编程效率。
41 2
|
1天前
|
Java
【JAVA基础篇教学】第五篇:Java面向对象编程:类、对象、继承、多态
【JAVA基础篇教学】第五篇:Java面向对象编程:类、对象、继承、多态
|
1天前
|
Java 编译器 开发者
Java一分钟之-继承:复用与扩展类的特性
【5月更文挑战第9天】本文探讨了Java中的继承机制,通过实例展示了如何使用`extends`创建子类继承父类的属性和方法。文章列举了常见问题和易错点,如构造器调用、方法覆盖、访问权限和类型转换,并提供了解决方案。建议深入理解继承原理,谨慎设计类结构,利用抽象类和接口以提高代码复用和扩展性。正确应用继承能构建更清晰、灵活的代码结构,提升面向对象设计能力。
13 0
|
1天前
|
Java
java面向对象——包+继承+多态(一)-2
java面向对象——包+继承+多态(一)
18 3
|
1天前
|
SQL Java 编译器
java面向对象——包+继承+多态(一)-1
java面向对象——包+继承+多态(一)
17 2
|
1天前
|
算法 安全 Java
深入探索Java中的并发编程:CAS机制的原理与应用
总之,CAS机制是一种用于并发编程的原子操作,它通过比较内存中的值和预期值来实现多线程下的数据同步和互斥,从而提供了高效的并发控制。它在Java中被广泛应用于实现线程安全的数据结构和算法。
22 0