17、JAVA入门——多态、抽象方法和抽象类

简介: 17、JAVA入门——多态、抽象方法和抽象类

⛳️ 一、多态


❤️  1、 认识多态

       (1)多态一词的通常含义是指能够呈现出多种不同的形式或形态。


       (2)在程序设计的术语中,它意味着一个特定类型的变量可以引用不同类型的对象,并且自动地调用引用的对象的方法,也就是根据作用到的不同对象类型,响应不同的操作。


       (3)方法重写是实现多态的基础。


       (4)多态意味着在一次方法调用中根据包含的对象的实际类型(即实际的子类对象)来决定应该调用哪个方法,而不是由用来存储对象引用的变量的类型决定的。


       当调用一个方法时,为了实现多态的操作,这个方法既是在父类中声明过的,也必须是在子类中重写过的方法。


❤️  2、 向上转型

       (1)向上转型:子类向父类的转换称为向上转型。


       (2)向上转型的语法格式如下:


               <父类型> <引用变量> = new <子类型>();


               -->将一个父类的引用指向一个子类对象称为向上转型,系统会自动进行类型转换。


               -->此时通过父类引用变量调用的方法是子类覆盖或继承了父类的方法,不是父类的方法。


               -->此时通过父类引用变量无法调用子类特有的方法。

//向上转型:父类的引用(对象名)指向子类的实例(对象)
  Animal animal = new Dog("奥迪", 30, 90, "泰迪");
  System.out.println("看病前的健康值:"+animal.getHealth());
  master.cure(animal);
  System.out.println("看病后的健康值:"+animal.getHealth());

❤️  3、 向下转型

       (1)向上转型中,父类引用变量无法调用子类特有的方法,如果需要调用子类特有的方法,可以通过把父类转换为子类来实现。


       (2)向下转型:将一个指向子类对象的父类引用赋给一个子类的引用,即将父类类型转换为子类类型,称为向下转型,此时必须进行强制类型转换。


       (3)向下转型的语法格式如下:


              <子类型> <引用变量名> = (<子类型>)<父类型的引用变量>;


       (4)上述这种向下转型的操作对接口和抽象(普通)父类同样适用。


//向下转型:子类的引用(对象名)指向父类的引用(对象名)
  Dog dog =(Dog)animal;
  dog.eat();

❤️  4、 instanceof运算符

       (1)在向下转型的过程中,如果不是转换为真实子类类型,会出现类型转换异常(ClassCastException)。


       (2)在Java中提供了instanceof运算符类进行类型的判断。


       (3)使用instanceof时,对象的类型必须和instanceof后面的参数所指定的类有继承关系,否则会出现编译错误。


       (4)instanceof通常和强制类型转换结合使用。


/*
   * 在向下转型的时候,有可能转换错误,没有转换成其指向的子类,这时候会报ClassCastException            
         * 异常
   * 我们可以在转型之前使用instanceof关键字进行判断父类引用指向了哪个子类对象
   * 
   * 
   */
  if(animal instanceof Dog){
    Dog dog2 =(Dog)animal;
    dog2.eat();
  }else if(animal instanceof Penguin){
    Penguin penguin2 = (Penguin)animal;
    penguin2.swimming();
  }else if(animal instanceof Tiger){
    Tiger tiger2 =(Tiger)animal;
    tiger2.sleep();
  }

❤️  5、多态的优势主

       -->可替换性:多态对已存在的代码具有可替换性。


       -->可扩充性:多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特征的运行和操作。实际上新加子类更容易获得多态功能。


       -->接口性:多态是父类向子类提供了一个共同接口,由子类来具体实现。


       -->灵活性:多态在应用中体现了灵活多样的操作,提高了使用效率。


       -->简化性:多态简化了应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。


❤️  6、多态的两种主要应用形式

       (1) 使用父类作为方法的形参


       (2)使用父类作为方法的返回值


⛳️ 二、抽象方法和抽象类


❤️  1、 区分普通方法和抽象方法

       (1)在Java中,当一个类的方法被abstract关键字修饰时,该方法称为抽象方法。


       (2)抽象方法所在的类必须定义为抽象类。


       (3)当一个方法被定义为抽象方法后,意味着该方法不会有具体的实现(没有方法体),而是在抽象类的子类中通过方法重写进行实现。


       (4)定义抽象方法的语法格式如下:


              [访问修饰符] abstract <返回类型> <方法名>([参数列表]);


               -->抽象方法需要使用abstract修饰,普通方法不需要。


               -->抽象方法没有方法体,普通方法没有。


               -->抽象方法所在的类必须被定义为抽象类。


               -->抽象方法在子类中必须被实现(子类要重写父类中的抽象方法),如果子类不实现,则子类要定位为抽象类。


               -->private关键字不能用来修饰抽象方法。


               -->abstract修饰符不能和final修饰符一起使用。

public abstract class Pet { 
       public abstract void toHospital() ;//抽象方法
}


