【前端学java】全网最通俗易懂的JAVA抽象概念(07)

简介: 【8月更文挑战第9天】全网最通俗易懂的JAVA抽象概念

抽象的概念

  • 抽象类抽象方法是面向对象编程中的重要概念,用于实现抽象和继承的特性。
  • 抽象类是不能被实例化的类,通常用作其他类的基类。
  • 抽象方法是在抽象类中声明但没有具体实现的方法,需要在子类中实现具体的功能。

    抽象类的用途

    假设我们开了一个汽车玩具厂,现在要造奔驰宝马系列玩具。这两种玩具的功能基本是一致,只是车的喇叭音乐不同。
    由于只是车的内置喇叭(trumpet)不同,那么我们造的时候,我们首先开发一套车的模板(Car)即可,车的骨架、内部零件什么的都用一样的。生产奔驰(Benchi)系列的车,我们去奔驰车间给他装上奔驰的内置喇叭(Benchi extends Car);生产宝马系列的车,我们去宝马(Baoma)车间给他装上宝马的内置喇叭(Baoma extends Car)。
    现在,我们奔驰系列的车模板和宝马系列的车模板就造好了,出厂每一个车的时候,给车模套上车壳就完工了。

我们把生产汽车模板的过程抽象成一个Car类

abstract class Car {
   
    String name;
    public Car(String name){
   
        this.name = name;
    }
    // 每个车都可以跑
    void run(){
   
        System.out.println(this.name + "跑起来了");
    }
    // 每个车的喇叭
    abstract void trumpet()
}

由于每个车都必须有喇叭,因此trumpet方法是必须存在的。但每个系列的车喇叭不同,因此,在Car类中,我们无法具体指明方法内容(没有写方法体)。这个trumpet方法就是一个抽象方法,我们用abstract给他标记一下。

由于Car缺少喇叭、车壳等零件(trumpet是抽象抽象方法,Car因此是抽象类),因此它无法直接生产玩具(不能实例化)。我们需要去不同车间继续完善它(只能被子类继承、完善方法)

我们去奔驰车间给他装上奔驰的喇叭,奔驰系列玩具的车模就做好了。

class Bnechi extends Car {
   
    public Bnechi(String name){
   
        super(name);
    }
    public void trumpet(){
   
        System.out.println("我是奔驰,啦啦啦");
    }
}

然后,我们去宝马车间给他装上喇叭,宝马系列的玩具车模就做好了

class Baoma extends Car {
   
    public Baoma(String name){
   
        super(name);
    }
    public void trumpet(){
   
        System.out.println("我是宝马,啦啦啦");
    }
}

最后,我们在奔驰和宝马车间就可以不断的生产玩具了。

上面的代码中,我们定义了一个sountrumpetd方法,这是Car必须有的方法,但是每个子类(奔驰、宝马)的这个方法是不同的,因此我们无法具体写成这个方法的内容。

那么,这个sound方法就是一个抽象方法,对应的,Car就是一个抽象类。Car是不完整的,因此它不能直接生产成一个玩具车(不能实例化)。

我们需要用Car这个模板来完善我们的奔驰系列玩具

public class CarFactory {
   
    public static void main(String[] args) {
   
        // 生产奔驰
        Bnechi BCA = new Bnechi("奔驰A级");
        BCA.run();
        BCA.trumpet();
        // 生产宝马
        Baoma BMW1 = new Baoma("宝马1系");
        BMW1.run();
        BMW1.trumpet();
    }
}

语法详解

抽象类

抽象类使用abstract关键字进行声明,它可以包含抽象方法普通方法
它无法直接创建抽象类的实例,只能通过继承它的子类来使用。抽象类通常用于定义类的共同特征和行为,而将具体的实现细节留给子类来完成。
示例代码:

abstract class Car {
   
