[Java]继承和多态1——继承的概念和访问

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. 小结 & 下一讲预告

本讲核心记忆点

  1. 继承用 extends,实现代码复用 + is-a 关系
  2. Java 单继承 + 多层继承
  3. 访问权限:private < 默认 < protected < public
  4. 子类只能访问父类的 非 private 成员,不同包子类只能访问 protected 和 public

下一讲(继承和多态2)

  • super 关键字(调用父类构造方法、字段、方法)
  • 方法重写(Override)规则
  • 构造方法在继承中的执行顺序

作业(建议立刻动手)

  1. 自己创建一个 Animal 父类(有 eat、sleep 方法),再创建 DogCat 子类,分别加特有方法。
  2. 把父类的字段分别改成 private / protected / public,测试子类能否访问。
  3. 把子类和父类放到不同包里,再测试 protected 的效果。

有任何问题(比如想看某个示例的完整可运行代码、或者对 protected 还是不理解),随时在评论区问我!

我们下一讲继续深入多态~ 坚持学完这个系列,你对 Java OOP 的理解会彻底上一个台阶!🚀

(本系列所有示例均基于 Java 8+ 标准,推荐用 IDEA 练习)

文章已创建 4992

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部