【Java 抽象类(零基础完整版超详细教程)看完彻底弄懂 】
很多初学者第一次学 抽象类 都会懵:
普通类已经能写代码了,为什么还要抽象类?
抽象方法到底是空的干嘛用?
子类到底什么时候要重写、什么时候不用?
今天我用零基础、零跳跃、全程大白话+完整代码案例,一次性把「抽象类」所有知识点讲透。
适合:零基础、期末复习、考试刷题、Java入门巩固
一、先搞懂:什么是普通类?(铺垫)
普通类就是描述具体事物的完整模板。
普通类结构:
1. 成员变量:描述特征(半径、颜色、名字)
2. 构造方法:创建对象、给属性赋值
3. 普通方法:必须有方法体 {},有完整逻辑,可以直接调用
普通类最大特点:
✅ 可以直接 new 创建对象
✅ 所有方法都写好了、能直接跑
但!普通类有一个致命缺点:
无法强制子类必须实现某些功能
于是 Java 引入了:抽象类
二、为什么需要抽象类?(核心思想)
有些类太笼统、不是具体事物,不能直接 new 对象。
举例:图形 Shape
图形包含:圆、矩形、三角形……
图形本身只是一个概念、一个模板
没有具体的形状
没有具体的计算公式
不能直接算面积、周长
所以:
通用模板 → 交给抽象类
具体实现 → 交给子类
抽象类最大作用:
1. 统一规范(所有子类必须有的方法,父类统一规定)
2. 强制子类实现功能
3. 代码复用 + 多态实现
三、什么是抽象类?
使用 abstract 修饰的类,就是抽象类。
语法:
java
abstract class 类名{}
最重要一句话(必考):
抽象类不能直接 new 对象!
只能被继承,用来当模板。
四、什么是抽象方法?(重中之重)
抽象方法是抽象类的灵魂。
抽象方法特点
1. 用 abstract 修饰
2. 没有方法体 {}
3. 直接分号结尾 ;
4. 只定义规则,不写代码实现
语法:
java
public abstract 返回值 方法名();
示例:
java
public abstract double area(); public abstract double girth();
意思:
所有图形必须能算面积、周长
怎么算?交给子类自己写
五、抽象类 和 抽象方法 关系(考试必背)
两条铁律:
1. 只要类里有抽象方法 → 此类必须是抽象类
普通类绝对不能有抽象方法!
2. 抽象类可以没有抽象方法
单纯为了不让别人 new 对象,也可以定义抽象类。
最简口诀:
有抽象方法必抽象类,抽象类可无抽象方法
六、抽象类里面到底能写什么?
很多新手以为抽象类只能写抽象方法——大错特错!
抽象类和普通类几乎一样,可以包含:
1. 成员变量
2. 构造方法
3. 普通方法(有方法体)
4. 抽象方法(无方法体)
重点:抽象类有构造方法!
作用:
子类继承时,通过 super() 调用,初始化父类属性
七、哪些方法不能定义为抽象方法?(超级高频考点)
四种绝对不能 abstract:
1. 构造方法
2. static 静态方法
3. private 私有方法
4. final 方法
大白话原因(必懂)
构造方法:必须有方法体,用来初始化对象,不能空着
静态方法:属于类,不能重写
私有方法:子类看不见、继承不到,无法重写
final 方法:禁止重写,而抽象方法必须重写 → 直接矛盾
一句话总结:
不能被重写的方法,都不能是抽象方法
八、抽象类为什么不能 new 对象?
原因超简单:
1. 抽象类有空的抽象方法,没有代码体
2. 如果能 new,对象调用空方法 → 程序无逻辑、报错
3. 抽象类设计目的:模板,不是对象
抽象类只能:被继承、被子类实现
九、子类继承抽象类的两种情况(全书最核心)
情况1:子类 没有重写完所有抽象方法
规则:
子类必须也变成抽象类(加 abstract)
结果:子类也不能 new 对象
情况2:子类 重写实现所有抽象方法
规则:
子类是普通类,不用 abstract
结果:子类 可以正常 new 对象
超简总结:
没补全 → 继续抽象
补全完 → 变成普通
十、重写抽象方法的 4 条硬性规则
子类实现抽象方法必须遵守:
1. 方法名、参数列表 完全一致
2. 返回值类型 兼容
3. 访问权限 只能放大、不能缩小(public 不能变 private)
4. 建议加上 @Override 注解
十一、完整可运行项目(Shape 图形案例)
完整整合代码
java
// 抽象父类:图形类 abstract class Shape { // 成员变量 protected String name; // 抽象类构造方法(供子类调用) public Shape(String name) { this.name = name; } // 普通方法(所有子类复用) public void showName() { System.out.println("图形名称:" + name); } // 抽象方法:强制子类实现 public abstract double area(); public abstract double girth(); } // 圆形子类 class Circle extends Shape { private double radius; private final double PI = 3.14; public Circle(String name, double radius) { super(name); this.radius = radius; } // 重写所有抽象方法 @Override public double area() { return PI * radius * radius; } @Override public double girth() { return 2 * PI * radius; } } // 矩形子类 class Rectangle extends Shape { private double length; private double width; public Rectangle(String name, double length, double width) { super(name); this.length = length; this.width = width; } // 重写所有抽象方法 @Override public double area() { return length * width; } @Override public double girth() { return 2 * (length + width); } } // 测试类 public class TestShape { public static void main(String[] args) { Shape c = new Circle("圆形", 5); Shape r = new Rectangle("矩形", 4, 6); c.showName(); System.out.println("面积:" + c.area()); System.out.println("周长:" + c.girth()); System.out.println("-------------------"); r.showName(); System.out.println("面积:" + r.area()); System.out.println("周长:" + r.girth()); } }
运行结果
plaintext
图形名称:圆形 面积:78.5 周长:31.4 ------------------- 图形名称:矩形 面积:24.0 周长:20.0
十二、零基础最易错判断题(直接背)
1. 抽象类一定有抽象方法?❌ 错
2. 普通类可以有抽象方法?❌ 错
3. 抽象类可以 new 对象?❌ 错
4. 抽象类有构造方法?✅ 对
5. static / private / 构造方法可以抽象?❌ 全错
6. 子类没写完抽象方法,必须抽象?✅ 对
十三、终极背诵口诀
抽象类,abstract,
不能new,只当模板;
有抽象方法必抽象类,
抽象类可无抽象方案;
构造静态私有final,
全都不能做抽象;
子类补完方法变普通,
少补一个还得抽象;
重写方法不能乱改,
权限只能放宽不能降。
十四、总结(学完本文你掌握了什么)
1. 理解抽象类的设计思想:模板统一规范
2. 分清抽象类、抽象方法的所有语法规则
3. 掌握「子类两种继承情况」考试核心考点
4. 熟记 4种不能抽象的方法
5. 完全掌握 Shape 图形经典案例
6. 搞定所有期末选择题、判断题、代码题考点
