<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"><span style="font-size:24px;"><strong>一、普通代码快</strong></span></span>
概念:在方法或语句中出现的{}就称为普通代码块。
执行顺序:普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定。即:“先出现先执行”。
代码示例:
public class CodeBlock01 { public static void main(String[] args) { { int x = 3; System.out.println("1,普通代码块内的变量x=" + x); } int x = 1; System.out.println("主方法内的变量x=" + x); { int y = 7; System.out.println("2,普通代码块内的变量y=" + y); } } } /* * 运行结果: * 1,普通代码块内的变量x=3 * 主方法内的变量x=1 * 2,普通代码块内的变量y=7 */
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"><span style="font-size:24px;">二、构造代码块</span></span>
概念:直接在类中定义且没有加static关键字的代码块称为{}构造代码块。
执行顺序:构造代码块在创建对象时被调用,每次创建对象都会被调用。构造代码块的执行次序优先于类构造函数。
特点:构造代码块其实就是一个“初始化”的代码段,优先于构造函数,对所有的类的对象都是一样的初始化,不像构造函数,不同的对象可以有不同的初始化结果
class CodeBlock02 { { System.out.println("第一代码块"); } public CodeBlock02() { System.out.println("构造方法"); } { System.out.println("第二构造块"); } public static void main(String[] args) { new CodeBlock02(); new CodeBlock02(); } } /* 第一代码块 第二构造块 构造方法 第一代码块 第二构造块 构造方法 */
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"><strong><span style="font-size:24px;">三</span></strong></span><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"><span style="font-size:24px;">、静态代码块</span></span>
概念:在java类中static关键字声明的代码块。静态块用于初始化类,为类的属性初始化。每个静态代码块只会执行一次。
执行顺序:由于JVM在加载类时会执行静态代码块,所以静态代码块先于主方法执行。如果类中出现多个静态代码块,那么"先定义的代码先执行,后定义的代码后执行"
注意:
1 静态代码块不能存在于任何方法体内。
2 静态代码块不能直接访问静态实例变量和实例方法,需要通过类的实例对象来访问。
代码示例:
class Code { { System.out.println("Code的构造块"); } static { System.out.println("Code的静态代码块"); } public Code() { System.out.println("Code的构造方法"); } } class CodeBlock03 { { System.out.println("CodeBlock03的构造块"); } static { System.out.println("CodeBlock03的静态代码块"); } public CodeBlock03() { System.out.println("CodeBlock03的构造方法"); } public static void main(String[] args) { System.out.println("CodeBlock03的主方法"); new Code(); new Code(); new CodeBlock03(); new CodeBlock03(); } } /* CodeBlock03的静态代码块 CodeBlock03的主方法 Code的静态代码块 Code的构造块 Code的构造方法 Code的构造块 Code的构造方法 CodeBlock03的构造块 CodeBlock03的构造方法 CodeBlock03的构造块 CodeBlock03的构造方法 */
四、静态代码块(包括静态函数)内不能对类中非静态的成员进行操作,比如输出一个成员变量的初始值,但是该变量不是静态类型的,这是不允许的;(不同于构
造代码块)。
class StaticCode { int num = 9; // 这是静态代码块,不允许访问非静态成员 static { System.out.print(num);// 非法 } // 这是构造代码块,可以访问非静态成员 { System.out.print(num);// 可以 } }