本篇主要介绍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. 普通代码块
- 普通代码块(本地代码块)
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加载类时开辟空间并初始化的
- 如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次合并(这个你只要记住是从上往下执行的就行了,不容易弄混)
- 实例代码块只有在创建对象时才会执行