首页 > 编程语言 >Java中的抽象类

Java中的抽象类

时间:2024-08-02 17:06:42浏览次数:19  
标签:Java 实现 子类 接口 抽象 抽象类 方法

目录

抽象类

抽象就是从多个事物中将共性的,本质的内容抽取出来。

抽象类

Java中可以定义没有方法体的方法,该方法的具体实现由子类完成,该方法称为抽象方法,包含抽象方法的类就是抽象类。

​ 抽象类是面向对象编程中的一个概念,它是一种特殊的类,不能被实例化,只能被继承。抽象类用于定义一组相关的对象的通用特征和行为,它可以包含抽象方法和非抽象方法。

为什么要抽象?

抽象方法和抽象类看上去是多余的,对于抽象方法,不知道如何实现,定义一个空方法体不就行了吗?而抽象类不让创建对象,看上去只是增加了一个不必要的限制。

引入抽象方法和抽象类,是Java提供的一种语法工具,对于一些类和方法,引导使用者正确使用它们,减少误用。使用抽象方法而非空方法体,子类就知道它必须要实现该方法,而不可能忽略,若忽略Java编译器会提示错误。使用抽象类,类的使用者创建对象的时候,就知道必须要使用某个具体子类,而不可能误用不完整的父类。

无论是编写程序,还是平时做其他事情,每个人都可能会犯错,减少错误不能只依赖人的优秀素质,还需要一些机制,使得一个普通人都容易把事情做对,而难以把事情做错。抽象类就是Java提供的这样一种机制。

抽象类的特征与用法

无法实例化:抽象类不能直接创建对象,只能作为其他类的父类,被其他类继承。

抽象方法:抽象类可以包含抽象方法,抽象方法是一种没有具体实现的方法,只有方法的声明而没有方法体。

格式:修饰符 abstract 返回值类型 函数名(参数列表) ; 子类继承抽象类时,必须实现(重写)所有的抽象方法。

非抽象方法:抽象类可以包含非抽象方法,非抽象方法有具体的实现代码,子类继承抽象类时可以直接继承非抽象方法。

继承和扩展:子类继承抽象类后,可以获得抽象类中定义的方法和属性,并可以在子类中添加新的方法和属性。

部分实现:抽象类可以定义一些通用的方法,而将某些方法留给子类来实现,从而实现一部分的代码复用。

抽象类的作用:抽象类用于抽象出一组相关类的共同特征和行为,提供一种统一的接口,可以作为其他类的模板或基类,通过继承实现代码的重用和扩展。

1.抽象类和抽象方法必须用abstract关键字来修饰。

2.抽象方法只有方法声明,没有方法体,定义在抽象类中。

格式:修饰符 abstract 返回值类型 函数名(参数列表) ;

3.抽象类不可以被实例化的原因:

抽象类是具体事物抽取出来的,本身是不具体的,没有对应的实例。

​ 例如:犬科是一个抽象的概念,真正存在的是狼和狗。

​ 而且抽象类即使创建了对象,调用抽象方法也没有意义。

4.抽象类通过其子类实例化,而子类需要覆盖掉抽象类中所有的抽象方法后才可以创建对象,否则该子类也是抽象类。

抽象类的好处

  1. 代码复用抽象类允许你定义一些通用的方法和属性,这些可以在多个子类中共享,从而减少代码重复。
  2. 强制实现:抽象类可以强制子类实现特定的方法,这有助于确保所有子类都遵循相同的接口规范。
  3. 封装性:抽象类可以封装一些公共的逻辑和数据,使得子类只需关注它们特有的实现细节。
  4. 多态性:抽象类支持多态性,这意味着你可以使用抽象类的引用来指向任何继承自该抽象类的实例,这有助于编写更灵活和可扩展的代码。
  5. 接口定义:抽象类可以作为接口的一种替代,它不仅可以定义方法的签名,还可以提供方法的默认实现,使得子类可以重写或扩展这些方法。
  6. 设计灵活性:在设计阶段,抽象类可以帮助开发者定义一个类的框架,而具体的实现细节可以留给子类去完成。
  7. 易于维护:由于抽象类提供了一种集中管理公共代码的方式,因此在需要修改公共逻辑时,只需要在抽象类中修改一次,所有子类都会受到影响,这使得维护和更新变得更加容易。
  8. 提高代码的可读性和清晰度:抽象类可以帮助开发者更好地组织代码结构,使得代码更加清晰和易于理解。
  9. 促进模块化:抽象类可以促进代码的模块化,使得各个模块之间的耦合度降低,提高代码的独立性。
  10. 支持模板方法设计模式:抽象类非常适合实现模板方法设计模式,其中抽象类定义了一系列步骤的算法框架,而子类则实现或扩展这些步骤的具体行为。