❤️  2、 区分普通类和抽象类


       (1)在Java中,当一个类被abstract关键字修饰时,该类称为抽象类。


       (2)定义抽象类的语法格式如下:


               abstract class <类名>{


                       //代码


               }


               -->抽象类需要用修饰符abstract修饰,普通类不需要。


               -->普通类可以实例化,抽象类不能被实例化。


               -->抽象类中可以有抽象方法也可以没有抽象方法,可以有普通方法也可以没有普通方法。


               -->抽象类中可以包含普通类包含的一切成员。


//抽象类
public abstract class Pet { 
       public abstract void toHospital() ;//抽象方法
}

❤️  3、 定义一个抽象类

       当一个类被定义为抽象类时,它可以包含各种类型的成员,包括属性、方法等。其中方法又可以分为普通方法和抽象方法。

public abstract class 类名称{

               修饰符 abstract 返回类型 方法名();

               修饰符 返回类型 方法名(){

                       //方法体

               }

       }


❤️  4、 使用抽象类描述抽象的事物

       当一个类实例化没有意义时,可以将该类定义为抽象类


❤️  5、抽象类和抽象方法的优势

       (1)抽象类中已经实现的方法可以被子类使用,使代码可以被复用。


       (2)抽象类中的抽象方法,子类需要进行重写,保证了子类具有自身的独特性。


❤️  6、 抽象类的局限性

       (1)抽象类有时候会出现代码冗余的问题。


       (2)类的继承是单根继承,一个类只能直接继承一个类。


   


相关文章
|
13天前
|
Java 编译器
封装,继承,多态【Java面向对象知识回顾①】
本文回顾了Java面向对象编程的三大特性:封装、继承和多态。封装通过将数据和方法结合在类中并隐藏实现细节来保护对象状态,继承允许新类扩展现有类的功能,而多态则允许对象在不同情况下表现出不同的行为,这些特性共同提高了代码的复用性、扩展性和灵活性。
封装,继承,多态【Java面向对象知识回顾①】
|
16天前
|
Java
java基础(12)抽象类以及抽象方法abstract以及ArrayList对象使用
本文介绍了Java中抽象类和抽象方法的使用,以及ArrayList的基本操作,包括添加、获取、删除元素和判断列表是否为空。
16 2
java基础(12)抽象类以及抽象方法abstract以及ArrayList对象使用
|
1天前
|
Java
java中父类方法return this.对象还是变量,子类去调用this.这个方法的问题
本文探讨了在Java中,当父类的方法返回`this`对象或变量时,子类调用该方法的行为,以及`this`关键字在不同类中调用方法时的指向问题。
5 0
java中父类方法return this.对象还是变量,子类去调用this.这个方法的问题
|
2天前
|
Java
Java中抽象类和接口有什么区别?
本文阐述了Java中抽象类和接口的区别,包括类型扩展、方法/属性访问控制符、方法实现、使用目的等方面的不同,并提供了抽象类和接口的使用示例,以及Java中其他类型的类(普通类、内部类等)的简介。
6 0
Java中抽象类和接口有什么区别?
|
14天前
|
Java
Java 抽象类详解
在 Java 中,抽象类是一种特殊类,用于提供基础定义并派生具体子类,支持代码复用。它包含抽象方法(无实现)和具体方法(有实现),不能被实例化,需用 `abstract` 关键字定义。子类必须实现所有抽象方法,除非子类也是抽象类。抽象类可用于定义模板或框架,确保子类实现特定方法。通过示例展示了如何定义抽象类 `Animal` 及其子类 `Dog` 和 `Cat`,并在主类中调用相关方法。使用抽象类可以提高代码复用性和设计质量,但也可能增加维护难度和性能开销。
|
12天前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
26 4
|
14天前
|
安全 Java API
Java根据URL获取文件内容的实现方法
此示例展示了如何安全、有效地根据URL获取文件内容。它不仅展现了处理网络资源的基本技巧,还体现了良好的异常处理实践。在实际开发中,根据项目需求,你可能还需要添加额外的功能,如设置连接超时、处理HTTP响应码等。
81 4
|
16天前
|
安全 Java
java调用方法
java调用方法
21 4
|
13天前
|
Java
接口和抽象类【Java面向对象知识回顾②】
本文讨论了Java中抽象类和接口的概念与区别。抽象类是不能被实例化的类,可以包含抽象和非抽象方法,常用作其他类的基类。接口是一种纯抽象类型,只包含抽象方法和常量,不能被实例化,且实现接口的类必须实现接口中定义的所有方法。文章还比较了抽象类和接口在实现方式、方法类型、成员变量、构造方法和访问修饰符等方面的不同,并探讨了它们的使用场景。
接口和抽象类【Java面向对象知识回顾②】
|
15天前
|
Java
Java 多态趣解
在一个阳光明媚的午后,森林中的动物们举办了一场别开生面的音乐会。它们组成了一支乐队,每种动物都有独特的演奏方式。通过多态的魅力,狗、猫和青蛙分别展示了“汪汪”、“喵喵”和“呱呱”的叫声,赢得了观众的阵阵掌声。熊指挥着整个演出,每次调用 `perform()` 方法都能根据不同的动物对象唤起对应的 `makeSound()` 方法,展现了 Java 多态性的强大功能,让整场音乐会既有趣又充满表现力。