programing

정적 초기화 코드 블록과 비정적 초기화 코드 블록의 차이점은 무엇입니까?

coolbiz 2022. 7. 2. 21:14
반응형

정적 초기화 코드 블록과 비정적 초기화 코드 블록의 차이점은 무엇입니까?

제 질문은 정적 키워드의에 대해 하나의 특정 용도는.질문은 정적 키워드의관한 것입니다 사용법에 특정.그것은사용할 수 있습니다 사용할 수 있다.static키워드 어떤 기능에 속하지 않는다는 클래스 안에 있는 코드 블록도 하지.어떤 함수에도 속하지 않는 클래스 내의 코드 블록을 커버하는 키워드입니다.예를 들어:코드 compiles에 따르는 것.예를 들어 다음과 같은 코드 컴파일이 있습니다.

public class Test {
    private static final int a;    
    static {
        a = 5;
        doSomething(a);
    }
    private static int doSomething(int x) {
        return (x+5);
    }
}

만약 당신이 를 삭제했을 경우를 제거해static때문에 가변 이 키워드가불만을제기하는 이유는 변수가가 불평하 Keyword.a있이final. 하지만수 있습니다 제거할 둘 다 단,둘 다를 제거하는 것이 가능하다.final ★★★★★★★★★★★★★★★★★」static키워드와 컴파일하게 한다.키워드를 지정하여 컴파일합니다.

양쪽 다 헷갈리네요.어떤 메서드에도 속하지 않는 코드 섹션은 어떻게 해야 합니까?어떻게 그것을 호출할 수 있을까요?일반적으로 이 사용의 목적은 무엇입니까?또는 이에 대한 문서를 어디서 찾을 수 있습니까?

스태틱 수식자가 있는 코드 블록은 클래스 이니셜라이저를 나타냅니다.스태틱 수식자가 없는 코드 블록은 인스턴스 이니셜라이저가 됩니다.

클래스 이니셜라이저는 클래스가 로드될 때 정의된 순서대로 실행됩니다(단순 변수 이니셜라이저와 마찬가지로 하향식). (실제로는 해결되지만 이는 기술성입니다.)

인스턴스 이니셜라이저는 클래스가 인스턴스화되었을 때 정의된 순서대로 슈퍼 컨스트럭터의 호출 직후에 컨스트럭터 코드가 실행된다.

만약 당신이를 삭제하면을 제거해static부터에서int a는 정적 이니셜 라이저 블록에서 이용할 수가 없다, 그것은 인스턴스 변수.스태틱 이니셜라이저 블록에서 접근할 수 없는 인스턴스 변수가 됩니다.'정적 컨텍스트에서 참조할 수 없음'입니다.

「」도 .static "Initializer"는 "Initializer가 됩니다.int a시공 시 초기화됩니다.

Uff! 정적 이니셜라이저가 뭐죠?

는 " " " 입니다.static {}Java 클래스 내의 코드 블록이며 생성자 또는 메인 메서드가 호출되기 전에 한 번만 실행됩니다.

알았어! 더 말해줘...

  • 입니다.static { ... }호출될 때 입니다.클래스가 호출될 때 가상 시스템에서 실행됩니다.
  • .return스테이트먼트가 지원됩니다.
  • 인수는 지원되지 않습니다.
  • .this ★★★★★★★★★★★★★★★★★」super지원되고 있습니다.

음, 어디에 쓸 수 있나요?

아무데서나 사용할 수 있습니다. :) 그렇게 심플합니다.하지만 데이터베이스 연결, API init, Logging 등을 할 때 주로 사용됩니다.

그냥 짖지 마! 예가 어디 있어?

package com.example.learnjava;

import java.util.ArrayList;

public class Fruit {

    static {
        System.out.println("Inside Static Initializer.");

        // fruits array
        ArrayList<String> fruits = new ArrayList<>();
        fruits.add("Apple");
        fruits.add("Orange");
        fruits.add("Pear");

        // print fruits
        for (String fruit : fruits) {
            System.out.println(fruit);
        }
        System.out.println("End Static Initializer.\n");
    }

    public static void main(String[] args) {
        System.out.println("Inside Main Method.");
    }
}

출력--

내부 스태틱 이니셜라이저

사과

오렌지

먹는 배

스태틱 이니셜라이저 종료

메인 메서드 내부.

이게 도움이 됐으면 좋겠네요!

static initializer입니다.block은 "static initializer"입니다.

클래스가 로드되면 자동으로 호출되며, 다른 호출 방법은 없습니다(Reflection을 통해서도 아님).

개인적으로 JNI 코드를 작성할 때만 사용해 왔습니다.

class JNIGlue {
    static {
        System.loadLibrary("foo");
    }
}

이것은 http://www.programcreek.com/2011/10/java-class-instance-initializers/ 에서 직접 보내드립니다.

(1) 집행명령

다음 수업을 보세요, 어떤 수업이 제일 먼저 실행되는지 아세요?

public class Foo {
 
    //instance variable initializer
    String s = "abc";
 
    //constructor
    public Foo() {
        System.out.println("constructor called");
    }
 
    //static initializer
    static {
        System.out.println("static initializer called");
    }
 
    //instance initializer
    {
        System.out.println("instance initializer called");
    }
 
    public static void main(String[] args) {
        new Foo();
        new Foo();
    }
}

출력:

스태틱 이니셜라이저 호출

instance initializer

컨스트럭터라고 하는 컨스트럭터

instance initializer

컨스트럭터라고 하는 컨스트럭터

2. Java 인스턴스 이니셜라이저는 어떻게 작동합니까?

위의 인스턴스 이니셜라이저에는 println 문이 포함되어 있습니다.동작하는지 위해서 예를 '.b = 0을 사용하다

대신

int b = 0 쓰면

