Java 继承(Inheritance)教学

什么是继承?

继承(Inheritance) 是 Java 面向对象编程(OOP)中的一个重要特性。子类(Subclass) 可以继承 父类(Superclass) 的属性和方法,从而实现代码复用,减少重复代码,提高可维护性。

🔹 继承的特点:
子类 继承 父类 的所有非私有(private) 的属性和方法。
✅ 子类可以 新增方法和属性,也可以重写父类方法(方法覆盖,Override)
✅ Java 只支持单继承,但可以通过接口(Interface) 实现多继承的效果。
super 关键字可以调用 父类的构造方法或方法

img


继承的基本语法

1
2
3
4
5
6
7
8
9
class 父类 {
// 父类属性
// 父类方法
}

class 子类 extends 父类 {
// 子类特有的属性
// 子类特有的方法
}

继承的基本示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 父类
class Animal {
String name;

public void eat() {
System.out.println(name + " 在吃东西!");
}
}

// 子类
class Dog extends Animal {
public void bark() {
System.out.println(name + " 在汪汪叫!");
}
}

// 测试类
public class InheritanceDemo {
public static void main(String[] args) {
Dog dog = new Dog();
dog.name = "旺财";
dog.eat(); // 继承父类方法
dog.bark(); // 子类特有方法
}
}

🔹 运行结果

1
2
旺财 在吃东西!
旺财 在汪汪叫!

super 关键字

super 关键字用于访问父类的构造方法或成员(变量 & 方法)

4.1 使用 super 调用父类方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Animal {
public void makeSound() {
System.out.println("动物发出声音!");
}
}

class Dog extends Animal {
public void makeSound() {
super.makeSound(); // 调用父类方法
System.out.println("狗在汪汪叫!");
}
}

public class SuperDemo {
public static void main(String[] args) {
Dog dog = new Dog();
dog.makeSound();
}
}

🔹 运行结果

1
2
动物发出声音!
狗在汪汪叫!

4.2 使用 super 调用父类构造方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Animal {
String name;

// 父类构造方法
public Animal(String name) {
this.name = name;
System.out.println("Animal 构造方法被调用");
}
}

class Dog extends Animal {
public Dog(String name) {
super(name); // 调用父类构造方法
System.out.println("Dog 构造方法被调用");
}
}

public class SuperConstructorDemo {
public static void main(String[] args) {
Dog dog = new Dog("旺财");
}
}

🔹 运行结果

1
2
Animal 构造方法被调用
Dog 构造方法被调用

方法重写(Method Overriding

子类可以修改从父类继承的方法,这称为方法重写(Override

📌 方法重写规则

  • 方法名相同、参数列表相同、返回类型相同或是其子类
  • 访问权限不能比父类更严格(如:父类是 public,子类不能是 private)。
  • 只能重写privatestatic 的方法。
  • @Override 注解用于检查是否正确重写方法,建议加上。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Animal {
public void makeSound() {
System.out.println("动物在发出声音!");
}
}

class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("狗在汪汪叫!");
}
}

public class OverrideDemo {
public static void main(String[] args) {
Dog dog = new Dog();
dog.makeSound();
}
}

运行结果

1
狗在汪汪叫!

方法重载(Method Overload)

重载(overloading) 是在一个类里面,方法名字相同而参数不同。返回类型可以相同也可以不同。

每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。

最常用的地方就是构造器的重载。

重载规则:

  • 被重载的方法必须改变参数列表(参数个数或类型不一样);
  • 被重载的方法可以改变返回类型
  • 被重载的方法可以改变访问修饰符
  • 被重载的方法可以声明新的或更广的检查异常
  • 方法能够在同一个类中或者在一个子类中被重载。
  • 无法以返回值类型作为重载函数的区分标准。

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class Overloading {
public int test(){
System.out.println("test1");
return 1;
}

public void test(int a){
System.out.println("test2");
}

//以下两个参数类型顺序不同
public String test(int a,String s){
System.out.println("test3");
return "returntest3";
}

public String test(String s,int a){
System.out.println("test4");
return "returntest4";
}

public static void main(String[] args){
Overloading o = new Overloading();
System.out.println(o.test());
o.test(1);
System.out.println(o.test(1,"test3"));
System.out.println(o.test("test4",1));
}
}

重写与重载之间的区别

区别点 重载方法 重写方法
参数列表 必须修改 一定不能修改
返回类型 可以修改 一定不能修改
异常 可以修改 可以减少或删除,一定不能抛出新的或者更广的异常。
访问 可以修改 一定不能做更严格的限制(可以降低限制)

总结

方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载可以理解成多态的具体表现形式。

  • (1)方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载(Overloading)。
  • (2)方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法,就称为重写(Overriding)。
  • (3)方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。

img

img


final 关键字

在继承中,final 关键字有以下作用:

  • final不能被继承(如 String 类)
  • final 方法不能被子类重写,但可以被继承使用
  • final 变量:定义常量,值不能被修改
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Animal {
public final void sleep() {
System.out.println("动物在睡觉!");
}
}

class Dog extends Animal {
// ❌ 报错,不能重写 final 方法
// public void sleep() { System.out.println("狗在睡觉!"); }
}

public class FinalMethodDemo {
public static void main(String[] args) {
Dog dog = new Dog();
dog.sleep(); // 继承但不能修改
}
}

继承与构造方法

7.1 子类构造方法默认调用父类无参构造

如果父类没有无参构造方法,子类必须手动调用 super()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Animal {
public Animal(String name) {
System.out.println("Animal 构造方法:" + name);
}
}

class Dog extends Animal {
public Dog(String name) {
super(name); // 必须手动调用父类构造方法
System.out.println("Dog 构造方法:" + name);
}
}

public class ConstructorDemo {
public static void main(String[] args) {
Dog dog = new Dog("旺财");
}
}

🔹 运行结果

1
2
Animal 构造方法:旺财
Dog 构造方法:旺财

Object 类:所有类的父类

在 Java 中,所有类默认继承 Object 类,它提供了:

  • toString():返回对象的字符串表示。(所以可以重写该方法)
  • equals(Object obj):比较两个对象是否相等。
  • hashCode():返回对象的哈希值。
  • getClass():返回对象的运行时类。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Animal {
String name;

@Override
public String toString() {
return "Animal[name=" + name + "]";
}
}

public class ObjectDemo {
public static void main(String[] args) {
Animal animal = new Animal();
animal.name = "小猫";
System.out.println(animal.toString());
}
}

🔹 运行结果

1
Animal[name=小猫]