# 封装
面向对象特性三大特性:封装、继承、多态
# 概念
将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和方法。
# 好处
只能通过规定的方法访问数据
隐藏类的实例细节,方便修改和实现
# 封装的实现步骤
例子
public class Hello {
provite float screen;
// getter
public float getScreen() {
return screen;
}
// setter
public void setScreen(float newScreen) {
screen = newScreen;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# java中的包
1、作用
管理Java文件
解决同名文件冲突
2、包的定义:package 包名
注意
必须放在Java源程序的第一行,包名间可以使用 .
号隔开,eg: com.test.HelloWorld
// 例子:音乐类-MyClassMusic
// music
com.test.music.MyClassMusic;
// movie
com.test.movie.MyClassMusic;
1
2
3
4
5
2
3
4
5
3、系统中的包
java.(功能).(类)
```
|包名|说明|
|:--|:--|
|java.lang.(类) |包含java语言基础的类|
|java.util.(类) |包含java语言中各种工具类|
|java.io.(类) |包含输入、输出相关功能的类|
4、包的使用
可以通过`import`关键字,在某个文件使用其它文件中的类。
```
import com.test.music.MyClass;
```
::: warning 注意
Java中,包的命名规范是全小写字母拼写
:::
使用的时候不但可以加载某个包下面的所有文件
```java
com.test.*;
```
也可以加载某个具体包下的所有文件
```java
com.test.music.*;
```
### Java中的访问修饰符
```java
class Telphone {
private float screen = 5.0f;
public float getScreen() {
return screen;
}
publick void setScreen(float newScreen) {
screen = newScreen;
}
// ...
}
```
访问修饰符,可以修饰 `属性` 和 `方法` 的访问范围。
|访问修饰符|本类|同包|子类|其他|
|:--|:--:|:--:|:--:|:--:|
|private|o|-|-|-|
|默认|o|o|-|-|
|protected|o|o|o|-|
|public|o|o|o|o|
### Java中的this关键字
1、this关键字代表当前对象
```
this.属性 操作当前对象的属性
this.方法 调用当前对象的方法
```
2、封装对象的属性的时候,经常会使用this关键字
```
# Eclipse编辑器自动生成getter/setter
菜单栏 -> source -> Generate Getters and Setters ...
# 指定需要生成getter或setter方法的属性
```
```java
class Telphone {
private float screen = 5.0f;
public float getScreen() {
return screen;
}
publick void setScreen(float screen) {
this.screen = screen;
}
// ...
}
```
### Java中的内部类
内部类(Inner Class)就是定义在另外一个类里的类。与之对应,包含内部类的类被称为外部类。
#### 内部类的主要作用如下:
1、内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类
2、内部类的方法可以直接访问外部类的所有数据,包括私有的数据
3、内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便
#### 内部类可分为以下几种:
- 成员内部类
- 静态内部类
- 方法内部类
- 匿名内部类
#### 成员内部类
```java
public class Outer {
int outerNumber = 10;
// 成员内部类
public class Inner {
int innerNumber = 20;
public void print () {
System.out.println("Inner class's print method, and outerNumber=" + outerNumber);
}
}
public static void main (String[] args) {
// 创建外部类对象
Outer ou = new Outer();
// 创建内部类对象
Inner in = ou.new Inner();
// 调用内部类对象方法
in.print();
}
}
```
成员内部类的使用方法:
1、Inner 类定义在 Outer 类的内部,相当于 Outer 类的一个成员变量的位置,Inner 类可以使用任意访问控制符,如 public 、 protected 、 private 等
2、Inner 类中定义的 `print()` 方法可以直接访问 Outer 类中的数据,而不受访问控制符的影响,如直接访问 Outer 类中的私有属性a
3、定义了成员内部类后,必须使用外部类对象来创建内部类对象,而不能直接去 new 一个内部类对象,即:
```
内部类 对象名 = 外部类对象.new 内部类( );
```
4、编译上面的程序后,会发现产生了两个 `.class` 文件

其中,第二个是外部类的 .class 文件,第一个是内部类的 .class 文件,即成员内部类的 .class 文件总是这样:
```
外部类名$内部类名.class
```
::: warning 注意
1、外部类不能直接使用内部类的成员和方法
:::

可先创建内部类的对象,然后通过内部类的对象来访问其成员变量和方法。
::: warning 注意
2、如果外部类和内部类具有相同的成员变量或方法,内部类默认访问自己的成员变量或方法,如果要访问外部类的成员变量,可以使用 `this`关键字。如:
:::

运行结果:
```
访问外部类中的b:1
访问内部类中的b:2
```
#### 静态内部类
静态内部类是 `static` 修饰的内部类,这种内部类的特点是:
1、静态内部类不能直接访问外部类的非静态成员,但可以通过 `new 外部类().成员` 的方式访问
2、如果外部类的静态成员与内部类的成员名称相同,可通过“类名.静态成员”访问外部类的静态成员;如果外部类的静态成员与内部类的成员名称不相同,则可通过“成员名”直接调用外部类的静态成员
3、创建静态内部类的对象时,不需要外部类的对象,可以直接创建 内部类 `对象名= new 内部类();`

结果:
```
访问外部类中的b:1
访问内部类中的b:2
```
#### 方法内部类
方法内部类就是内部类定义在外部类的方法中,方法内部类只在该方法的内部可见,即只在该方法内可以使用。

::: warning 注意
由于方法内部类不能在外部类的方法以外的地方使用,因此方法内部类不能使用访问控制符和 static 修饰符。
:::
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
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
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
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
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207