抽象类、实现类、接口的区别

  1. 抽象类

    • 抽象类是一种不能被实例化的类,它通常包含抽象方法和/或具体方法。

    • 抽象类可以包含成员变量和具体实现的方法,也可以包含抽象方法,这些方法由子类实现。

    • 抽象类可以提供模板方法,即包含一些具体实现的方法,同时定义一些抽象方法供子类实现。

    • 抽象类可以有构造函数,并且可以被继承。

      // 抽象类 Animal
      public abstract class Animal {
          // 抽象方法,没有方法体
          public abstract void makeSound();
      
          // 具体方法,有方法体
          public void eat() {
              System.out.println("This animal is eating.");
          }
      }
      
  2. 实现类

    • 实现类通常指的是实现了某个接口或继承了某个抽象类的具体类。

    • 实现类是可实例化的,可以创建对象。

    • 实现类必须提供接口中所有方法的具体实现,或者实现抽象类中的所有抽象方法。

    • 实现类可以有自己的属性和方法,并且可以扩展或重写父类的方法。

      // 实现类 Dog,继承自 Animal 抽象类
      public class Dog extends Animal {
          // 实现抽象方法 makeSound
          @Override
          public void makeSound() {
              System.out.println("Woof woof!");
          }
      
          // 可以添加自己的方法
          public void wagTail() {
              System.out.println("The dog is wagging its tail.");
          }
      }
      
  3. 接口

    • 接口是一种完全抽象的类型,它只包含方法的声明,不包含方法的实现。

    • 接口可以定义一组方法规范,任何实现该接口的类都必须提供这些方法的具体实现。

    • 接口不能包含成员变量,所有的属性都必须是静态常量。

    • 接口不能被实例化,但可以被实现类实现,并且实现类可以同时实现多个接口。

      // 接口 Movable
      public interface Movable {
          // 接口方法声明
          void move();
      }
      
      //实现接口的类示例
      // 实现类 Car,实现了 Movable 接口
      public class Car implements Movable {
          // 实现接口中的方法
          @Override
          public void move() {
              System.out.println("The car is moving.");
          }
      }
      

接口细节:

若接口中方法或变量没有写public,static,final / public,abstract ,会自动补齐。

接口中的成员都是共有的。

接口与接口之间是继承关系,而且可以多继承。

接口不能被实例化

一个类可以实现多个接口

在java开发中,我们经常把常用的变量,定义在接口中,作为全局变量使用,访问形式:接口名.变量名。

一个接口不能继承其它的类,但是可以继承别的接口

一个重要的原则:当一个类实现了一个接口,要求该类把这个接口的所有方法全部实现

注意

① 抽象类和接口都是用来抽象具体的对象的,但是接口的抽象级别更高。

② 抽象类可以有具体的方法和属性,接口只能有抽象方法和静态常量。

③ 抽象类主要用来抽象级别,接口主要用来抽象功能。

④ 抽象类中,且不包含任何的实现,派生类必须覆盖它们。接口中所有方法都必须是未实现的。

⑤ 接口方法,访问权限必须是公共的 public。

⑥ 接口内只能有公共方法,不能存在成员变量。

⑦ 接口内只能包含未被实现的方法,也叫抽象方法,但是不能用 abstract 关键字。

⑧ 抽象类的访问速度比接口要快,接口是稍微有点慢,因为它需要时间去寻找在类中实现的方法。

⑨ 抽象类,除了不能被实例化外,与普通 java 类没有任何区别。

⑩ 抽象类可以有 main 方法,接口没有 main 方法。

⑪ 抽象类可以用构造器,接口没有。

⑫ 抽象方法可以有 public、protected 和 default 这些修饰符,接口只能使用默认 public。

⑬ 抽象类,添加新方法可以提供默认的实现,不需要改变原有代码。接口添加新方法,子类必须实现。

⑭ 抽象类的子类用 extends 关键字继承,接口用 implements 来实现。

//同时使用抽象类和接口的示例:

// 抽象类 Vehicle,它也可以实现接口
public abstract class Vehicle implements Movable {
 // 实现 Movable 接口的 move 方法
 @Override
 public abstract void move();

 // 抽象类中可以有自己的属性
 protected String brand;

