第一 普通的代码块
就是我们说说的代码块,它无论定义在构造方法的哪个地方(或前或后),总是在构造方法之前运行,每定义一个实例对象,就会运行一次。如果父类中也有代码块则运行顺序如下:
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
子类静态代码块
*****加载子类*****
*****加载父类*****
*****加载父类*****
注意:静态代码块中不能出现非静态的属性和方法,也不能出现this和super等关键字。
相关推荐
9. 静态与非静态:静态关键字用于声明类级别的变量和方法,不依赖于类的实例即可使用;非静态成员则与类的每个实例相关联。 10. 构造器:构造器是用于初始化新创建对象的特殊方法,通常与类名相同且无返回类型。 ...
4. **Servlet生命周期**:JSP最终会被编译为Servlet,因此理解Servlet的生命周期(初始化、服务、销毁)对于理解JSP的工作原理至关重要。 5. **MVC(Model-View-Controller)**架构模式:在JSP开发中,常采用MVC...
- 变量必须初始化后才能使用。 - **5.2 常量** - 常量是在程序运行期间其值不会改变的变量。 - 使用`const`关键字声明常量,例如`const int MAX_SIZE = 100;`。 - 常量必须在声明时赋值。 - **5.3 小结** - ...
3. 初始化加密对象:创建一个AES加密类的实例,并设置密钥和模式,如CBC(Cipher Block Chaining)模式。 4. 加密文件:读取文件内容到缓冲区,然后分块进行加密。每次加密一块数据,然后将结果追加到输出文件中。 ...
5.5.1 字符数组的定义和初始化 5.5.2 字符数组的赋值与引用 5.5.3 字符串和字符串结束标志 5.5.4 字符数组的输入输出 5.5.5 字符串处理函数 5.5.6 字符数组应用举例 *5.6 C++处理字符串的方法——字符串类与字符串...
5.5.1 字符数组的定义和初始化 5.5.2 字符数组的赋值与引用 5.5.3 字符串和字符串结束标志 5.5.4 字符数组的输入输出 5.5.5 字符串处理函数 5.5.6 字符数组应用举例 *5.6 C++处理字符串的方法——字符串类与字符串...
2. **对象布局**:解释了对象在内存中的布局,包括数据成员的位置,以及非平凡构造函数和析构函数如何影响对象的初始化和清理。 3. **类型系统**:C++的类型系统如何影响对象的创建、转换和比较,特别是关于指针和...
条件语句用于根据特定条件执行不同的代码块,包括if语句、switch语句等。 - **if语句**:用于根据单一条件执行代码。 - **switch语句**:用于根据多个条件执行代码。 **8.2 循环语句** 循环语句用于重复执行一组...
- **类的声明和成员**:定义类的属性和方法,构造函数和析构函数,初始化和清理对象状态。 #### 第十一章:方法 - **方法的声明和参数**:定义函数的行为和输入/输出。 - **静态和非静态方法**:静态方法不依赖于...
在静态初始化块中,通过`System.loadLibrary("Snap")`加载了本地库。`main`方法中,实例化了`Snap`类,并调用了`Start`方法,传入了网页URL和输出图像的名称。`Start`方法被声明为`native`,这意味着它的实现是在...
- **静态方法**:通过使用`static`关键字声明,可以在没有类实例的情况下调用。 - **方法的重载**:同一个方法名可以有不同的参数列表。 ##### 属性 属性提供了一种简洁的方式来访问类的私有字段。 - **声明属性*...
- 强调C#的语法规则,如分号的使用和大括号的配对。 - **运行程序** - 介绍如何在Visual Studio或命令行界面中编译和运行C#程序。 - 演示编译过程和运行结果,帮助理解编译型语言的工作原理。 - **添加注释** ...
- 变量是用于存储数据的容器,了解变量的声明、初始化和使用规则。 - **常量** - 常量在程序执行期间其值不可改变,了解如何声明和使用常量。 #### 第六章:类型转换 - **隐式类型转换** - 当源类型可以无损地...
- **声明和初始化**:变量声明包括指定类型和变量名,初始化是在声明时赋初始值。 - **作用域**:变量的作用域决定了它可以被哪些代码块访问。 - **5.2 常量** - **声明**:使用`const`关键字声明常量,声明时...
- **构造函数和析构函数**:构造函数用于初始化对象的状态;析构函数则在对象销毁前执行清理工作。 ##### 3.3 方法 - **方法的声明**:定义方法的签名,包括返回类型、方法名和参数列表。 - **方法中的参数**:...