    String name;
    public Car(String name){
   
        this.name = name;
    }
     // 普通方法
    void run(){
   
        System.out.println(this.name + "跑起来了");
    }
    // 抽象方法,子类需要实现具体的功能,不写函数体
    abstract void trumpet()
}
  • 声明了一个String类型的变量name,表示车的名称。
  • 定义了一个构造方法Car(String name),用于初始化车的名称。
  • 声明了一个非抽象方法run(),用于输出车名并显示它在跑。
  • 声明了一个抽象方法trumpet(),没有具体实现,需要在子类中重写。

    抽象方法

    抽象方法是在抽象类中声明但没有具体实现的方法,它使用abstract关键字进行声明。抽象方法没有方法体,只有方法签名,子类必须实现这些抽象方法,否则子类也必须声明为抽象类。
    示例代码:

    abstract class Car {
         
      String name;
      public Car(String name){
         
          this.name = name;
      }
      // 每个车都可以跑
      void run(){
         
          System.out.println(this.name + "跑起来了");
      }
      // 每个车的音乐
      abstract void trumpet();
    }
    // 子类继承父类
    class Bnechi extends Car {
         
      public Bnechi(String name){
         
          super(name);
      }
      // 子类完善父类的抽象方法
      public void trumpet(){
         
          System.out.println("我是奔驰,啦啦啦");
      }
    }
    // 子类继承父类
    class Baoma extends Car {
         
      public Baoma(String name){
         
          super(name);
      }
      // 子类完善父类的抽象方法
      public void trumpet(){
         
          System.out.println("我是宝马,啦啦啦");
      }
    }
    

    抽象类和抽象方法的使用场景:

  • 当某个类的对象不需要直接创建,而只作为其他具体类的基类模板时,可以将该类声明为抽象类。

  • 当多个类拥有相似的行为,但在具体实现上有所不同,可以将共同的行为定义在抽象类中,具体实现交给子类。
  • 抽象类和抽象方法可以帮助实现多态性,即通过父类引用指向子类对象,便于统一处理不同子类的对象。
相关文章
|
29天前
|
前端开发 关系型数据库 MySQL
【前端学java】MySQL数据库的本地安装
【8月更文挑战第12天】MySQL数据库的本地安装
35 3
|
23天前
|
Java 程序员
Java中的继承和多态:理解面向对象编程的核心概念
【8月更文挑战第22天】在Java的世界中,继承和多态不仅仅是编程技巧,它们是构建可维护、可扩展软件架构的基石。通过本文,我们将深入探讨这两个概念,并揭示它们如何共同作用于面向对象编程(OOP)的实践之中。你将了解继承如何简化代码重用,以及多态如何为程序提供灵活性和扩展性。让我们启程,探索Java语言中这些强大特性的秘密。
|
30天前
|
前端开发 Java 编译器
【前端学java】java基础练习缺少项目?看这篇文章就够了!(完结)
【8月更文挑战第11天】java基础练习缺少项目?看这篇文章就够了!(完结)
30 0
|
28天前
|
设计模式 前端开发 Java
【前端学java】SpringBootWeb极速入门-分层解耦(03)
【8月更文挑战第13天】SpringBootWeb极速入门-分层解耦(03)
15 2
【前端学java】SpringBootWeb极速入门-分层解耦(03)
|
29天前
|
开发框架 前端开发 Java
【前端学java】SpringBootWeb极速入门-实现一个简单的web页面01
【8月更文挑战第12天】SpringBootWeb极速入门-实现一个简单的web页面01
49 3
【前端学java】SpringBootWeb极速入门-实现一个简单的web页面01
|
29天前
|
前端开发 Java 编译器
【前端学java】如何从前端视角快速学习Maven
【8月更文挑战第12天】如何从前端视角快速学习Maven
39 2
【前端学java】如何从前端视角快速学习Maven
|
29天前
|
前端开发 Java Maven
【前端学java】全网最详细的maven安装与IDEA集成教程!
【8月更文挑战第12天】全网最详细的maven安装与IDEA集成教程!
59 2
【前端学java】全网最详细的maven安装与IDEA集成教程!
|
29天前
|
SQL Java 关系型数据库
【前端学java】JDBC快速入门
【8月更文挑战第12天】JDBC快速入门
16 2
【前端学java】JDBC快速入门
|
29天前
|
JSON 前端开发 Java
【前端学java】SpringBootWeb极速入门-请求参数解析(02)
【8月更文挑战第12天】SpringBootWeb极速入门-请求参数解析(02)
14 1
【前端学java】SpringBootWeb极速入门-请求参数解析(02)
|
30天前
|
前端开发 Java 程序员
【前端学java】Java中的异常处理(16)
【8月更文挑战第11天】Java中的异常处理
23 1
【前端学java】Java中的异常处理(16)