@@ -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:::
0 commit comments