 // 抽象类中可以有具体的方法
 public void displayInfo() {
     System.out.println("Brand: " + brand);
 }
}

// 实现类 Bicycle,继承自 Vehicle 抽象类并实现了 Movable 接口
public class Bicycle extends Vehicle {
 // 实现抽象类 Vehicle 的抽象方法 move
 @Override
 public void move() {
     System.out.println("The bicycle is moving.");
 }

 // 实现 Vehicle 抽象类中的具体方法
 @Override
 public void displayInfo() {
     super.displayInfo(); // 调用父类的 displayInfo 方法
     System.out.println("Type: Bicycle");
 }
}

标签:Java,实现,子类,接口,抽象,抽象类,方法
From: https://www.cnblogs.com/hvitaska/p/18339149

相关文章

  • [Java并发]AQS详解之二
    参考资料Java并发之AQS详解一、概述谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)!类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock/Semaphore/Co......
  • java集合的三种遍历方式
    一、迭代器遍历 在遍历过程中,想删除元素可以使用迭代器遍历ps:遍历过程中不能用集合的方法进行遍历,可以用指针的remove方法进行遍历二、增强for遍历idea快捷方式集合名字.for加回车。方法的底层也是利用迭代器三、lambda表达式遍历完整格式简单格式......
  • 程序员进阶架构知识体系、开发运维工具使用、Java体系知识扩展、前后端分离流程详解、
    场景作为一名开发者,势必经历过从入门到自学、从基础到进阶、从学习到强化的过程。当经历过几年企业级开发的磨炼,再回头看之前的开发过程、成长阶段发现确实是走了好多的弯路。作为一名终身学习的信奉者,秉承持续学习、持续优化的信念。不惜耗费无数个日日夜夜,耗费大量时间精力......
  • JAVA后端拉取gitee仓库代码项目并将该工程打包成jar包
    公司当前有一个系统用于导出项目,而每次导出的项目并不可以直接使用,需要手动从gitee代码仓库中获取一个模板代码然后将他们整合到一起它才是一个完整的项目,所以目前我的任务就是编写一个java程序可以自动地从gitee仓库拉取下来那个模板代码到指定地路径上去。并且我还要将这个ja......
  • JAVA中实现队列和栈(Deque接口和ArrayDeque类)
    用什么来实现队列和栈首先JAVA中有一个Queue接口,用来实现队列。Deque其实就是双端队列,代表两端都可进可出的队列。ArrayDeque就是用数组来实现这个双端队列。(Deque由于是接口,只可以用于声明对象,但是没办法实例化,实例化还是要使用ArrayDeque类)这时可能就会产生疑惑,队列有了,......
  • Java SE核心技术——8继承
    继承是面向对象的三大特征之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义,追加属性和方法。继承是指在原有类的基础上,进行功能扩展,创建新的类型。继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模。JAVA中类只有单继承,没有多继承!继承是类和类之间的......
  • Java SE核心技术——6类与对象
    面向对象编程(Object-OrientedProgramming,简称OOP)和面向过程编程(Procedure-OrientedProgramming)是两种不同的编程范式,它们在设计和实现软件时采用了不同的方法和哲学。一、面向对象编程核心概念:面向对象编程的核心是"对象",对象可以包含数据(属性)和代码(方法)。万物皆对象。封......
  • Java SE核心技术——7封装
    封装的概述对外部隐藏内部细节1、封装的目的是隐藏对象的内部状态和实现细节,只暴露出一个可以被外界访问和操作的接口。通过将类的属性设置为私有(private),防止外部直接访问和修改这些属性。2、好处:高内聚低耦合(面向对象设计的最高原则)(1)隐藏事物的实现细节降低使用难度(2)提高了......
  • java的数据类型之基本类型
    强类型语言要求变量的使用要严格符合规定,所有变量都必须先定义后使用。如果没有按照指定要求使用变量,则该变量将报错。java就是强类型语言。java的两大数据类型1.基本类型2.引用类型其中基本类型分为八小种按照图示内容了解各个类型的字节范围(若超过该范围,则IDEA会报错)1......
  • 基于SpringBoot的智能购房推荐系统-09040(免费领源码)可做计算机毕业设计JAVA、PHP、爬
    Springboot智能购房推荐系统摘 要近年来随着我国经济的高速发展,房地产业也随之蓬勃发展,尤其是最近国家新出台的房改政策。鼓励居民购房,这对房产公司无疑是一个极好的发展势头。尤为重要的是,近几年随着信息技术和电子商务的快速发展,许多企业都开发了自己房产信息软件。智......