Skip to content

Commit d0b765b

Browse files
committed
docs(java): 更新Java基础笔记。
更新面向对象编程笔记内容。
1 parent c9e81b0 commit d0b765b

File tree

2 files changed

+321
-8
lines changed

2 files changed

+321
-8
lines changed

docs/zh/后端/02-Java/01-Java基础/05-面向对象编程.md

Lines changed: 312 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,318 @@ editLink: false
88

99
# 面向对象编程
1010

11+
## 概述
12+
13+
Java语言是一种面向对象的程序设计语言,而面向对象思想是一种程序设计思想,我们在面向对象思想的指引下使用Java语言去设计、开发计算机程序。这里的对象泛指现实中一切事物,每种事物都具备自己的属性和行为。面向对象思想就是在计算机程序设计过程中,参照现实中事物,将事物的属性特征、行为特征抽象出来,描述成计算机事件的设计思想。它区别于面向过程思想,强调的是通过调用对象的行为来实现功能,而不是自己一步一步的去操作实现。
14+
15+
举例:洗衣服
16+
17+
- 面向过程:把衣服脱下来 -> 找一个盆 -> 放点洗衣粉 -> 加点水 -> 浸泡10分钟 -> 开始清洗衣服 -> 拧干衣服 -> 晾起来
18+
- 面向过程:把衣服脱下来 -> 丢进全自动洗衣机 -> 等待洗衣 -> 晾起来
19+
20+
区别:
21+
22+
- 面向过程:强调步骤。
23+
- 面向对象:强调对象,这里的对象就是全自动洗衣机。
24+
25+
## 三大基本特征
26+
27+
面向对象的三大基本特征:封装、继承、多态。
28+
29+
| 特征 | 说明 |
30+
| --- | --- |
31+
| 封装 | 将对象的“属性”和“行为”抽象出来包装到类中,通过访问控制符隐藏内部实现细节,只暴露必要的接口。 |
32+
| 继承 | 将具有相同”属性“和“行为”的对象抽象出来并包装成一个父类,子类继承父类的非私有属性和方法,实现代码复用。支持单继承(一个类只能继承一个直接父类) |
33+
| 多态 | 多种形态,相同的“属性”和“行为”却有不同的表现方式,同一接口(方法名)在不同对象上有不同实现。<br/> 主要分为:<br/>1. 编译时多态(方法重载)<br/>2. 运行时多态(方法重写 + 父类引用子类对象) |
34+
35+
## 类和对象
36+
37+
****:是一组相关属性和行为的集合。可以看成是一类事物的模版,使用事物的属性特征和行为特征来描述该类事物。
38+
39+
**对象**:是一类事物的具体体现,对象是类的一个实例,必然具备该类事物的属性和行为。
40+
41+
类和对象的关系:
42+
43+
- 类是对一类事物的描述,是抽象的。
44+
- 对象是一类事物的实例,是具体的。
45+
- 类是对象的模版,对象是类的实体。
46+
47+
### 类的定义
48+
49+
类的定义语法格式如下:
50+
51+
```java
52+
访问修饰符 class 类名 [extends 父类] [implements 接口列表] {
53+
// 成员变量
54+
// 构造器
55+
// 方法
56+
// [代码块]
57+
// [内部类]
58+
}
59+
```
60+
61+
示例:
62+
63+
```java
64+
public class Student {
65+
// 成员变量
66+
String name;
67+
int age;
68+
69+
// 方法
70+
// 学习
71+
public void study() {
72+
System.out.println("学习中...");
73+
}
74+
75+
// 吃饭
76+
public void eat() {
77+
System.out.println("吃饭中...");
78+
}
79+
}
80+
```
81+
82+
### 对象创建和使用
83+
84+
对象创建的语法格式如下:
85+
86+
```text
87+
类名 对象名 = new 类名();
88+
```
89+
90+
使用对象访问类中的成员变量和方法。
91+
92+
```text
93+
对象名.成员变量名;
94+
对象名.方法名();
95+
```
96+
97+
示例:
98+
99+
```java
100+
public class Test01Student {
101+
public static void main(String[] args) {
102+
// 创建对象格式:类名 对象名 = new 类名()
103+
Student s = new Student();
104+
System.out.println("s:" + s);
105+
106+
// 直接输出成员变量值
107+
System.out.println("姓名:" + s.name);
108+
System.out.println("年龄:" + s.age);
109+
System.out.println("================");
110+
111+
// 给成员变量赋上新的值
112+
s.name = "MagicGopher";
113+
s.age = 18;
114+
115+
// 再次输出成员变量的值
116+
System.out.println("姓名:" + s.name); // MagicGopher
117+
System.out.println("年龄:" + s.age); // 18
118+
System.out.println("================");
119+
120+
// 调用成员方法
121+
s.study(); // 学习中...
122+
s.eat(); // 吃饭中...
123+
}
124+
}
125+
```
126+
127+
### 成员变量的默认值
128+
129+
| | 数据类型 | 默认值 |
130+
| --- | --- | --- |
131+
| 基本类型 | 整数(byte, short, int, long) | 0 |
132+
| | 浮点数(float, double) | 0.0 |
133+
| | 字符(char) | '\u0000' |
134+
| | 布尔值(boolean) | false |
135+
| 引用类型 | 数组(Array), 类(Class), 接口(interface) | null |
136+
137+
### 成员变量和局部变量
138+
139+
成员变量和局部变量的区别,以下示例所示:
140+
141+
```java
142+
public class Car {
143+
// 成员变量
144+
String color;
145+
public void drive() {
146+
int speed = 100; // 局部变量
147+
System.out.println("速度:" + speed);
148+
}
149+
}
150+
```
151+
152+
- 在类的位置不同
153+
- 成员变量:类中,方法外
154+
- 局部变量:方法中或者方法声明上(形式参数)
155+
- 作用范围不一样
156+
- 成员变量:类中
157+
- 局部变量:方法中
158+
- 初始化值的不同
159+
- 成员变量:有默认值
160+
- 局部变量:没有默认值,必须先定义,赋值,最后使用。
161+
- 在内存的位置不同
162+
- 成员变量:堆内存
163+
- 局部变量:栈内存
164+
- 生命周期不同
165+
- 成员变量:随着对象的创建而诞生,随着对象的销毁而消失。
166+
- 局部变量:随着方法的调用而诞生,随着方法的调用结束而消失。
167+
168+
## 封装
169+
170+
封装是面向对象编程中的一个重要概念,它的目的是将对象的属性(成员变量)隐藏起来,若需要访问某个属性,则需要通过提供的公共方法进行访问。
171+
172+
1. 使用 `private` 关键字来修饰成员变量,达到将对象的属性(成员变量)隐藏起来的目的。
173+
2. 对需要访问的对象属性(成员变量),提供公共的访问方法(`getXxx()`方法、`setXxx()`方法)
174+
175+
### private 关键字
176+
177+
*private* 关键字的含义
178+
179+
1. *private* 关键字是一个权限修饰符,代表最小权限。
180+
2. 可以修饰成员变量和成员方法。
181+
3.*private* 修饰的成员变量和成员方法,只能在当前类中访问。
182+
183+
*private* 关键字的使用格式,如下:
184+
185+
```java
186+
private 数据类型 变量名称;
187+
```
188+
189+
示例:
190+
191+
Student.java
192+
193+
```java
194+
public class Student {
195+
private String name;
196+
private int age;
197+
198+
public void setName(String n) {
199+
// 将传入的参数n赋值给成员变量name
200+
name = n;
201+
}
202+
203+
public String getName() {
204+
return name;
205+
}
206+
207+
public void setAge(int a) {
208+
// 将传入的参数a赋值给成员变量age
209+
age = a;
210+
}
211+
212+
public int getAge() {
213+
return age;
214+
}
215+
}
216+
```
217+
218+
TestStudent.java
219+
220+
```java
221+
public class TestStudent {
222+
public static void main(String[] args) {
223+
// 创建Student对象
224+
Student s1 = new Student();
225+
System.out.println("设置成员变量之前");
226+
// 获取name、age属性(成员变量)
227+
System.out.println(s1.getName());
228+
System.out.println(s1.getAge());
229+
System.out.println("================");
230+
231+
// 通过setXxx()方法设置成员变量
232+
s1.setName("MagicGopher");
233+
s1.setAge(19);
234+
System.out.println("设置成员变量之后");
235+
// 获取name、age属性(成员变量)
236+
System.out.println(s1.getName());
237+
System.out.println(s1.getAge());
238+
System.out.println("================");
239+
}
240+
}
241+
```
242+
243+
控制台输出结果:
244+
245+
```text
246+
设置成员变量之前
247+
null
248+
0
249+
================
250+
设置成员变量之后
251+
MagicGopher
252+
19
253+
================
254+
```
255+
256+
### this 关键字
257+
258+
在上述案例中的 `setName()` 方法和 `setAge()` 方法中传入的形式参数的名字并不符合规范(见名知意),那么将参数改成和成员变量名一致,是否就见名知意了呢?代码如下:
259+
260+
```java
261+
public class Student {
262+
private String name;
263+
private int age;
264+
265+
public void setName(String name) {
266+
// 将传入的参数n赋值给成员变量name
267+
name = name;
268+
}
269+
270+
public String getName() {
271+
return name;
272+
}
273+
274+
public void setAge(int age) {
275+
// 将传入的参数a赋值给成员变量age
276+
age = age;
277+
}
278+
279+
public int getAge() {
280+
return age;
281+
}
282+
}
283+
```
284+
285+
TestStudent.java
286+
287+
```java
288+
public class TestStudent {
289+
public static void main(String[] args) {
290+
// 创建Student对象
291+
Student s1 = new Student();
292+
System.out.println("设置成员变量之前");
293+
// 获取name、age属性(成员变量)
294+
System.out.println(s1.getName());
295+
System.out.println(s1.getAge());
296+
System.out.println("================");
297+
298+
// 通过setXxx()方法设置成员变量
299+
s1.setName("MagicGopher");
300+
s1.setAge(19);
301+
System.out.println("设置成员变量之后");
302+
// 获取name、age属性(成员变量)
303+
System.out.println(s1.getName());
304+
System.out.println(s1.getAge());
305+
System.out.println("================");
306+
}
307+
}
308+
```
309+
310+
控制台输出结果:
311+
312+
```text
313+
设置成员变量之前
314+
null
315+
0
316+
================
317+
设置成员变量之后
318+
null
319+
0
320+
================
321+
```
322+
11323
::: tip 提示
12324
文档正在更新中...
13325
:::

