1
0
mirror of https://github.com/Snailclimb/JavaGuide synced 2025-06-20 22:17:09 +08:00

Update Java常见关键字总结.md

This commit is contained in:
guide 2021-06-14 22:42:03 +08:00
parent 8583581f4e
commit 79d7098e07

View File

@ -170,7 +170,6 @@ public class StaticDemo {
} }
``` ```
### 静态代码块 ### 静态代码块
静态代码块定义在类中方法外, 静态代码块在非静态代码块之前执行(静态代码块 —> 非静态代码块 —> 构造方法)。 该类不管创建多少对象,静态代码块只执行一次. 静态代码块定义在类中方法外, 静态代码块在非静态代码块之前执行(静态代码块 —> 非静态代码块 —> 构造方法)。 该类不管创建多少对象,静态代码块只执行一次.
@ -183,14 +182,12 @@ static {
} }
``` ```
一个类中的静态代码块可以有多个位置可以随便放它不在任何的方法体内JVM 加载类时会执行这些静态的代码块如果静态代码块有多个JVM 将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。 一个类中的静态代码块可以有多个位置可以随便放它不在任何的方法体内JVM 加载类时会执行这些静态的代码块如果静态代码块有多个JVM 将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。
![](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-9-14/88531075.jpg) ![](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-9-14/88531075.jpg)
静态代码块对于定义在它之后的静态变量,可以赋值,但是不能访问. 静态代码块对于定义在它之后的静态变量,可以赋值,但是不能访问.
### 静态内部类 ### 静态内部类
静态内部类与非静态内部类之间存在一个最大的区别,我们知道非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围类,但是静态内部类却没有。没有这个引用就意味着: 静态内部类与非静态内部类之间存在一个最大的区别,我们知道非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围类,但是静态内部类却没有。没有这个引用就意味着:
@ -198,7 +195,6 @@ static {
1. 它的创建是不需要依赖外围类的创建。 1. 它的创建是不需要依赖外围类的创建。
2. 它不能使用任何外围类的非 static 成员变量和方法。 2. 它不能使用任何外围类的非 static 成员变量和方法。
Example静态内部类实现单例模式 Example静态内部类实现单例模式
```java ```java
@ -247,7 +243,6 @@ public class Demo {
``` ```
## 补充内容 ## 补充内容
### 静态方法与非静态方法 ### 静态方法与非静态方法
@ -274,7 +269,9 @@ class Foo {
} }
``` ```
你可以像这样调用静态方法:`Foo.method1()`。 如果您尝试使用这种方法调用 method2 将失败。 但这样可行 你可以像这样调用静态方法:`Foo.method1()`。 如果您尝试使用这种方法调用 method2 将失败。 但这样可行
```java ```java
Foo bar = new Foo(1); Foo bar = new Foo(1);
bar.method2(); bar.method2();
@ -291,9 +288,9 @@ bar.method2();
不同点: 静态代码块在非静态代码块之前执行(静态代码块 -> 非静态代码块 -> 构造方法)。静态代码块只在第一次 new 执行一次,之后不再执行,而非静态代码块在每 new 一次就执行一次。 非静态代码块可在普通方法中定义(不过作用不大);而静态代码块不行。 不同点: 静态代码块在非静态代码块之前执行(静态代码块 -> 非静态代码块 -> 构造方法)。静态代码块只在第一次 new 执行一次,之后不再执行,而非静态代码块在每 new 一次就执行一次。 非静态代码块可在普通方法中定义(不过作用不大);而静态代码块不行。
> **🐛 修正(参见: [issue #677](https://github.com/Snailclimb/JavaGuide/issues/677)** 静态代码块可能在第一次new的时候执行但不一定只在第一次new的时候执行。比如通过 `Class.forName("ClassDemo")`创建 Class 对象的时候也会执行。 > **🐛 修正(参见: [issue #677](https://github.com/Snailclimb/JavaGuide/issues/677)** :静态代码块可能在第一次 new 对象的时候执行,但不一定只在第一次 new 的时候执行。比如通过 `Class.forName("ClassDemo")`创建 Class 对象的时候也会执行,即 new 或者 `Class.forName("ClassDemo")` 都会执行静态代码块
一般情况下,如果有些代码比如一些项目最常用的变量或对象必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的。如果我们想要设计不需要创建对象就可以调用类中的方法例如Arrays类Character类String类等就需要使用静态方法, 两者的区别是 静态代码块是自动执行的而静态方法是被调用的时候才执行的. 一般情况下,如果有些代码比如一些项目最常用的变量或对象必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的。如果我们想要设计不需要创建对象就可以调用类中的方法,例如:`Arrays` 类,`Character` 类,`String` 类等,就需要使用静态方法, 两者的区别是 静态代码块是自动执行的而静态方法是被调用的时候才执行的.
Example Example
@ -346,7 +343,6 @@ public class Test {
静态代码块!--非静态代码块!--默认构造方法!-- 静态代码块!--非静态代码块!--默认构造方法!--
``` ```
非静态代码块与构造函数的区别是: 非静态代码块是给所有对象进行统一初始化,而构造函数是给对应的对象初始化,因为构造函数是可以多个的,运行哪个构造函数就会建立什么样的对象,但无论建立哪个对象,都会先执行相同的构造代码块。也就是说,构造代码块中定义的是不同对象共性的初始化内容。 非静态代码块与构造函数的区别是: 非静态代码块是给所有对象进行统一初始化,而构造函数是给对应的对象初始化,因为构造函数是可以多个的,运行哪个构造函数就会建立什么样的对象,但无论建立哪个对象,都会先执行相同的构造代码块。也就是说,构造代码块中定义的是不同对象共性的初始化内容。
### 参考 ### 参考