Java继承 #
一、继承概述 #
继承是面向对象三大特性之一,它允许子类继承父类的属性和方法,实现代码复用。
1.1 继承的好处 #
- 代码复用
- 扩展功能
- 实现多态
1.2 继承语法 #
java
// 父类
public class Animal {
protected String name;
public void eat() {
System.out.println(name + "在吃东西");
}
}
// 子类
public class Dog extends Animal {
public void bark() {
System.out.println(name + "在叫");
}
}
二、继承特点 #
2.1 单继承 #
Java只支持单继承,一个类只能有一个直接父类。
java
// 正确:单继承
public class Dog extends Animal { }
// 错误:多继承不支持
// public class Dog extends Animal, Creature { }
2.2 多层继承 #
java
public class Animal { }
public class Dog extends Animal { }
public class Husky extends Dog { } // 多层继承
2.3 所有类的父类 #
所有类都直接或间接继承自Object类。
java
public class Person { }
// 等价于
public class Person extends Object { }
三、成员访问 #
3.1 继承的内容 #
子类继承父类的:
- public和protected成员
- 默认访问权限成员(同包)
子类不继承父类的:
- private成员
- 构造方法
java
public class Parent {
public int publicField;
protected int protectedField;
int defaultField;
private int privateField;
public void publicMethod() { }
protected void protectedMethod() { }
void defaultMethod() { }
private void privateMethod() { }
}
public class Child extends Parent {
public void test() {
publicField = 1; // 可访问
protectedField = 2; // 可访问
defaultField = 3; // 同包可访问
// privateField = 4; // 不可访问
publicMethod(); // 可访问
protectedMethod(); // 可访问
defaultMethod(); // 同包可访问
// privateMethod(); // 不可访问
}
}
3.2 成员变量隐藏 #
java
public class Parent {
public int count = 10;
}
public class Child extends Parent {
public int count = 20; // 隐藏父类变量
public void show() {
System.out.println(count); // 20(子类变量)
System.out.println(super.count); // 10(父类变量)
}
}
四、方法重写 #
4.1 重写规则 #
- 方法名、参数列表必须相同
- 返回类型可以相同或是子类
- 访问权限不能更严格
- 不能重写private和final方法
java
public class Animal {
public void eat() {
System.out.println("动物在吃东西");
}
public Object getInfo() {
return "动物信息";
}
}
public class Dog extends Animal {
@Override // 重写注解
public void eat() {
System.out.println("狗在吃骨头");
}
@Override
public String getInfo() { // 返回类型可以是父类返回类型的子类
return "狗的信息";
}
}
4.2 @Override注解 #
java
public class Dog extends Animal {
@Override // 编译器检查是否正确重写
public void eat() {
System.out.println("狗在吃东西");
}
// @Override // 错误:父类没有此方法
// public void sleep() { }
}
4.3 super调用父类方法 #
java
public class Animal {
public void eat() {
System.out.println("动物在吃东西");
}
}
public class Dog extends Animal {
@Override
public void eat() {
super.eat(); // 调用父类方法
System.out.println("狗在吃骨头");
}
}
// 调用
Dog dog = new Dog();
dog.eat();
// 输出:
// 动物在吃东西
// 狗在吃骨头
五、构造方法与继承 #
5.1 子类构造方法 #
子类构造方法默认调用父类无参构造。
java
public class Parent {
public Parent() {
System.out.println("父类构造方法");
}
}
public class Child extends Parent {
public Child() {
super(); // 默认调用,可省略
System.out.println("子类构造方法");
}
}
new Child();
// 输出:
// 父类构造方法
// 子类构造方法
5.2 super调用父类构造 #
java
public class Parent {
private String name;
public Parent(String name) {
this.name = name;
}
}
public class Child extends Parent {
private int age;
public Child(String name, int age) {
super(name); // 必须在第一行调用父类构造
this.age = age;
}
}
5.3 构造方法调用链 #
java
public class Grandparent {
public Grandparent() {
System.out.println("爷爷构造方法");
}
}
public class Parent extends Grandparent {
public Parent() {
System.out.println("父亲构造方法");
}
}
public class Child extends Parent {
public Child() {
System.out.println("儿子构造方法");
}
}
new Child();
// 输出:
// 爷爷构造方法
// 父亲构造方法
// 儿子构造方法
六、final与继承 #
6.1 final类 #
final类不能被继承。
java
public final class FinalClass {
}
// 错误:不能继承final类
// public class Child extends FinalClass { }
6.2 final方法 #
final方法不能被重写。
java
public class Parent {
public final void finalMethod() {
}
}
public class Child extends Parent {
// 错误:不能重写final方法
// public void finalMethod() { }
}
七、继承示例 #
7.1 图形类 #
java
public abstract class Shape {
protected String color;
public Shape(String color) {
this.color = color;
}
public abstract double getArea();
public void display() {
System.out.println("颜色: " + color + ", 面积: " + getArea());
}
}
public class Circle extends Shape {
private double radius;
public Circle(String color, double radius) {
super(color);
this.radius = radius;
}
@Override
public double getArea() {
return Math.PI * radius * radius;
}
}
public class Rectangle extends Shape {
private double width;
private double height;
public Rectangle(String color, double width, double height) {
super(color);
this.width = width;
this.height = height;
}
@Override
public double getArea() {
return width * height;
}
}
7.2 员工类 #
java
public class Employee {
private String name;
private double salary;
public Employee(String name, double salary) {
this.name = name;
this.salary = salary;
}
public double calculateBonus() {
return salary * 0.1;
}
public void display() {
System.out.println("姓名: " + name + ", 工资: " + salary);
}
}
public class Manager extends Employee {
private double bonus;
public Manager(String name, double salary, double bonus) {
super(name, salary);
this.bonus = bonus;
}
@Override
public double calculateBonus() {
return super.calculateBonus() + bonus;
}
}
八、总结 #
| 概念 | 说明 |
|---|---|
| extends | 继承关键字 |
| 单继承 | 一个类只能有一个直接父类 |
| super | 引用父类成员 |
| @Override | 重写注解 |
| final | 不能继承或重写 |
继承要点:
- Java只支持单继承
- 子类继承父类非private成员
- 重写方法使用@Override注解
- super调用父类构造必须在第一行
- final类不能被继承
最后更新:2026-03-26