Java面向对象_03_继承


1. 继承的基本介绍

现实世界中有这样一种情况,因为有基因的存在,所以无论是人类还是其他生物,后代总会或多或少的拥有其父辈的一些特征。那么在程序中,对象之间可能或多或少地存在一些关系,可能存在相似的类等等。将其移植到Java中,就是继承的概念。

继承是面向对象三大特征之一,其基本作用是代码复用。但是继承最重要的作用是:有了继承才有了方法的覆盖和多态机制。继承需要采用extends关键字,语法格式如下:

1
2
3
[修饰符列表] class 类名 extends 父类名{
类体;
}

Java语言中的继承只支持单继承,即一个类不能同时继承多个类,只能继承一个类。一些基本属于如下(B类继承A类):

  • A类称为:父类、基类、超类、superclass;
  • B类称为:子类、派生类、subclass。
  1. 在Java语言当中,子类继承父类都继承哪些数据呢?
    1. 私有的不支持继承;
    2. 构造方法不支持继承;
    3. 其他数据都可以被继承。
  2. 注意,如果一个类没有显式的继承任何类,该类默认继承JavaSE库当中提供的java.lang.Object类。Java语言中任何一个类中都有Object类的特征。

2. 方法覆盖

引入了继承,子类和父类之间的方法和属性就有了新的关系。一个典型的概念就是方法覆盖,之前提到方法重载的概念,再来回顾一下。

2.1 方法重载

  1. 方法重载又称为Overload

  2. 方法重载什么时候使用?

    当在同一个类当中,方法完成的功能是相似的,建议方法名相同,方便程序员的编程。

  3. 什么条件满足之后构成方法重载?

    • 在同一个类当中
    • 方法名相同
    • 参数列表不同:类型不同,顺序不同,个数不同
  4. 方法重载和什么无关?

    • 和方法的返回值类型无关
    • 和方法的修饰符列表无关

2.2 方法覆盖

子类继承父类,除了上述不能继承的属性和方法外,其余的属性和方法都会被继承。那么如果父类的方法不能满足当前要求,此时可以修改重新编写该方法,即覆盖。

  1. 方法覆盖又被称为方法重写,Override/Overwrite。

  2. 什么时候使用方法重写?

    当父类中的方法已经无法满足当前子类的业务需求,子类有必要将父类中继承过来的方法进行重新编写,这个重新编写的过程称为方法重写/方法覆盖。

  3. 什么条件满足之后方法会发生重写呢?(代码满足什么条件之后,就构成方法的覆盖呢?)

    • 方法重写发生在具有继承关系的父子类之间
    • 方法名相同,返回值类型相同,形式参数列表相同
    • 访问权限不能更低,可以更高。(即父类中的方法如果是public,则子类重写之后的不能比public权限低。)
    • 抛出异常不能更多,可以更少。
  4. 建议方法重写的时候建议复制粘贴,不要编写,容易出错,可能导致没有产生覆盖。

  5. 注意:

    1. 私有方法不能继承,所以不能覆盖。
    2. 构造方法不能继承,所以不能覆盖。
    3. 静态方法不存在覆盖。
    4. 覆盖只针对方法,不针对属性

3. 简单案例

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
// 动物类
class Animal{
float height;
float weight;

Animal(){
this(30.0f, 5.0f);
}

Animal(float height, float weight){
this.height = height;
this.weight = weight;
}

public void eating(){
System.out.println("在吃饭...");
}

public void sleeping(){
System.out.println("在睡觉...");
}

public void alive(){
System.out.println("目前在活着...");
}
}


// 小狗类 继承动物类
class Dog extends Animal{
// 默认继承非私有属性非私有方法
String name;

Dog(){
this("小黑", 35.0f, 5.0f);
}

Dog(String name, float height, float weight){
this.name = name;
this.height = height;
this.weight = weight;
}

// 重写父类方法,注意,访问控制权限要等于或者更宽泛。
public void eating(){
System.out.println(this.name + "[dog]" + "在吃饭...");
}

public void sleeping(){
System.out.println(this.name + "[dog]" + "在睡觉...");
}

@Override
public String toString() {
return "Dog{" +
"name=" + name +
", height=" + height + "cm" +
", weight='" + weight + "kg" + '\'' +
'}';
}
}

// 测试类
public class TestOOP_02 {

public static void main(String[] args) {
Animal aml = new Animal();
aml.eating();
aml.sleeping();
aml.alive();
System.out.println(aml);
System.out.println("----------");

Dog dg = new Dog();
dg.eating();
dg.sleeping();
dg.alive();
System.out.println(dg);
}
}

4. 备注

参考B站《动力节点》。


文章作者: 浮云
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 浮云 !
  目录