docs/zh/后端/02-Java/index.md

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,15 @@ editLink: false
1818
| 4 | [方法](./01-Java基础/04-方法.md) | 方法的定义、调用、重载 ||
1919
| 4 | [面向对象编程](./01-Java基础/05-面向对象编程.md) | 类、对象、封装、继承、多态、接口 ||
2020
| 5 | [字符串处理]() | String、StringBuilder、StringBuffer操作 | |
21-
| 6 | [集合]() | List、Set等集合框架使用 | |
22-
| 7 | [Map]() | Map接口及其实现类的使用 | |
23-
| 8 | [泛型]() | 泛型类、方法与类型安全的实现 | |
24-
| 9 | [异常处理]() | try-catch、自定义异常与处理机制 | |
25-
| 10 | [IO流]() | 字节流、字符流、缓冲流与文件操作 | |
26-
| 11 | [注解]() | 注解的定义、使用与自定义注解 | |
27-
| 12 | [多线程]() | 线程创建、管理、同步与通信 | |
28-
| 13 | [网络编程]() | 网络通信、Socket与客户端/服务器模型 | |
21+
| 6 | [常用类]() | 常用类的使用 | |
22+
| 7 | [集合]() | List、Set等集合框架使用 | |
23+
| 8 | [Map]() | Map接口及其实现类的使用 | |
24+
| 9 | [泛型]() | 泛型类、方法与类型安全的实现 | |
25+
| 10 | [异常处理]() | try-catch、自定义异常与处理机制 | |
26+
| 11 | [IO流]() | 字节流、字符流、缓冲流与文件操作 | |
27+
| 12 | [注解]() | 注解的定义、使用与自定义注解 | |
28+
| 13 | [多线程]() | 线程创建、管理、同步与通信 | |
29+
| 14 | [网络编程]() | 网络通信、Socket与客户端/服务器模型 | |
2930

3031
## 🎯 Java 基础进阶
3132

0 commit comments

Comments
 (0)