summaryrefslogtreecommitdiffstats
path: root/content/posts/Java面向对象编程——继承.md
blob: 04fae6ce6275d2de78f70a49f6f0d40a0452a478 (plain) (blame)
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
81
82
83
84
85
86
---
CopyRight: true
NoCover: true
ShowReward: false
ShowToc: show
abbrlink: 850254895
author: yingyu5658
categories:
- 往昔
cid: 185
cover: images\2024\12\2743265221.jpg
date: "2025-01-10 13:19:11"
desc: null
keywords: null
layout: post
showTimeWarning: true
slug: 185
status: publish
summaryContent: null
tags:
- Java
thumb: null
title: Java面向对象编程——继承
updated: 2025/01/10 13:19:11
---


## 什么是继承
- Java中提供了一个关键字``extends``,用这个关键字,可以让一个类和另一个类建立起父子关系。
### 继承的特点
- 子类能继承父类的非私有成员变量和成员方法。
### 继承后对象的创建
- 子类的对象是由子类、父类共同完成的。

<!--more-->

## 继承相关的注意事项

### 权限修饰符

#### 什么是权限修饰符?
- 用来限制类中的成员(成员变量、成员方法、构造器、代码块...)能够被访问的范围
### 权限修饰符有几种与各自的作用

| 修饰符       | 在本类中 | 同一个包下的其他类 | 任意包下的子类 | 任意包下的任意类 |
| --------- | ---- | --------- | ------- | -------- |
| private   | √    |           |         |          |
| 缺省        | √    | √         |         |          |
| protected | √    | √         | √       |          |
| public    | √    | √         | √       | √        |
provate < 缺省 < protected < public
## 单继承

Java是**继承**的,Java中的类**不支持多继承**,但是支持**多层继承**。
## Object类

- Ojbect类是所有Java类的父类,任何类都是Object的子类。
## 方法重写

### 什么是方法重写

- 当子类发现父类中的方法无法满足自己的需求时,**子类可以重写一个方法名称、参数列表一样的方法**去覆盖父类的这个方法,这就是方法重写。
- 注意:方法重写后,方法的访问遵循**就近原则**。
### 方法重写的注意事项
- 重写时使用**Override注解**,他可以指定Java编译器,检查我们方法重写的格式是否正确,代码可读性也会更好。
- 子类重写父类方法时,访问权限必须大于或等于父类该方法的权限(**public > protected > 缺省**)。
- 重写的方法返回值类型,必须与被重写方法的返回值类型一样,或者范围更小。
- 私有方法、静态方法不能被重写,如果重写会报错。 
### 方法重写在开发中的常见应用场景
- 子类重写Object类的toString()方法,以便返回对象的内容。
## 子类中访问其他成员的特点

1. 在子类方法中访问其他成员是按照就近原则的。
	- 先子类局部范围找。
	- 然后子类成员范围找。
	- 然后父类成员找
	- 然后父类成员范围找,如果父类范围还没有找到则报错。

2. 如果子父类中,出现了重名的成员,会优先使用子类的,如果此时一定要在子类中使用父类的方法怎么办?
	- 可以通过`super`关键字,指定访问父类的成员:``super.父类成员变量/父类成员方法``
## 子类构造器的特点
- 子类的全部构造器,都会先调用父类的构造器,再执行自己。

### 子类构造器是如何实现调用父类构造器的:
- 默认情况下,子类全部构造器的第一行代码是`super();`(写不写都有),他会调用父类的无参数构造器。
- 如果父类没有无参数构造器,我们必须在子类构造器的第一行手写`super();`,指定去调用父类的构造器。