本篇主要介绍Java中的类与对象中 的代码块
作者: 初入编程的菜鸟哒哒
系列文章目录:一、TvT——JavaSE(1)–Java的数据类型与变量
二、TvT——JavaSE(2)–Java的运算符
三、TvT——JavaSE(3)–Java的逻辑控制
四、TvT——JavaSE(4)–Java方法的使用
五、你真的学会了JavaSE中数组的定义与使用吗?
六、Java中的类与对象来袭
七、类与对象有关static成员的知识你真的了解吗?
刷题笔记:
1️⃣TvT——C语言进阶の刷题【1】:指针进阶
文章目录
- 前言
- 杻代码块
- 1. 代码块概念以及分类
- 2. 普通代码块
- 3. 构造块
- 4. 静态代码块
- 5. 静态代码块的执行顺序
- 总结
大家记得联系上一篇博客一起学习。
Java中的类与对象来袭
杻代码块 1. 代码块概念以及分类使用 {} 定义的一段代码称为代码块。
根据代码块定义的位置以及关键字,又可分为以下四种:
2. 普通代码块
普通代码块(本地代码块)
构造块(实例代码块)
静态块(静态代码块)
同步代码块(后续讲解多线程部分再谈)
- 普通代码块(本地代码块)
public static void main(String[] args) {
{
System.out.println("这就是一个代码块");
}
}
3. 构造块
- 构造块(实例代码块)
实例代码块定义在类的内部,方法的外部。
实例代码块内部可以初始化成员变量。
class Student {
public String name;
public double score;
public int age;
public Student (String name,double score,int age) {
this.name = name;
this.age = age;
this.score = score;
}
{
this.name = "11";
System.out.println("实例代码块");
}
public void goname(Student this) {
System.out.println(this);
}
}
4. 静态代码块
- 静态块(静态代码块)
静态代码块一般用于初始化静态成员。
class Student {
public String name;
public double score;
public int age;
public static String classes = "2001";
public Student (String name,double score,int age) {
this.name = name;
this.age = age;
this.score = score;
}
public void upClass(Student this) {
System.out.println("普通方法");
classes = "2002";
}
static
{
System.out.println("静态代码块");
}
public void goname(Student this) {
System.out.println(this);
}
}
5. 静态代码块的执行顺序
当我们执行下面这个代码时:
class Student {
public String name;
public double score;
public int age;
public static String classes = "2001";
public Student (String name,double score,int age) {
this.name = name;
this.age = age;
this.score = score;
System.out.println("这是一个构造函数");
}
{
System.out.println("实例代码块");
}
static
{
System.out.println("静态代码块");
}
public static void goname() {
int name1 = 3;
System.out.println("静态方法成员"+name1);
}
}
public class Test {
public static void main(String[] args) {
Student student4 = new Student("4",99,17);
}
}
❓ 以我们之前所学的知识来看,运行结果是不是应该只打印这是一个构造函数呢?
那运行一下看看结果:
我们发现结果并不是我们想象的那样。
那我们就可以得出结论:
| 加了代码块之后先加载静态代码块,再执行实例代码块,再执行构造方法。 |
❓ 那我们再来探讨一下,静态代码块和静态成员变量谁先执行呢?
class Student {
public String name;
public double score;
public int age;
public static String classes = "2001";
public Student (String name,double score,int age) {
this.name = name;
this.age = age;
this.score = score;
System.out.println("这是一个构造函数");
}
{
System.out.println("实例代码块");
}
static
{
classes = "2003";
System.out.println("静态代码块");
}
public static void goname() {
int name1 = 3;
System.out.println("静态方法成员"+name1);
}
}
public class Test {
public static void main(String[] args) {
System.out.println(Student.classes);
}
}
结果是这样的:
规则是:
| 看定义的顺序,谁先定义谁先执行。 |
执行顺序总结:
-
先执行静态的(加载了类就会被执行)
-
如果有多个静态的,那么看定义顺序
-
如果没有实例化对象,那么只会执行静态的。(静态的只会执行一次)
可以看见只执行了一次。 -
实例的数据(有多个实例要看定义的顺序)
-
构造函数执行
❗ 最后的注意事项:
总结
- 静态代码块不管生成多少个对象,其只会执行一次
- 静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的
- 如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次合并(这个你只要记住是从上往下执行的就行了,不容易弄混)
- 实例代码块只有在创建对象时才会执行



