目录
抽象类
抽象就是从多个事物中将共性的,本质的内容抽取出来。
抽象类
Java中可以定义没有方法体的方法,该方法的具体实现由子类完成,该方法称为抽象方法,包含抽象方法的类就是抽象类。
抽象类是面向对象编程中的一个概念,它是一种特殊的类,不能被实例化,只能被继承。抽象类用于定义一组相关的对象的通用特征和行为,它可以包含抽象方法和非抽象方法。
为什么要抽象?
抽象方法和抽象类看上去是多余的,对于抽象方法,不知道如何实现,定义一个空方法体不就行了吗?而抽象类不让创建对象,看上去只是增加了一个不必要的限制。
引入抽象方法和抽象类,是Java提供的一种语法工具,对于一些类和方法,引导使用者正确使用它们,减少误用。使用抽象方法而非空方法体,子类就知道它必须要实现该方法,而不可能忽略,若忽略Java编译器会提示错误。使用抽象类,类的使用者创建对象的时候,就知道必须要使用某个具体子类,而不可能误用不完整的父类。
无论是编写程序,还是平时做其他事情,每个人都可能会犯错,减少错误不能只依赖人的优秀素质,还需要一些机制,使得一个普通人都容易把事情做对,而难以把事情做错。抽象类就是Java提供的这样一种机制。
抽象类的特征与用法
无法实例化:抽象类不能直接创建对象,只能作为其他类的父类,被其他类继承。
抽象方法:抽象类可以包含抽象方法,抽象方法是一种没有具体实现的方法,只有方法的声明而没有方法体。
格式:修饰符 abstract 返回值类型 函数名(参数列表) ;
子类继承抽象类时,必须实现(重写)所有的抽象方法。
非抽象方法:抽象类可以包含非抽象方法,非抽象方法有具体的实现代码,子类继承抽象类时可以直接继承非抽象方法。
继承和扩展:子类继承抽象类后,可以获得抽象类中定义的方法和属性,并可以在子类中添加新的方法和属性。
部分实现:抽象类可以定义一些通用的方法,而将某些方法留给子类来实现,从而实现一部分的代码复用。
抽象类的作用:抽象类用于抽象出一组相关类的共同特征和行为,提供一种统一的接口,可以作为其他类的模板或基类,通过继承实现代码的重用和扩展。
1.抽象类和抽象方法必须用abstract关键字来修饰。
2.抽象方法只有方法声明,没有方法体,定义在抽象类中。
格式:修饰符 abstract 返回值类型 函数名(参数列表) ;
3.抽象类不可以被实例化的原因:
抽象类是具体事物抽取出来的,本身是不具体的,没有对应的实例。
例如:犬科是一个抽象的概念,真正存在的是狼和狗。
而且抽象类即使创建了对象,调用抽象方法也没有意义。
4.抽象类通过其子类实例化,而子类需要覆盖掉抽象类中所有的抽象方法后才可以创建对象,否则该子类也是抽象类。
抽象类的好处
- 代码复用:抽象类允许你定义一些通用的方法和属性,这些可以在多个子类中共享,从而减少代码重复。
- 强制实现:抽象类可以强制子类实现特定的方法,这有助于确保所有子类都遵循相同的接口规范。
- 封装性:抽象类可以封装一些公共的逻辑和数据,使得子类只需关注它们特有的实现细节。
- 多态性:抽象类支持多态性,这意味着你可以使用抽象类的引用来指向任何继承自该抽象类的实例,这有助于编写更灵活和可扩展的代码。
- 接口定义:抽象类可以作为接口的一种替代,它不仅可以定义方法的签名,还可以提供方法的默认实现,使得子类可以重写或扩展这些方法。
- 设计灵活性:在设计阶段,抽象类可以帮助开发者定义一个类的框架,而具体的实现细节可以留给子类去完成。
- 易于维护:由于抽象类提供了一种集中管理公共代码的方式,因此在需要修改公共逻辑时,只需要在抽象类中修改一次,所有子类都会受到影响,这使得维护和更新变得更加容易。
- 提高代码的可读性和清晰度:抽象类可以帮助开发者更好地组织代码结构,使得代码更加清晰和易于理解。
- 促进模块化:抽象类可以促进代码的模块化,使得各个模块之间的耦合度降低,提高代码的独立性。
- 支持模板方法设计模式:抽象类非常适合实现模板方法设计模式,其中抽象类定义了一系列步骤的算法框架,而子类则实现或扩展这些步骤的具体行为。
抽象类、实现类、接口的区别
-
抽象类:
-
抽象类是一种不能被实例化的类,它通常包含抽象方法和/或具体方法。
-
抽象类可以包含成员变量和具体实现的方法,也可以包含抽象方法,这些方法由子类实现。
-
抽象类可以提供模板方法,即包含一些具体实现的方法,同时定义一些抽象方法供子类实现。
-
抽象类可以有构造函数,并且可以被继承。
// 抽象类 Animal public abstract class Animal { // 抽象方法,没有方法体 public abstract void makeSound(); // 具体方法,有方法体 public void eat() { System.out.println("This animal is eating."); } }
-
-
实现类:
-
实现类通常指的是实现了某个接口或继承了某个抽象类的具体类。
-
实现类是可实例化的,可以创建对象。
-
实现类必须提供接口中所有方法的具体实现,或者实现抽象类中的所有抽象方法。
-
实现类可以有自己的属性和方法,并且可以扩展或重写父类的方法。
// 实现类 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."); } }
-
-
接口:
-
接口是一种完全抽象的类型,它只包含方法的声明,不包含方法的实现。
-
接口可以定义一组方法规范,任何实现该接口的类都必须提供这些方法的具体实现。
-
接口不能包含成员变量,所有的属性都必须是静态常量。
-
接口不能被实例化,但可以被实现类实现,并且实现类可以同时实现多个接口。
// 接口 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 来实现。
标签:Java,实现,子类,接口,抽象,抽象类,方法 From: https://www.cnblogs.com/hvitaska/p/18339149//同时使用抽象类和接口的示例: // 抽象类 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"); } }