int b;
b = 0;

따라서 인스턴스 이니셜라이저와 인스턴스 변수 이니셜라이저는 거의 동일합니다.

3. 인스턴스 이니셜라이저는 언제 도움이 됩니까?

인스턴스 이니셜라이저를 사용하는 경우는 드물지만 다음과 같은 경우 인스턴스 변수 이니셜라이저를 대체할 수 있습니다.

  1. 이니셜라이저 코드는 예외를 처리해야 합니다.
  2. 인스턴스 변수 이니셜라이저로 표현할 수 없는 계산을 수행합니다.

물론 이러한 코드는 컨스트럭터에 작성될 수 있습니다.그러나 클래스에 여러 개의 생성자가 있는 경우 각 생성자에서 코드를 반복해야 합니다.

인스턴스 이니셜라이저를 사용하면 코드를 한 번만 쓸 수 있으며 오브젝트를 작성하기 위해 어떤 컨스트럭터를 사용하든 상관없이 코드가 실행됩니다.(개념일 뿐 잘 쓰이지 않는 것 같습니다.)

인스턴스 이니셜라이저가 유용한 또 다른 예로는 익명 내부 클래스가 있습니다. 이 클래스는 생성자를 전혀 선언할 수 없습니다. (로그 함수를 배치하는 데 적합한 위치입니까?)

Derhein 덕분이야.

또한 인터페이스 [1]를 구현하는 익명 클래스에는 생성자가 없습니다.따라서 인스턴스 이니셜라이저는 구축 시 모든 종류의 식을 실행하기 위해 필요합니다.

"final"은 변수가 오브젝트 이니셜라이저 코드 종료 전에 초기화되어야 함을 보증합니다.마찬가지로 "static final"은 변수가 클래스 초기화 코드가 끝날 때까지 초기화됨을 보증합니다.초기화 코드에서 "static"을 생략하면 개체 초기화 코드로 전환되므로 변수가 더 이상 보증을 충족하지 않습니다.

프로그램의 어느 곳에서나 호출할 필요가 있는 스태틱블록에는 코드를 쓸 수 없습니다.코드의 목적을 호출하려면 메서드에 코드를 배치해야 합니다.

클래스가 로드될 때 정적 이니셜라이저 블록을 작성하여 정적 변수를 초기화할 수 있지만 이 코드는 더 복잡할 수 있습니다.

스태틱 이니셜라이저 블록은 이름, 인수 및 반환 유형이 없는 메서드와 같습니다.당신이 절대 부르지 않으니 이름은 필요 없어요.가상 시스템이 클래스를 로드하는 경우에만 호출됩니다.

개발자가 이니셜라이저 블록을 사용하면 Java 컴파일러는 이니셜라이저를 현재 클래스의 각 컨스트럭터에 복사합니다.

예제:

다음 코드:

class MyClass {

    private int myField = 3;
    {
        myField = myField + 2;
        //myField is worth 5 for all instance
    }

    public MyClass() {
        myField = myField * 4;
        //myField is worth 20 for all instance initialized with this construtor
    }

    public MyClass(int _myParam) {
        if (_myParam > 0) {
            myField = myField * 4;
            //myField is worth 20 for all instance initialized with this construtor
            //if _myParam is greater than 0
        } else {
            myField = myField + 5;
            //myField is worth 10 for all instance initialized with this construtor
            //if _myParam is lower than 0 or if _myParam is worth 0
        }
    }

    public void setMyField(int _myField) {
        myField = _myField;
    }


    public int getMyField() {
        return myField;
    }
}

public class MainClass{

    public static void main(String[] args) {
        MyClass myFirstInstance_ = new MyClass();
        System.out.println(myFirstInstance_.getMyField());//20
        MyClass mySecondInstance_ = new MyClass(1);
        System.out.println(mySecondInstance_.getMyField());//20
        MyClass myThirdInstance_ = new MyClass(-1);
        System.out.println(myThirdInstance_.getMyField());//10
    }
}

는 다음과 같습니다.

class MyClass {

    private int myField = 3;

    public MyClass() {
        myField = myField + 2;
        myField = myField * 4;
        //myField is worth 20 for all instance initialized with this construtor
    }

    public MyClass(int _myParam) {
        myField = myField + 2;
        if (_myParam > 0) {
            myField = myField * 4;
            //myField is worth 20 for all instance initialized with this construtor
            //if _myParam is greater than 0
        } else {
            myField = myField + 5;
            //myField is worth 10 for all instance initialized with this construtor
            //if _myParam is lower than 0 or if _myParam is worth 0
        }
    }

    public void setMyField(int _myField) {
        myField = _myField;
    }


    public int getMyField() {
        return myField;
    }
}

public class MainClass{

    public static void main(String[] args) {
        MyClass myFirstInstance_ = new MyClass();
        System.out.println(myFirstInstance_.getMyField());//20
        MyClass mySecondInstance_ = new MyClass(1);
        System.out.println(mySecondInstance_.getMyField());//20
        MyClass myThirdInstance_ = new MyClass(-1);
        System.out.println(myThirdInstance_.getMyField());//10
    }
}

개발자들이 제 사례를 이해해주길 바랍니다.

정적 코드 블록을 사용하여 클래스 변수를 인스턴스화 또는 초기화할 수 있습니다(개체 변수와 반대).따라서 "a" static을 선언하는 것은 모든 테스트 객체에 의해 공유되는1개뿐임을 의미하며, 스태틱코드 블록은 작성된 테스트 객체의 수에 관계없이 테스트 클래스가 처음 로드될 때 단 한 번만 "a"를 초기화합니다.

언급URL : https://stackoverflow.com/questions/335311/what-is-the-difference-between-a-static-and-a-non-static-initialization-code-blo

반응형