정적 코드 블록, 정적 멤버 변수->비정적 코드 블록, 비정적 멤버 변수->새로운 다른 개체가 해당 개체 생성 방법을 호출합니다(로컬의 메서드 외부) 객체 생성자 포함) -> 새 로컬 객체가 생성자를 호출합니다.
【Note: 새 객체가 있는 경우 객체에 정적 코드 블록과 비정적 코드 블록이 있습니다. 객체가 새로 생성될 때마다 비정적 코드 블록이 한 번 실행되지만 정적 코드 블록은 한 번만 실행됩니다. 코드 블록은 한 번만 실행되고 새 개체는 다시 실행되지 않습니다. 】
부모 클래스 정적 코드 블록(정적 변수 > 정적 블록) > 하위 클래스 정적 코드 블록 > 상위 클래스 생성 코드 블록, 생성 메서드
class Demo{ static { //静态代码块...... } }
특징: 1. Java 정적 코드 블록의 코드는 클래스가 JVM을 로드할 때 실행되며 한 번만 실행됩니다. 2. 정적 블록은 종종 실행에 사용됩니다. 클래스 속성 및 일부 전역 초기화 작업 3. 정적 블록은 다양한 코드 블록 및 생성자보다 우선합니다. 클래스에 정적 코드 블록이 여러 개 있으면 작성 순서에 따라 순차적으로 실행됩니다. 메소드 본문을 제외한 클래스 내 어느 위치에나 정의됩니다. [여기서 메소드 본문은 임의의 메소드 본문입니다.] 5. 정적 코드 블록은 일반 변수에 접근할 수 없습니다
정적 코드 블록: static을 사용하세요 Java 키워드 선언 코드 블록에서. 정적 블록은 클래스를 초기화하고 클래스의 속성을 초기화하는 데 사용됩니다. 각 정적 코드 블록은 한 번만 실행됩니다.
JVM은 클래스를 로드할 때 정적 코드 블록을 실행하므로 정적 코드 블록은 기본 메서드보다 먼저 실행됩니다. 클래스에 여러 정적 코드 블록이 포함된 경우 먼저 정의된 코드가 먼저 실행되고 나중에 정의된 코드가 실행됩니다. [참고: 1 정적 코드 블록은 메소드 본문에 존재할 수 없습니다. 2 정적 코드 블록은 정적 인스턴스 변수 및 인스턴스 메서드에 직접 액세스할 수 없습니다. 클래스의 인스턴스 개체를 통해 액세스해야 합니다. ] 인스턴스 코드 블록 인스턴스 코드 블록은 구성 초기화 블록, 구성 코드 블록, 초기화 블록이라고도 합니다.
class Demo{ { //实例代码块...... } }
특징:
1. 생성 코드 블록은 객체를 생성할 때 호출되며, 객체가 생성될 때마다 한 번씩 호출됩니다.
2. 생성 코드 블록이 우선합니다. 생성자 함수 실행과 동시에 실행되는 구성 코드 블록은 생성자에 따라 다릅니다
3. 구성 코드 블록은 클래스에 정의됩니다
부분 코드 블록도 일반 코드 블록, 메소드 코드 블록
class Demo{ public void test(){ { //局部代码块...... } } }
특징: 1. 일반 코드 블록은 메소드 본문에 정의됩니다. 2. 일반 코드 블록과 인스턴스 코드 블록의 형식은 {}와 동일합니다. 3. 유일한 일반 코드 블록과 생성된 코드 블록의 눈에 띄는 차이점은 생성된 코드 블록이 클래스에 정의되어 있다는 것입니다. 4. 변수 수명 주기가 제한되고 조기에 릴리스될 수 있으며 개선될 수 있습니다. 각 코드 블록의 실행 순서를 확인합니다.
class Init { public Init() { System.out.println("无参构造器"); } public Init(int a) { System.out.println("有参构造器"); } { System.out.println("实例代码块1"); } { System.out.println("实例代码块2"); } { System.out.println("实例代码块3"); } static { System.out.println("静态初始化块1"); } static { System.out.println("静态初始化块2"); } public void method(){ { System.out.println("普通初始化块"); } } }
class Demo {
public static void main(String[] args) {
Init init1 = new Init();
init1.method();
System.out.println("------------");
Init init2 = new Init();
init2.method();
//多打印几个对象的目的是:方便看出Static静态代码块 是否只执行一次!!!
System.out.println("------------");
Init init3 = new Init();
init3.method();
}
}
결론:
실행 순서는 정적 코드 블록> 인스턴스 코드 블록> 생성자> 일반 코드 블록,그리고 정적 코드 블록은 클래스가 로드될 때 호출되며 클래스로 실행됩니다. 로드됨).
그럼 수업은 언제 로딩되나요?
- 객체 인스턴스 생성 시(신규) - 하위 클래스 객체 인스턴스 생성 시 상위 클래스도 로드됨
- 클래스의 정적 멤버 사용 시(정적 속성, 정적 메서드)존재 여부 확인 상속 관계의 각 코드 블록 실행 순서코드는 다음과 같습니다.,
예를 들어 상속 관계는
Three——> Two——> One
class One {
public One() {
System.out.println("One构造器");
}
{
System.out.println("One实例化块");
}
static {
System.out.println("One静态代码块");
}
}
class Two extends One {
public Two() {
System.out.println("Two构造器");
}
{
System.out.println("Two实例化块");
}
static {
System.out.println("Two静态代码块");
}
}
class Three extends Two {
public Three() {
System.out.println("Three构造器");
}
{
System.out.println("Three实例化块");
}
static {
System.out.println("Three静态代码块");
}
}
//测试代码 如下:
public class Demo {
public static void main(String[] args) {
Three three = new Three();
System.out.println("-----");
Three three1 = new Three(); //重复执行的目的是为了 验证static是否只执行一次
System.out.println("-----");
Two three2 = new Three(); //验证 多态的情况下 用后面的类进行初始化 结果和上面一样
}
}
실행 결과에 따르면 여러 클래스의 상속을 알 수 있습니다. 초기화 블록, 정적 초기화 블록 및 생성자가 있습니다. 실제 실행 순서는 상위 클래스 A의 정적 블록, 클래스의 정적 블록을 실행하는 것입니다. 상위 클래스 B, 마지막으로 하위 클래스의 정적 블록, 상위 클래스 A의 인스턴스 코드 블록 및 생성자를 실행한 다음, 클래스 B의 인스턴스 코드 블록 및 생성자, 마지막으로 하위 클래스의 인스턴스 코드 블록 및 생성자를 실행합니다. C [참고: 여기서 ABC는 One, Two, Three에 해당합니다]
결론:다중 클래스 상속에서 초기화 블록, 정적 초기화 블록 및 생성자의 실행 순서는 다음과 같습니다.
父类静态块——>子类静态块——>父类实例代码块——>父类构造器——>子类实例代码块——>子类构造器 ——>(如果有局部代码块, 再正常执行即可, 这里就没必要进行测试了) 我们那一段代码作为例子说明下,代码如下: 接下来让我们看看 , Init.java编译完的的字节码文件(Init.class) 从这个字节码文件就可以很清晰的看出, 实例代码块实际上是被依次放到了构造方法的第一句, 所以可以的出此结论: 实例代码块的执行顺序是优先于构造器的。 위 내용은 Java 객체 초기화 중에 코드 블록과 생성자가 호출되는 순서는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!通过字节码深究实例代码块优先于构造器原因
class Init {
public Init() {
System.out.println("无参构造器");
}
public Init(int a) {
System.out.println("有参构造器");
}
{
System.out.println("实例代码块1");
}
{
System.out.println("实例代码块2");
}
{
System.out.println("实例代码块3");
}
static {
System.out.println("静态初始化块1");
}
static {
System.out.println("静态初始化块2");
}
public void method(){
{
System.out.println("普通初始化块");
}
}
}