引用eway
一个类的运行,JVM做会以下几件事情 1、类装载 2、链接 3、初始化 4、实例化;而初始化阶段做的事情是初始化静态变量和执行静态方法等的工作。
Class.forName(args[0],true,off.getClass().getClassLoader()):JVM在load class之后就进行initial的工作。
Class.forName(args[0],false,off.getClass().getClassLoader()):JVM不需要在load class之后进行initial的工作。将initial的工作推迟到了newInstance的时候进行。
所以,static块的绝对不是什么“只是在类被第一次实体化的时候才会被仅仅调用一次”,而应该是在类被初始化的时候,仅仅调用一次。
class StaticDemo{ public static String info; private String other; static{ info="静态语句块能操纵静态的对象"; //other="无法操纵非static对象"; System.out.println("==StaticDemo被加载到jvm=="); System.out.println("info="+info); } public StaticDemo(){ System.out.println("StaticDemo被实例化了"); } } public class StaticTest { public static void main(String[] args){ try{ Class.forName("StaticDemo", true, StaticTest.class.getClassLoader()); }catch(ClassNotFoundException e){ e.printStackTrace(); } } }
运行结果:
==StaticDemo被加载到jvm==
info=静态语句块能操纵静态的对象
StaticDemo被实例化了
把参数true变成false,并实例化两个StaticDemo对象 。
class StaticDemo{ public static String info; private String other; static{ info="静态语句块能操纵静态的对象"; //other="无法操纵非static对象"; System.out.println("==StaticDemo被加载到jvm=="); System.out.println("info="+info); } public StaticDemo(){ System.out.println("StaticDemo被实例化了"); } } public class StaticTest { public static void main(String[] args){ try{ Class.forName("StaticDemo", false, StaticTest.class.getClassLoader()); }catch(ClassNotFoundException e){ e.printStackTrace(); } StaticDemo obj1=new StaticDemo(); StaticDemo obj2=new StaticDemo(); } }
运行结果:
==StaticDemo被加载到jvm==
info=静态语句块能操纵静态的对象
StaticDemo被实例化了
StaticDemo被实例化了
相关推荐
这些静态语句块分别在类加载时被执行,输出`"static father555"`和`"static son555"`。 此外,`Son`类的构造函数显式地调用了父类`Father`的构造函数。这在继承关系中非常重要,因为子类构造函数默认会调用父类无参...
首先,基本语句是C#中的基本构建块,包括空语句、声明语句、语句块和表达式语句。空语句仅由分号组成,没有任何实际作用,但在某些场景下,如等待某个条件满足时,可能会用到。语句块是以花括号包围的一组语句,可以...
实验一主要目标是让学习者深入理解并熟练运用条件语句和循环语句,特别是针对Java编程语言中的if条件语句、switch条件语句、while循环语句以及for循环语句。这些是程序设计中最基础且重要的控制结构,用于根据特定...
1. **定义**:静态块由`static`关键字修饰,是一组在类中声明的语句,通常包含初始化操作。它的形式如下: ```java public class MyClass { static { // 静态块的代码 } } ``` 2. **执行时机**:静态块在类首次被...
### Java 零基础控制语句 - switch 语句 #### 概述 在 Java 编程语言中,控制语句对于实现逻辑判断至关...通过深入学习 `switch` 语句,开发者不仅能够写出更加清晰和高效的代码,还能够在复杂的逻辑判断中游刃有余。
学习和熟练运用`for`语句对于理解和编写任何C#程序都至关重要。通过不断的实践和尝试,你可以创建更复杂的循环结构,解决各种问题。在编程过程中,记住`for`语句的灵活性和强大性,它可以与其他控制结构(如`if`语句...
条件语句由if、else和goto组成,允许根据条件执行不同的代码块。switch语句则提供了一种多分支的选择结构,case和default是其组成部分。return语句用于从函数中返回一个值或结束函数执行。 存储类型关键字包括auto...
在C语言的学习和使用过程中,掌握其关键字、控制语句和运算符是基础且非常重要的内容。下面分别对这三个方面进行详细讲解。 首先,C语言的关键字共有32个,关键字是C语言中的保留字,它们有特殊的含义和用途。C语言...
代码块是包含语句的代码段,可以是实例初始化块、静态初始化块(也称为类初始化块)或同步块。实例初始化块在创建对象时执行,静态初始化块在类加载时执行,同步块用于线程安全的代码执行,防止并发问题。 这些...
在Java 5及以上版本中,你可以使用`static import`语句引入类的静态成员,这样在后续代码中可以直接使用它们,而无需通过类名来引用。例如,`import static java.lang.Math.PI;`后,你就可以直接写`PI`而不是`Math....
- **if**语句:是最基本的选择语句,它基于一个布尔表达式的结果来决定是否执行某个代码块。基本形式如下: ```java if (condition) { // 当条件为真时执行的代码 } else { // 当条件为假时执行的代码 } ``...
else语句块会在if的布尔表达式为false时执行。基本语法如下: ```java if (布尔表达式) { // 如果布尔表达式为 true,执行这里的代码 } else { // 如果布尔表达式为 false,执行这里的代码 } ``` 例如: ```...
### C语言的32个关键字和9种控制语句 #### 一、C语言的关键字分类及解析 C语言作为一门强大的编程语言,在其语法体系中...这些关键字和控制语句是构建C程序的基础,理解它们的功能和使用方法对于学习C语言至关重要。
- `if...elseif...else`语句:多个条件判断,根据条件选择执行不同代码块。 - `switch`语句:多分支选择,根据给定的值匹配对应的`case`,执行相应的代码块。 例如: ```php $a = 45; $b = 50; if ($a > $b) { ...
- `import static`语句可以导入一个类的所有静态成员,使得在当前类中可以直接使用这些静态成员,而无需指定类名。例如,`import static java.util.Arrays.*;`后,可以直接使用`sort()`等静态方法。 - 这有助于...
- 类初始化块(静态初始化块):`static { // 初始化代码 }`,在类的加载阶段执行,通常用于初始化静态变量。 3. **构造器(Constructor)**:虽然构造器不是传统的代码块,但它们在面向对象编程中与代码块密切...
if-else语句是if语句的扩展形式,用于判断布尔表达式的值,如果为true,则执行语句块1,否则执行语句块2。其基本语法结构为: ``` if(布尔表达式) { 语句块1 } else { 语句块2 } ``` 例如,如果变量a的值小于0,则...
- `default`:在`switch`语句中,用于指定所有条件都不满足时执行的代码块。 - `while`:用于实现循环,当条件为真时重复执行循环体。 - `do`:与`while`一起使用,先执行循环体后判断条件。 - `for`:用于实现循环...
在编程领域,`switch`语句是一种常用的控制流结构,用于执行不同的代码块,基于一个变量的不同值。在这个特定的场景中,我们讨论的是如何利用`switch`语句来判断公历中的每个月份有多少天。这通常是编程入门课程中...
6. **异常处理**:学习Java的异常处理机制,包括`try-catch-finally`语句块和`throws`关键字,这是编写健壮代码的重要部分。 7. **内部类和匿名类**:了解如何在类中定义内部类,以及如何使用匿名类简化代码,同时...