Java继承全攻略:从零基础到精通
步入大一下学期的 Java 学习,面向对象编程的核心特性逐渐深入,继承作为三大特性之一,不仅是代码复用的关键,更是学习后续多态、方法重写等知识的基础。刚接触继承时,总觉得知识点零散、关联内容繁杂,特意整理了这篇笔记,把继承本身以及所有配套必学知识点一次性讲透,适合和我一样的 Java 新手参考学习。
一、先搞懂:什么是继承?为什么要用继承?
在生活中,子女会继承父母的外貌、性格等特征,而 Java 中的继承,是子类继承父类的属性和方法,让子类无需重复编写代码,直接拥有父类的成员,同时还能扩展自己独有的功能。
1. 核心概念
- 父类(超类 / 基类):被继承的类,存放多个类的公共属性和方法,是通用模板。
- 子类(派生类):继承父类的类,拥有父类非私有成员,可新增专属内容。
2. 继承的作用
- 减少代码冗余:抽取重复代码到父类,避免反复编写,提升编码效率。
- 便于后期维护:修改父类代码,所有子类都会同步生效,降低维护成本。
- 体现面向对象设计思想:实现类与类之间的逻辑关联,贴合现实世界的层级关系。
3. 继承的语法
Java 中使用extends关键字实现类的继承,语法格式如下:
class 子类名 extends 父类名 { // 子类独有属性 // 子类独有方法 }注意:Java 的类只支持单继承,一个子类只能有一个直接父类,但可以多层继承(如 A 继承 B,B 继承 C),不支持多继承。
二、基础案例:快速理解继承
以生活中常见的「人类 - 学生类」为例,直观展示继承的使用:
1. 父类 Person(人类)
// 父类:抽取学生、老师的公共属性和方法 public class Person { // 公共属性 String name; int age; // 公共方法 public void eat() { System.out.println("人需要吃饭补充能量"); } public void sleep() { System.out.println("人需要睡觉休息"); } }2. 子类 Student(学生类)
// 子类继承父类,拥有父类所有非私有成员 public class Student extends Person { // 子类独有属性:学号 String studentId; // 子类独有方法:学习 public void study() { System.out.println(name + "正在学习Java,年龄:" + age); } }3. 测试类
public class TestExtends { public static void main(String[] args) { Student student = new Student(); // 赋值父类继承的属性 student.name = "小明"; student.age = 19; // 调用父类方法 student.eat(); student.sleep(); // 调用子类独有方法 student.study(); } }运行结果
人需要吃饭补充能量 人需要睡觉休息 小明正在学习Java,年龄:19可以看到,子类 Student 没有定义 name、age 属性和 eat、sleep 方法,却能直接使用,这就是继承的核心魅力。
三、继承核心关联知识点(必学!)
1. super 关键字:子类访问父类的钥匙
super 是继承中必不可少的关键字,专门用于子类中访问父类的成员,主要有三种用法:
super.成员变量:访问父类的属性(解决子类与父类属性重名问题)super.成员方法():调用父类的方法super():调用父类的构造方法,必须放在子类构造方法第一行
代码示例:
public class Student extends Person { // 子类属性与父类重名 String name = "子类姓名"; public Student() { // 调用父类无参构造,默认隐藏,不写也会自动执行 super(); } public void showName() { // 访问父类name属性 System.out.println(super.name); // 访问子类name属性 System.out.println(this.name); } }2. 方法重写(Override):子类优化父类方法
子类可以对父类中现有方法进行重新实现,满足子类自身需求,这就是方法重写。
重写规则
- 方法名、参数列表、返回值类型必须和父类完全一致;
- 子类重写方法的访问权限,不能低于父类方法的权限;
- 使用
@Override注解,可校验是否为正确重写。
代码示例:
public class Student extends Person { // 重写父类eat方法 @Override public void eat() { System.out.println("学生要规律吃饭,才能专心学习"); } }区分:重写是父子类之间的关系,重载是同一个类中方法名相同、参数列表不同的方法,切勿混淆!
3. 继承与构造方法
- 子类所有构造方法,默认第一行都会隐藏 super (),先调用父类无参构造方法;
- 如果父类没有无参构造,子类必须手动通过
super(参数)调用父类有参构造,否则编译报错; - 构造方法不能被重写,只能通过 super 调用。
4. 访问修饰符与继承
Java 的四种访问修饰符,直接决定父类成员能否被子类访问,权限从高到低:
- public:所有类都能访问,子类可直接继承;
- protected:同包类、不同包子类均可访问,继承常用;
- 默认(无修饰符):仅同包类可访问;
- private:仅本类可访问,子类无法直接继承访问,需通过父类 public 方法间接调用。
5. Object 类:所有类的根父类
Java 中所有类,都默认直接或间接继承 Object 类,哪怕没有写extends Object。Object 类提供了很多通用方法,常用的有:
toString():返回对象的字符串表示,子类可重写自定义输出;equals():判断两个对象是否相等,默认比较地址,重写后可比较内容;hashCode():获取对象的哈希值。
6. final 关键字与继承
final 关键字会限制继承的使用,核心规则:
final类:无法被任何类继承;final方法:子类不能重写该方法;final变量:变为常量,赋值后不可修改。
7. 向上转型与向下转型(多态基础)
基于继承,Java 可以实现对象的转型,是学习多态的前提:
- 向上转型:父类引用指向子类对象,自动转型(
Person p = new Student()); - 向下转型:父类引用转回子类对象,需要强制转换,需注意类型转换异常。
四、学习继承的易错点总结
- 父类 private 修饰的成员,子类无法直接访问,别误以为所有父类内容都能继承;
- Java 类只能单继承,多层继承是允许的,不要和接口多实现混淆;
- 方法重写要严格遵守规则,加
@Override注解避免出错; - super () 必须在子类构造方法第一行,不能和 this () 同时存在;
- 继承适用于「is-a」关系(学生是人),不符合逻辑不要强行使用。
五、学习感悟
作为大一 Java 学习者,刚接触继承时,总觉得语法和关联知识点又多又乱,但慢慢梳理后发现,继承是面向对象「抽取共性、保留个性」思想的完美体现。它不仅让我们的代码变得简洁整洁,更是学习后续多态、接口等核心知识的敲门砖。
