`

类实例初始化时代码块和静态代码块的使用

阅读更多

第一 普通的代码块

就是我们说说的代码块,它无论定义在构造方法的哪个地方(或前或后),总是在构造方法之前运行,每定义一个实例对象,就会运行一次。如果父类中也有代码块则运行顺序如下:

1 父类普通代码块

2 父类构造方法

3 子类普通代码块

4 子类构造方法

例如:

public class CodeBlockTest {
    public static void main(String[] args) throws Exception{
       new Child();
System.out.println("刚刚创建了一个实例");
       new Child();
System.out.println("刚刚创建了一个实例");
    }
}
 
class Parent{
    public Parent() {
       System.out.println("父类构造方法");
    }
    {
       System.out.println("父类普通代码块1");
    }
    {
       System.out.println("父类普通代码块2");
    }
}
 
class Child extends Parent{
    public Child() {
       System.out.println("子类构造方法");
    }
    {
       System.out.println("子类普通代码块");
    }
}

 

第二 静态代码块

静态代码块只在类加载的时候才会运行一次,之后使用该类时不会在运行。因为是先加载类才能创建实例的,所以当第一次使用类创建实例时,会先运行静态代码块。如果该类的父类中有静态代码块,则会先运行父类的静态代码块。如果之前已经加载了子类,则再加载父类时不再单独运行父类中的静态代码块。记住,静态代码块只运行一次。如下:

public class CodeBlockTest {
	public static void main(String[] args) throws Exception{
		System.out.println("*****加载子类*****");
		Class.forName("test2.Child");
		System.out.println("*****加载子类*****");
		Class.forName("test2.Child");
		System.out.println("*****加载父类*****");
		Class.forName("test2.Parent");
		System.out.println("*****加载父类*****");
		Class.forName("test2.Parent");
	}
}

class Parent{
	private int a;
	private static int b;
	static{
//		这是错误的,静态代码块中不能出现非静态的属性和方法
//		a = 1;
		
		//这是错误的,静态代码块中不能出现this和super等关键字
//		this.b = 10;
		
		//这是正确的
		b = 10;
		System.out.println("父类静态代码块1");
	}
	public Parent() {
		System.out.println("父类构造方法");
	}
	static{
		System.out.println("父类静态代码块2");
	}
}

class Child extends Parent{
	static{
		System.out.println("子类静态代码块");
	}
	public Child() {
		System.out.println("子类构造方法");
	}
}

 运行结果是:

*****加载子类*****

父类静态代码块1

父类静态代码块2

子类静态代码块

*****加载子类*****

*****加载父类*****

*****加载父类*****

 

注意:静态代码块中不能出现非静态的属性和方法,也不能出现thissuper等关键字。

1
2
分享到:
评论

相关推荐

    学习JAVA的三十个基本概念

    9. 静态与非静态:静态关键字用于声明类级别的变量和方法,不依赖于类的实例即可使用;非静态成员则与类的每个实例相关联。 10. 构造器:构造器是用于初始化新创建对象的特殊方法,通常与类名相同且无返回类型。 ...

    软件开发与实例分析 jsp 课件

    4. **Servlet生命周期**:JSP最终会被编译为Servlet,因此理解Servlet的生命周期(初始化、服务、销毁)对于理解JSP的工作原理至关重要。 5. **MVC(Model-View-Controller)**架构模式:在JSP开发中,常采用MVC...

    C#教程 C#教程C# 教程 编程 程序

    - 变量必须初始化后才能使用。 - **5.2 常量** - 常量是在程序运行期间其值不会改变的变量。 - 使用`const`关键字声明常量,例如`const int MAX_SIZE = 100;`。 - 常量必须在声明时赋值。 - **5.3 小结** - ...

    maweiming.rar_C Builder 加密_加密 解密_加密文件程序

    3. 初始化加密对象:创建一个AES加密类的实例,并设置密钥和模式,如CBC(Cipher Block Chaining)模式。 4. 加密文件:读取文件内容到缓冲区,然后分块进行加密。每次加密一块数据,然后将结果追加到输出文件中。 ...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar

    5.5.1 字符数组的定义和初始化 5.5.2 字符数组的赋值与引用 5.5.3 字符串和字符串结束标志 5.5.4 字符数组的输入输出 5.5.5 字符串处理函数 5.5.6 字符数组应用举例 *5.6 C++处理字符串的方法——字符串类与字符串...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar )

    5.5.1 字符数组的定义和初始化 5.5.2 字符数组的赋值与引用 5.5.3 字符串和字符串结束标志 5.5.4 字符数组的输入输出 5.5.5 字符串处理函数 5.5.6 字符数组应用举例 *5.6 C++处理字符串的方法——字符串类与字符串...

    深度探索C++对象模型 经典书籍 china-pub排名靠前

    2. **对象布局**:解释了对象在内存中的布局,包括数据成员的位置,以及非平凡构造函数和析构函数如何影响对象的初始化和清理。 3. **类型系统**:C++的类型系统如何影响对象的创建、转换和比较,特别是关于指针和...

    C#完全手册(經典入門必備)

    条件语句用于根据特定条件执行不同的代码块,包括if语句、switch语句等。 - **if语句**:用于根据单一条件执行代码。 - **switch语句**:用于根据多个条件执行代码。 **8.2 循环语句** 循环语句用于重复执行一组...

    C#完全手册.pdf

    - **类的声明和成员**:定义类的属性和方法,构造函数和析构函数,初始化和清理对象状态。 #### 第十一章:方法 - **方法的声明和参数**:定义函数的行为和输入/输出。 - **静态和非静态方法**:静态方法不依赖于...

    Java实现网页截图技术

    在静态初始化块中,通过`System.loadLibrary("Snap")`加载了本地库。`main`方法中,实例化了`Snap`类,并调用了`Start`方法,传入了网页URL和输出图像的名称。`Start`方法被声明为`native`,这意味着它的实现是在...

    c#系列教程(pdf)

    - 强调C#的语法规则,如分号的使用和大括号的配对。 - **运行程序** - 介绍如何在Visual Studio或命令行界面中编译和运行C#程序。 - 演示编译过程和运行结果,帮助理解编译型语言的工作原理。 - **添加注释** ...

    C#教程.pdf

    - 变量是用于存储数据的容器,了解变量的声明、初始化和使用规则。 - **常量** - 常量在程序执行期间其值不可改变,了解如何声明和使用常量。 #### 第六章:类型转换 - **隐式类型转换** - 当源类型可以无损地...

    C#完全手册(非常不错的书)

    - **声明和初始化**:变量声明包括指定类型和变量名,初始化是在声明时赋初始值。 - **作用域**:变量的作用域决定了它可以被哪些代码块访问。 - **5.2 常量** - **声明**:使用`const`关键字声明常量,声明时...

Global site tag (gtag.js) - Google Analytics