Java 继承和多态系列 —— 第1讲:继承的概念和访问权限
大家好!这是《Java继承和多态》系列的第一篇,我们先从继承(Inheritance)的核心概念和访问权限控制开始讲起。这部分是面向对象编程(OOP)的基石,后续的多态、重写、向上转型等都建立在继承之上。
1. 继承的概念
继承就是让一个类(子类 / Subclass)自动获得另一个类(父类 / Superclass,也叫基类、超类)的属性(字段)和行为(方法),从而实现代码复用。
- 现实比喻:你继承了父母的“眼睛颜色”和“身高”基因,不用自己重新“写”一遍。
- 代码中:子类通过
extends关键字继承父类。
核心好处:
- 提高代码复用性(不用重复写相同的字段和方法)
- 体现 is-a 关系(子类“是”父类的一种,例如 Student is a Person)
- 为多态奠定基础
Java继承特点(非常重要!):
- 单继承:一个类只能有一个直接父类(不支持多继承,避免菱形继承问题)
- 支持多层继承:可以形成继承链(如 Animal → Mammal → Dog)
- 所有类默认继承
java.lang.Object(即使不写extends Object)
// 父类(基类)
class Person {
String name;
int age;
public void eat() {
System.out.println(name + "正在吃饭");
}
}
// 子类
class Student extends Person { // 使用 extends 继承
int score; // 子类自己新增的字段
public void study() {
System.out.println(name + "正在学习,得分:" + score);
}
}
使用示例:
public class Test {
public static void main(String[] args) {
Student s = new Student();
s.name = "小明"; // 直接使用父类的字段
s.age = 18;
s.score = 95;
s.eat(); // 调用父类方法
s.study(); // 调用子类方法
}
}
2. 继承中的访问权限(最容易混淆的部分!)
Java 有 4 种访问修饰符,它们控制“谁能看到这个成员(字段/方法)”。
在继承关系中,子类能否直接访问父类的成员 完全取决于修饰符。
访问权限对比表(重点背诵!)
| 修饰符 | 本类 | 同包其他类 | 同包子类 | 不同包子类 | 不同包无关类 | 备注 |
|---|---|---|---|---|---|---|
| private | √ | × | × | × | × | 最严格,只在本类 |
| 默认(无修饰符) | √ | √ | √ | × | × | 包级私有 |
| protected | √ | √ | √ | √ | × | 继承专用,不同包子类也能访问 |
| public | √ | √ | √ | √ | √ | 完全公开 |
关键规则总结:
private:子类完全无法访问(包括字段和方法),即使是继承也不行!(封装性最强)- 默认(包访问权限):只有同一个包的子类能访问
protected:推荐在继承中使用!同包所有类 + 不同包的子类都能访问public:任何地方都能访问
实际代码演示(强烈建议自己敲一遍)
// Person.java (父类)
package com.example.base; // 假设父类在 base 包
public class Person {
private String privateField = "私有字段"; // 子类无法访问
String defaultField = "默认字段"; // 同包子类能访问
protected String protectedField = "受保护字段"; // 不同包子类也能访问!
public String publicField = "公开字段";
private void privateMethod() { }
void defaultMethod() { }
protected void protectedMethod() { System.out.println("protected方法"); }
public void publicMethod() { }
}
// Student.java (子类,在不同包)
package com.example.school; // 不同包
import com.example.base.Person;
public class Student extends Person {
public void test() {
// System.out.println(privateField); // 编译错误!
// defaultMethod(); // 编译错误!不同包
System.out.println(protectedField); // √ 可以
protectedMethod(); // √ 可以
System.out.println(publicField); // √ 可以
publicMethod();
}
}
为什么 protected 这么重要?
- 它既保护了父类的封装(外界普通类无法访问),又给了子类足够的扩展能力。
- 几乎所有框架(Spring、MyBatis等)的父类都大量使用 protected。
3. 小结 & 下一讲预告
本讲核心记忆点:
- 继承用
extends,实现代码复用 + is-a 关系 - Java 单继承 + 多层继承
- 访问权限:
private< 默认 <protected<public - 子类只能访问父类的 非 private 成员,不同包子类只能访问 protected 和 public
下一讲(继承和多态2):
super关键字(调用父类构造方法、字段、方法)- 方法重写(Override)规则
- 构造方法在继承中的执行顺序
作业(建议立刻动手):
- 自己创建一个
Animal父类(有 eat、sleep 方法),再创建Dog、Cat子类,分别加特有方法。 - 把父类的字段分别改成 private / protected / public,测试子类能否访问。
- 把子类和父类放到不同包里,再测试 protected 的效果。
有任何问题(比如想看某个示例的完整可运行代码、或者对 protected 还是不理解),随时在评论区问我!
我们下一讲继续深入多态~ 坚持学完这个系列,你对 Java OOP 的理解会彻底上一个台阶!🚀
(本系列所有示例均基于 Java 8+ 标准,推荐用 IDEA 练习)