Skip to content

Commit 816bc1c

Browse files
committed
java keys
1 parent f94936f commit 816bc1c

File tree

1 file changed

+85
-3
lines changed

1 file changed

+85
-3
lines changed

languages/java/basic/JavaSE(一).md

Lines changed: 85 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,16 +114,98 @@ public class Variable{
114114
> 实例变量具有默认值。数值型变量的默认值是0,布尔型变量的默认值是false,引用类型变量的默认值是null。变量的值可以在声明时指定,也可以在构造方法中指定;
115115
> 生命周期:在对象创建时创建,在对象销毁时销毁
116116
117-
### 2.2局部变量
117+
### 2.2 局部变量
118118

119119
在方法体中的变量
120120

121+
---
122+
123+
124+
121125
## 3 修饰符
122126

127+
Java中无法引用没有包、默认包和顶级类,`顶级类导入只能由另一个顶级类导入`
128+
123129
### 3.1 public
124130

131+
* 公共的,对象可以任意地方被调用
132+
* 且该修饰的方法、变量能够被继承
133+
125134
### 3.2 private
126135

127-
### 3.3 protected
136+
私有的,只能在同一个类中被访问;且该修饰的方法、变量不能被继承
137+
138+
### 3.3 protected(继承访问权限)
139+
140+
* protected 可以修饰数据成员,构造方法,方法成员,`不能修饰类(内部类除外)`
141+
* `接口及接口的成员变量和成员方法`不能声明为 protected
142+
* 保护的意思就是 保护我的家人,只能跟我有继承关系的人才能访问
143+
144+
使用场景:继承父类的protected的函数或变量,对于其他成员是private,所以主要用于代码的简洁性,顺序执行的代码
145+
146+
### 3.4 default(同级包访问权限)
147+
148+
* 默认的,即包权限,默认能被同一个包下的类访问
149+
* 不管是都是继承,只要不在同一个包下,则不能被访问
150+
151+
### 3.5 非访问修饰符
152+
153+
底层原理将在JDK源码中查看
154+
155+
#### 3.5.1 static (静态修饰符)
156+
157+
1. 用于修饰方法和变量,且方法和变量的生命周期跟类一致,不管创建多少实例对象且只有一份拷贝,`不能修饰类`;静态变量主要配合final+static使用,可以使用类访问
158+
2. 对于static方法不能含有非静态成员的变量或方法,因为static是在类加载时初始化,而非静态则需要具体的对象才能调用
159+
160+
##### 3.5.1.1 使用场景
161+
162+
1.加载机制不同
163+
164+
静态变量是被所有对象所共享,在内存中只有一个副本,是在类初次加载的时候初始化
165+
166+
非静态变量是类产生的多个对象每人一份,创建对象的时候初始化
167+
168+
> 加载机制不同,所有频繁使用的变量可以用静态变量
169+
170+
2.static块
171+
172+
根据加载机制不同,定义个static块可以更快的初始化需要的`静态对象`;类中可以有多个static块,在类每次加载时,按照顺序执行。
173+
174+
> 注意:static不能修饰局部变量,且static不会改变访问权限
175+
176+
3.初始化加载顺序
177+
178+
父类静态成员变量->父类静态代码块->子类静态成员变量->子类静态代码块->父类非静态成员变量->
179+
180+
父类非静态代码块->父类构造函数->子类非静态成员变量->子类非静态代码块->子类构造函数
181+
182+
#### 3.5.2 final(最终的)
183+
184+
1. 可以修饰类、方法和变量(包括成员变量和局部变量)
185+
2. 修饰类时表明是最终的,即不可继承
186+
3. 修饰变量时,如果是基本数据类型,则初始化后不可更改,如果是引用数据类型,则初始化后不能再指向其他的对象(不能再被赋值)
187+
188+
```java
189+
final String s = "abd";//final修饰的是引用变量,但指向的对象内容是可变的
190+
s = "sdf";//错误}
191+
```
192+
193+
```java
194+
String s = "abd";//final修饰的是类String,而没修饰变量引用s,所以引用是可变的
195+
s = "sdf";//正确
196+
```
197+
198+
第二个为什么是正确的,主要在于String s只是一个对象的引用,不是对象;而”abd“字符串一直在常量池中
199+
4. final会对编译期做常量优化,相当于直接访问这个变量,不需要在运行时确定
200+
201+
##### 3.5.2.1 使用场景
202+
203+
对于类,如果处于安全和效率考虑可以采用final,如string
204+
205+
#### 3.5.3 abstract
206+
207+
208+
209+
#### 3.5.4 synchronized 与 volatile
128210

129-
### 3.4 default(什么都不写时)
211+
在高并发与多线程中

0 commit comments

Comments
 (0)