>Java >java지도 시간 >Java 객체 초기화 중에 코드 블록과 생성자가 호출되는 순서는 무엇입니까?

Java 객체 초기화 중에 코드 블록과 생성자가 호출되는 순서는 무엇입니까?

王林
王林앞으로
2023-05-10 09:52:081117검색

    코드 로딩 우선순위

    정적 코드 블록, 정적 멤버 변수->비정적 코드 블록, 비정적 멤버 변수->새로운 다른 개체가 해당 개체 생성 방법을 호출합니다(로컬의 메서드 외부) 객체 생성자 포함) -> 새 로컬 객체가 생성자를 호출합니다.

    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();
        }
    }

    실행 결과는 다음과 같습니다.

    결론:

    Java 객체 초기화 중에 코드 블록과 생성자가 호출되는 순서는 무엇입니까?

    실행 순서는 정적 코드 블록> 인스턴스 코드 블록> 생성자> 일반 코드 블록,

    그리고 정적 코드 블록은 클래스가 로드될 때 호출되며 클래스로 실행됩니다. 로드됨).

    그럼 수업은 언제 로딩되나요?

    - 객체 인스턴스 생성 시(신규) - 하위 클래스 객체 인스턴스 생성 시 상위 클래스도 로드됨

    - 클래스의 정적 멤버 사용 시(정적 속성, 정적 메서드)

    존재 여부 확인 상속 관계의 각 코드 블록 실행 순서


    예를 들어 상속 관계는
    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에 해당합니다]

    Java 객체 초기화 중에 코드 블록과 생성자가 호출되는 순서는 무엇입니까?

    결론:

    다중 클래스 상속에서 초기화 블록, 정적 초기화 블록 및 생성자의 실행 순서는 다음과 같습니다.

    父类静态块——>子类静态块——>父类实例代码块——>父类构造器——>子类实例代码块——>子类构造器 ——>(如果有局部代码块, 再正常执行即可, 这里就没必要进行测试了)

    通过字节码深究实例代码块优先于构造器原因

    我们那一段代码作为例子说明下,代码如下:

    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("普通初始化块");
            }
        }
    }

    接下来让我们看看 , Init.java编译完的的字节码文件(Init.class)

    Java 객체 초기화 중에 코드 블록과 생성자가 호출되는 순서는 무엇입니까?

    从这个字节码文件就可以很清晰的看出, 实例代码块实际上是被依次放到了构造方法的第一句, 所以可以的出此结论: 实例代码块的执行顺序是优先于构造器的。

    위 내용은 Java 객체 초기화 중에 코드 블록과 생성자가 호출되는 순서는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제