构造代码块与静态代码块
- 格式:doc
- 大小:38.00 KB
- 文档页数:4
构造块静态块构造块构造块
构造块和静态块都是Java语言中的重要概念,它们在类被加载时会被执行。
构造块是在对象被创建时执行的,它可以用来初始化实例变量。
静态块是在类被加载时执行的,它可以用来初始化静态变量。
同时,Java中还有一种特殊的构造块叫做“双括号初始化”,它可以在定义变量时进行初始化操作。
构造块和静态块的执行顺序与位置有关,如果一个类中有多个构造块或静态块,它们会按照在类中出现的顺序依次执行。
在执行构造块或静态块时,可以使用try-catch-finally语句进行异常处理。
除了构造块和静态块,Java中还有一个概念叫做“构造函数”,它是在对象被创建时执行的特殊方法。
构造函数与构造块的区别是构造函数可以有参数,而构造块没有。
同时,构造函数也可以被重载,允许在创建对象时传入不同的参数。
综上所述,构造块和静态块是Java语言中非常基础和重要的概念,需要开发者在编写程序时充分理解和应用。
- 1 -。
java代码块的执行顺序Java代码块的执行顺序是指在Java程序中,代码块按照何种顺序执行的问题。
Java中的代码块有三种,即静态代码块、实例代码块和构造代码块,它们的执行顺序如下:1. 静态代码块:在类加载时执行,只执行一次,用于初始化静态变量以及其它需要在类加载时完成的操作。
它的执行顺序与它们在源文件中出现的次序相同。
2. 实例代码块:在创建对象时执行,每创建一个新的对象就会执行一次,用于初始化实例变量以及其它需要在对象创建时完成的操作。
它的执行顺序与它们在构造函数中出现的次序相同。
3. 构造代码块:在构造函数执行之前执行,用于初始化实例变量和共性的代码部分,每次创建对象时都会执行。
下面是一个小例子来演示Java代码块的执行顺序:```javapublic class BlockOrderDemo {static {System.out.println("静态代码块1"); }{System.out.println("实例代码块1"); }public BlockOrderDemo() {System.out.println("构造函数");}static {System.out.println("静态代码块2"); }{System.out.println("实例代码块2"); }public static void main(String[] args) { new BlockOrderDemo();new BlockOrderDemo();}}```运行结果如下:```静态代码块1静态代码块2实例代码块1构造函数实例代码块2实例代码块1构造函数实例代码块2```从这个例子可以看出,Java代码块的执行顺序是按照它们在源文件中出现的顺序执行的。
具体来说,静态代码块会在类加载时执行,且只会执行一次;实例代码块会在对象创建时执行,每创建一个新的对象就会执行一次;构造代码块会在构造函数执行之前执行,每次创建对象时都会执行。
final和static的用法final和static的用法final的用法•修饰类:被final修饰的类不能被继承。
这样可以确保类的完整性和安全性,避免被其他类修改或扩展。
•修饰方法:被final修饰的方法不能被子类重写。
这样可以确保方法的行为不会被修改,提高程序的稳定性和可靠性。
•修饰变量:被final修饰的变量称为常量,只能被赋值一次,之后不能再更改。
常量的命名通常使用全大写字母,多个单词之间用下划线分隔。
static的用法•修饰成员变量:被static修饰的成员变量属于类,而不是对象。
所有的对象共享同一个static变量的值,在内存中只会有一份拷贝。
•修饰方法:被static修饰的方法称为静态方法,可以直接通过类名调用,不需要创建对象。
静态方法只能访问静态成员,不能访问非静态成员。
•修饰代码块:被static修饰的代码块称为静态代码块,用于在类加载时执行一些初始化操作。
静态代码块只会在类加载时执行一次,且先于静态方法和构造方法执行。
•修饰内部类:被static修饰的内部类称为静态内部类,与外部类没有绑定关系,可以直接通过类名访问。
静态内部类不能访问外部类的非静态成员。
•修饰导入语句:在导入语句中使用import static可以导入静态成员,使得可以直接使用静态成员的名称,而不需要通过类名访问。
final和static的结合使用•final修饰的变量可以与static修饰的变量结合使用,称为静态常量。
静态常量在内存中只有一份拷贝,并且不能被修改。
•final修饰的方法可以与static修饰的方法结合使用,称为静态方法。
静态方法可以直接通过类名调用,而且不能被子类重写。
以上是final和static的一些基本用法和结合使用的情况。
它们在Java编程中非常常用,能够提高程序的效率和安全性。
通过合理使用final和static,我们可以更好地控制类的继承关系、变量的不可修改性和方法的可靠性。
final修饰类的例子final class MyClass {// class implementation}在这个例子中,被final修饰的类MyClass不能被继承。
静态代码块和构造方法的特点静态代码块和构造方法是Java中两个特殊的类成员,它们在对象的创建和类的加载过程中发挥着重要的作用。
本文将从不同角度探讨静态代码块和构造方法的特点,并通过实际例子展示其用途和指导意义。
首先,我们来看静态代码块。
静态代码块是用static关键字修饰的一段代码,在类加载时会被执行,且只会执行一次。
静态代码块的主要特点如下:1. 执行顺序:静态代码块在类加载的过程中自动执行,且优先于构造方法执行。
这使得我们可以在静态代码块中对类进行初始化操作,例如加载属性文件、连接数据库等。
2. 只执行一次:静态代码块在类加载时只会执行一次,无论创建多少个对象。
这是因为静态代码块属于类,而不是对象,它和类绑定在一起。
3. 配合静态成员使用:静态代码块通常用于初始化静态成员变量,因为静态成员变量在类加载时就会被分配内存,而构造方法是在对象被创建时才会执行。
通过静态代码块,我们可以在类加载时对静态成员变量进行初始化,保证其在对象创建前就具有合理的值。
接下来,我们来讨论构造方法。
构造方法是用于创建对象的特殊方法,其主要特点如下:1. 对象创建时执行:构造方法在使用new关键字创建对象时被调用,用于进行对象的初始化操作。
通过构造方法,我们可以给对象的属性赋初始值,确保对象在创建后处于合理的状态。
2. 与类同名:构造方法与类同名,没有返回值类型声明。
这样的设计使得我们能够简便地创建对象,因为Java编译器会根据new关键字自动寻找与类名相同的构造方法。
3. 可重载:构造方法可以根据不同的参数列表进行重载,以满足不同的对象创建需求。
这使得我们可以根据具体情况选择适当的构造方法,提高了代码的灵活性和可复用性。
静态代码块和构造方法在实际应用中有着广泛的指导意义。
在项目开发中,我们可以利用静态代码块来完成一些全局初始化操作,例如加载配置文件、初始化连接池等。
而构造方法则可以用于创建对象并初始化对象属性,确保对象在创建后处于正确的状态。
代码块的种类和特点
以下四种代码块:
普通代码块:也称为局部代码块,是一种由花括号包裹的代码块,通常用于限制变量的作用范围。
普通代码块的特点是可以在任意位置定义和使用,并且对程序的执行流程没有影响。
构造块:也称为实例初始化块,是一种在类中定义的代码块,用于对新创建的对象进行初始化操作。
构造块的特点是它会在每次创建对象时自动执行,并且优先于类的构造方法执行。
静态块:也称为类初始化块,是一种在类被加载时执行的代码块,用于对类的静态成员进行初始化操作。
静态块的特点是它只会在类第一次加载时执行一次,并且优先于所有其他静态成员和静态方法执行。
同步代码块:也称为synchronized 块,是一种用于实现多线程同步的代码块。
同步代码块的特点是它内部的代码只能由一个线程执行,其它线程需要等待该线程执行完毕后才能访问。
这些特殊的代码块各有不同的特点和使用场景,普通代码块和构造块主要用于实现程序的功能逻辑,静态块和同步代码块主要用于实现程序的并发控制。
合理使用这些代码块可以提高程序的性能和可维护性。
1。
Java中static是什么?作⽤是什么?如何使⽤?——关键字static static概述静态的意思可以修饰的内容(1) 成员变量(2) 成员⽅法(3) 代码块修饰成员变量概述: static 修饰的成员变量称为静态变量类变量静态属性成员变量: 定义在类的成员位置的变量实例变量: 就是现在说的成员变量 ---> ⾮静态变量静态变量: 被static 修饰的实例变量 ----> 静态变量在实际的开发中不会特意的区分实例变量和静态变量,经常使⽤成员变量来默认表⽰实例变量语法:访问修饰符 static 数据类型变量名 = 变量值;static 访问修饰符数据类型变量名 = 变量值;特点:1. 被所有对象共享2. 可以使⽤类名.属性名访问3. 也可以通过对象的引⽤进⾏访问(不推荐)案例://案例1: 关于特点1public class Demo2 {public static void main(String[] args) {//创建两个对象 ---> test1 test2 是两个独⽴的对象每个对象中都有⾃⼰的 a bTest1 test1 = new Test1();Test1 test2 = new Test1();test1.a++;test1.b++;test1.c++;System.out.println(test1.a);//11System.out.println(test1.b);//21System.out.println(test1.c);//31System.out.println(test2.a);//10System.out.println(test2.b);//2System.out.println(test2.c);Test1 test3 = new Test1();System.out.println(test3.c);}}class Test1{// 定义⼀个成员变量int a = 10;int b = 20;// 定义⼀个静态变量static int c = 30;}//案例2: 关于特点2public class Demo2 {public static void main(String[] args) {//创建两个对象 ---> test1 test2 是两个独⽴的对象每个对象中都有⾃⼰的 a b// Test1 test1 = new Test1();// Test1 test2 = new Test1();//// //对于成员变量来说成员变量随着对象的创建⽽存在对象没有成员变量也就没有// System.out.println(test1.a);// System.out.println(test1.b);//静态变量 : 是随着类的加载⽽存在随着类的消失⽽消失// 类的加载: 当第⼀次使⽤⼀个类的时候 jvm 会从硬盘中读取字节码⽂件中的信息将信息保存到 Java虚拟机的⽅法区 // 1 类先加载 2 才能创建对象// 静态变量的存在先于对象的存在 ----> 类变量//直接通过类名访问静态变量System.out.println(Test1.c);}}class Test1{// 定义⼀个成员变量int a = 10;int b = 20;// 定义⼀个静态变量static int c = 30;}//案例3: 关于特点3public class Demo2 {public static void main(String[] args) {//创建两个对象 ---> test1 test2 是两个独⽴的对象每个对象中都有⾃⼰的 a b// Test1 test1 = new Test1();// Test1 test2 = new Test1();//// //对于成员变量来说成员变量随着对象的创建⽽存在对象没有成员变量也就没有// System.out.println(test1.a);// System.out.println(test1.b);//静态变量 : 是随着类的加载⽽存在随着类的消失⽽消失// 类的加载: 当第⼀次使⽤⼀个类的时候 jvm 会从硬盘中读取字节码⽂件中的信息将信息保存到 Java虚拟机的⽅法区 // 1 类先加载 2 才能创建对象// 静态变量的存在先于对象的存在 ----> 类变量//直接通过类名访问静态变量//System.out.println(Test1.c);//创建对象访问Test1 test1 = new Test1();// 浪费空间System.out.println(test1.c);}}class Test1{// 定义⼀个成员变量int a = 10;int b = 20;// 定义⼀个静态变量static int c = 30;}修饰成员⽅法概述:static 修饰成员⽅法:静态⽅法语法:访问修饰符 static 返回值类型⽅法名(形参列表){⽅法的实现;}static 访问修饰符返回值类型⽅法名(形参列表){⽅法的实现;}特点:1.静态的⽅法中不可以直接访问⾮静态的成员(成员变量和成员⽅法)2.如果要访问⾮静态的成员必须创建对象通过引⽤去访问3.静态⽅法可以通过类名.⽅法名()直接访问也可以通过引⽤去访问(不建议)4.静态的⽅法可以被继承静态的⽅法不能被⾮静态的⽅法所覆盖当⼦类的静态⽅法和⽗类中的静态⽅法语法上能形成重写的语法但是也不能构成重写,重写注解@Override 不能通过静态⽅法的调⽤不符合多态的特点(引⽤是什么类型调⽤的⽅法就是这个类型中的⽅法5.在静态⽅法中是不可以使⽤ this 和 super 关键字因为 this 和 super都是和对象有关的⽽静态的成员和对象⽆关先于对象存在特点-案例案例1: 关于特点1public class Demo2 {public static void main(String[] args) {}}class Test1 {// 成员变量int a = 10;//静态变量static int b = 20;//定义⼀个成员⽅法 ---> 可以访问成员变量静态变量public void m1() {System.out.println(a);System.out.println(b);System.out.println("我是成员⽅法");}//定义⼀个静态⽅法public static void m2() {//System.out.println(a);//访问不了成员变量因为成员变量随着对象的创建⽽存在静态⽅法先于成员变量存在 //m1();System.out.println(b);System.out.println("我是静态⽅法");}}// 问题: 在讲⽅法的时候,为什么要求⽅法的修饰符固定写为 public static ?// 解答: 就是因为主⽅法是静态的//案例2: 关于特点2public class Demo2 {public static void main(String[] args) {}}class Test1 {// 成员变量int a = 10;//静态变量static int b = 20;//定义⼀个成员⽅法 ---> 可以访问成员变量静态变量public void m1() {System.out.println(a);System.out.println(b);System.out.println("我是成员⽅法");}//定义⼀个静态⽅法public static void m2() {//System.out.println(a);//访问不了成员变量因为成员变量随着对象的创建⽽存在静态⽅法先于成员变量存在 //m1();//⾮要访问成员变量必须创建对象Test1 test1 = new Test1();System.out.println(test1.a);test1.m1();System.out.println(b);System.out.println("我是静态⽅法");}}案例3: 关于特点3public class Demo2 {public static void main(String[] args) {// Test1 test1 = new Test1(); //不建议//// test1.m1();//成员⽅法// test1.m2();//静态⽅法Test1.m2();}}class Test1 {// 成员变量int a = 10;//静态变量static int b = 20;//定义⼀个成员⽅法 ---> 可以访问成员变量静态变量public void m1() {System.out.println(a);System.out.println(b);System.out.println("我是成员⽅法");}//定义⼀个静态⽅法public static void m2() {//System.out.println(a);//访问不了成员变量因为成员变量随着对象的创建⽽存在静态⽅法先于成员变量存在 //m1();//⾮要访问成员变量必须创建对象Test1 test1 = new Test1();System.out.println(test1.a);test1.m1();System.out.println(b);System.out.println("我是静态⽅法");}}//案例4: 关于特点4public class Demo2 {public static void main(String[] args) {// TestSub testSub = new TestSub();// testSub.m2();// TestSub.m2();// 静态⽅法可以被继承// TestSub.m2("刘洋");//假设形成的是重写Test t1 = new TestSub();//⽗类引⽤指向⼦类对象t1.m2();//引⽤是什么类型就会调⽤引⽤中的⽅法和对象⽆关静态⽅法没有多态的 }}class Test {//定义⼀个静态⽅法public static void m2() {System.out.println("我是静态⽅法");}//是否可以重载public static void m2(int a) {System.out.println("我是重载的静态⽅法 m2");}}class TestSub extends Test {// 是否能够形成⼦⽗类之间的⽅法的重载public static void m2(String s){System.out.println("我是⼦⽗类之间的⽅法的重载");}// 是否可以被重写//@Override // 虽然⽅法的格式符合⽅法的重写但是本质不是重写public static void m2(){System.out.println("我是⼦类重写后的静态⽅法m2");}}// 案例5: 关于特点5public class Demo2 {public static void main(String[] args) {// TestSub testSub = new TestSub();// testSub.m2();// TestSub.m2();// 静态⽅法可以被继承// TestSub.m2("刘洋");//假设形成的是重写Test t1 = new TestSub();//⽗类引⽤指向⼦类对象t1.m2();//引⽤是什么类型就会调⽤引⽤中的⽅法和对象⽆关静态⽅法没有多态的 }}class Test {int a = 10;//定义⼀个静态⽅法public static void m2() {int a = 20;System.out.println(a);//20System.out.println(this.a);System.out.println("我是静态⽅法");}}修饰代码块分类:(1)局部代码块(2)动态代码块 ---> 构造代码块(3)静态代码块特点:局部代码块:定义在⽅法中作⽤:⽤来限定局部变量的作⽤域案例public class Demo2 {public static void main(String[] args) {{int a = 10;// 7 -- 10}{int a = 20;//14 -- 15}}}动态代码块(构造代码块初始代码块):定义在类中⽅法外 ---> 成员位置作⽤:⽤于在创建对象时和成员变量按照从上向下的顺序进⾏初始化操作,可以将所有构造⽅法中共同的代码放到动态代码块中。
静态代码块和构造方法的特点静态代码块和构造方法是面向对象编程中常用的两种代码块,它们在对象的创建和初始化过程中起着重要的作用。
下面我将介绍它们的特点并进行比较。
静态代码块:1. 静态代码块是在类加载时执行的,只会执行一次。
一般用于对静态变量进行初始化或执行静态方法。
2. 静态代码块是在类加载的过程中执行的,而构造方法是在对象创建的过程中执行的。
3. 静态代码块不能引用任何非静态成员变量或方法,因为在静态代码块加载时,非静态成员还未初始化。
4. 静态代码块可以有多个,按照定义的顺序执行。
5. 静态代码块执行的顺序是在静态变量初始化之后,构造方法之前。
6. 静态代码块的作用是在类加载的过程中对一些静态变量进行初始化,并且可以执行一些与类相关的操作。
构造方法:1. 构造方法用于创建对象时进行对象的初始化操作,是一种特殊的方法,没有返回值类型。
2. 构造方法与类同名,没有返回值,可以有参数或无参数,可以重载。
3. 构造方法可以引用类中的任意成员变量和方法。
4. 构造方法可以通过this关键字调用其他构造方法,实现代码复用。
5. 当一个类没有定义构造方法时,编译器会自动生成一个无参的默认构造方法。
6. 构造方法的执行顺序是在对象创建时被调用,并且在静态代码块执行之后。
相同点:1. 静态代码块和构造方法都是在对象的创建和初始化过程中起作用。
2. 静态代码块和构造方法都可以包含一些初始化代码。
不同点:1. 静态代码块是在类加载时执行的,只会执行一次,而构造方法在对象创建时被调用,可能会被多次调用。
2. 静态代码块不能引用任何非静态成员变量或方法,而构造方法可以引用类中的任意成员变量和方法。
3. 静态代码块只能用来初始化静态变量,而构造方法可以对所有的成员变量进行初始化。
4. 静态代码块执行的顺序是在静态变量初始化之后,构造方法之前,而构造方法的执行顺序是在对象创建时被调用,并且在静态代码块执行之后。
总结:静态代码块和构造方法在对象的创建和初始化过程中起着重要的作用。
静态块、构造块、构造方法是Java中常见的三种代码块。
它们都有自己的特点和作用,本文将分别介绍它们的概念、用法及实例。
一、静态块静态块是在类加载时自动执行的代码块,用于初始化静态变量。
静态块的语法格式为:```javastatic {// 静态块中的代码}```静态块可以有多个,按照出现顺序依次执行。
它们在程序启动时执行一次,且只执行一次。
以下是一个静态块的例子:```javapublic class StaticBlockExample {static {System.out.println("静态块1执行");}static {System.out.println("静态块2执行");}public static void main(String[] args) {System.out.println("main方法执行");}}```输出结果为:```静态块1执行静态块2执行main方法执行```从输出结果可以看出,静态块在main方法执行之前执行,且按照出现顺序依次执行。
二、构造块构造块是在创建对象时自动执行的代码块,用于初始化实例变量。
构造块的语法格式为:```java{// 构造块中的代码}```构造块可以有多个,按照出现顺序依次执行。
它们在每次创建对象时执行一次。
以下是一个构造块的例子:```javapublic class ConstructorBlockExample {{System.out.println("构造块1执行");}{System.out.println("构造块2执行");}public ConstructorBlockExample() {System.out.println("构造方法执行");}public static void main(String[] args) {new ConstructorBlockExample();}}```输出结果为:```构造块1执行构造块2执行构造方法执行```从输出结果可以看出,构造块在构造方法执行之前执行,且按照出现顺序依次执行。
同⼀个类中的静态代码块构造代码块构造⽅法执⾏顺序:静态代码块 -- 构造代码块 -- 构造⽅法(与编写代码的顺序⽆关)class Code {// 静态代码块static {int x = 1;System.out.println(x);}// 构造代码块{int x = 2;System.out.println(x);}// 构造⽅法public Code() {int x = 3;System.out.println(x);}// 构造代码块{int x = 2;System.out.println(x);}// 静态代码块static {int x = 1;System.out.println(x);}}public class test {public static void main(String[] args) {Code c1 = new Code();Code c2 = new Code();}}执⾏结果new了两个对象c1,c2 所以构造代码块和构造⽅法都执⾏了2次,且构造代码块优先构造⽅法执⾏静态static是随着类的加载⽽加载所以只执⾏了1次最后,再结合main⽅法的class Code {// 静态代码块static {System.out.println("我是静态代码块");}// 构造代码块{System.out.println("我是构造代码块");}// 构造⽅法public Code() {System.out.println("我是构造⽅法");}}public class test {static {System.out.println("我是public类中的静态代码块"); }public static void main(String[] args) {System.out.println("1.我是main⽅法");Code c1 = new Code();System.out.println("2.我是main⽅法");Code c2 = new Code();}}执⾏结果结论:public类中的静态代码块先执⾏。
静态变量,静态代码块
代码块就是⼀块代码,是⼀对⼤括号括起来的内容
⽅法中:限制变量的⽣命周期
类中⽅法外:
构造代码块:没有关键字修饰,在每次创建对象时,在构造⽅法执⾏前进⾏执⾏
⽤途:可以对成员变量进⾏初始化。
不能对静态常量赋值;
静态代码块:需要使⽤static修饰。
随着类的加载⽽加载执⾏,只有在类加载时加载⼀次
不能对成员变量进⾏初始化。
⽤途:可以对静态成员变量进⾏初始化
可以对静态常量赋值
在创建对象时,可以简单的分为两步:加载类的字节码⽂件,创建对象实例。
加载字节码⽂件会执⾏静态代码块,并且静态代码块只会加载执⾏⼀次
创建对象执⾏静态代码块,构造代码块,构造⽅法
A 静态常量要么直接赋值,要么在静态代码块中赋值
B 常量是归属于对象的,只有在创建对象时才可以赋值,不能放在静态代码块中赋值
C 静态成员变量归属于类,在字节码加载时进⾏加载,可以多次赋值,可以在静态代码块和构造代码块都可以赋值
D 对象成员变量只能在构造代码块中赋值。
构造代码块(了解)
编码是基本不用,面试时考的可能性大。
1什么是构造代码块
构造代码块,又叫实例初始化块(实例块)。
它是被类体直接包含的,它是类的成员之一。
它也是无名块
2实例块的语法
class Demo {
{
System.out.println(“hello world”);
}
}
实例块是被类体直接包含的。
实例块中可以放0 ~ n条语句。
3实例块什么时候执行
与显示初始化语句同时执行(创建对象时执行)。
它们的执行顺序是按上下顺序执行的!class Person {
{System.out.println("hello1");} //a
private String name = "zhangSan"; //1
{System.out.println("hello2");} //b
private int age = 100; //2
{System.out.println("hello3");} //c
private String sex = "male"; //3
{System.out.println("hello4");} //d
}
当创建一个Person对象时,执行顺序是a、1、b、2、c、3、d。
4实例块的局限性
一般情况下没有使用实例块的必要,只有在匿名内部类中,需要使用构造器时才会使用实例块来充当构造器的作用。
实例块只能对下面定义的属性做写操作,而不能做读操作。
实例块对上面定义的属性就没有限制了。
读写操作都可以。
class Person {
{
name = "zhangSan";//OK,对下面定义的属性做写操作
System.out.println(name);// 错误,不能对下面定义的属性做读操作
}
private String name;
{
name = "liSi";//OK,对上面定义的属性做什么操作都可以
System.out.println(name);//OK,对上面定义的属性做什么操作都可以
}
}
静态块(掌握)
在就业班中会看到它的使用。
使用的不是很多!
1什么是静态块
静态块,又叫静态构造代码块、静态初始化块。
它是被类体直接包含的,它是类的成员之一。
使用static修饰的块
2静态块的语法
class Demo {
static {
System.out.println(“hello world”);
}
}
静态块是被类体直接包含的。
静态块中可以放0 ~ n条语句。
3静态块什么时候执行
与静态显示初始化语句同时执行(类加载时被执行)。
它们的执行顺序是按上下顺序执行的!class Person {
static {System.out.println("hello1");} //a
private static String name = "zhangSan"; //1
static {System.out.println("hello2");} //b
private static int age = 100; //2
static {System.out.println("hello3");} //c
private static String sex = "male"; //3
static {System.out.println("hello4");} //d
}
Person类被加载时,执行顺序是a、1、b、2、c、3、d。
4静态块的局限性
静态块只能对下面定义的静态属性做写操作,而不能做读操作。
静态块对上面定义的静态属性就没有限制了。
读写操作都可以。
class Person {
static {
name = "zhangSan";//OK,对下面定义的静态属性做写操作
System.out.println(name);// 错误,不能对下面定义的静态属性做读操作}
private static String name;
static {
name = "liSi";//OK,对上面定义的静态属性做什么操作都可以
System.out.println(name);//OK,对上面定义的静态属性做什么操作都可以}
}
5什么时候使用静态块
有些代码需要在类加载时就必须完成的时候,使用静态块。
对静态属性的初始化很复杂时(不是一条语句能完成的时候),使用静态块。
构造块:直接在类中定义的代码块称为{}构造代码块。
构造代码块在创建对象时被调用,每次创建对象都会被调用,并且构造代码块的执行次序优先于类构造函数。
静态代码块:在java中使用static关键字声明的代码块。
静态块用于初始化类,为类的属性初始化。
每个静态代码块只会执行一次。
由于JVM在加载类时会执行静态代码块,所以静态代码块先于主方法执行。
如果类中包含多个静态代码块,那么将按照"先定义的代码先执行,后定义的代码后执行"。
注意:1 静态代码块不能存在于任何方法体内。
2 静态代码块不能直接访问静态实例变量和实例方法,需要通过类的实例对象来访问。