[java] 정적과 최종의 차이점은 무엇입니까?

나는 항상 javastaticfinal키워드를 혼동 합니다.

그들은 어떻게 다릅니 까?



답변

정적 키워드는 4 가지 시나리오에서 사용될 수 있습니다.

  • 정적 변수
  • 정적 메소드
  • 정적 코드 블록
  • 정적 중첩 클래스

정적 변수와 정적 메소드를 먼저 살펴 보자.

정적 변수

  • 클래스에 속하고 객체 (인스턴스)가 아닌 변수입니다.
  • 정적 변수는 실행 시작시 한 번만 초기화됩니다. 이러한 변수는 인스턴스 변수를 초기화하기 전에 먼저 초기화됩니다.
  • 클래스의 모든 인스턴스가 공유 할 단일 사본입니다.
  • 정적 변수는 클래스 이름으로 직접 액세스 할 수 있으며 객체가 필요하지 않습니다.
  • 통사론: Class.variable

정적 방법

  • 객체 (인스턴스)가 아닌 클래스에 속하는 메소드입니다.
  • 정적 메소드는 정적 데이터에만 액세스 할 수 있습니다. 비 정적 데이터 (인스턴스 변수)는 클래스의 인스턴스를 가지고 있거나 작성하지 않는 한 액세스 할 수 없습니다.
  • 정적 메서드는 다른 정적 메서드 만 호출 할 수 있으며 클래스의 인스턴스를 만들거나 만들지 않는 한 정적이 아닌 메서드를 호출 할 수 없습니다.
  • 정적 메소드는 클래스 이름으로 직접 액세스 할 수 있으며 객체가 필요하지 않습니다.
  • 통사론: Class.methodName()
  • 정적 방법을 참조 할 수 없습니다 this또는 super어쨌든 키워드.

정적 클래스

Java에는 “정적 중첩 클래스”도 있습니다. 정적 중첩 클래스는 암시 적으로 외부 클래스의 인스턴스에 대한 참조가없는 클래스입니다.

정적 중첩 클래스는 인스턴스 메소드와 정적 메소드를 가질 수 있습니다.

Java에는 최상위 정적 클래스와 같은 것이 없습니다.

사이드 노트 :

주요 방법은 static인스턴스화가 발생하기 전에 응용 프로그램을 실행하기 위해 액세스 할 수 있어야하기 때문입니다.

final 키워드는 여러 컨텍스트에서 사용되어 나중에 변경할 수없는 엔티티를 정의합니다.

  • final클래스는 서브 클래스화할 수 없습니다. 이는 보안 및 효율성의 이유로 수행됩니다. 따라서 많은 Java 표준 라이브러리 클래스는 final예를 들어 java.lang.Systemjava.lang.String입니다. final클래스의 모든 메소드 는 암시 적으로 final있습니다.

  • final방법은 서브 클래스에 의해 오버라이드 (override) 할 수 없습니다. 서브 클래스에서 예기치 않은 동작이 클래스의 기능이나 일관성에 중요한 메소드를 변경하는 것을 방지하는 데 사용됩니다.

  • final변수 만 초기화 또는 할당 문을 통해 중, 한 번 초기화 할 수 있습니다. 선언 시점에서 초기화 할 필요는 없습니다. 이것을 blank final변수 라고 합니다. 클래스의 빈 최종 인스턴스 변수는 클래스가 선언 된 클래스의 모든 생성자 끝에 반드시 할당되어야합니다. 마찬가지로 빈 최종 정적 변수는 선언 된 클래스의 정적 초기화 프로그램에 반드시 지정되어야합니다. 그렇지 않으면 두 경우 모두 컴파일 타임 오류가 발생합니다.

참고 : 변수가 참조 인 경우 다른 개체를 참조하기 위해 변수를 리 바인드 할 수 없습니다. 그러나 원래 변경 가능한 경우 참조하는 객체는 여전히 변경 가능합니다.

익명의 내부 클래스가 메소드 본문 내에 정의되면 final해당 메소드의 범위에서 선언 된 모든 변수는 내부 클래스 내에서 액세스 할 수 있습니다. 일단 지정되면 최종 변수의 값을 변경할 수 없습니다.


답변

static 은 인스턴스가 아닌 클래스에 속한다는 것을 의미합니다. 즉, 특정 Class 의 모든 인스턴스간에 공유되는 해당 변수 / 메소드의 사본이 하나만 있음을 의미합니다 .

public class MyClass {
    public static int myVariable = 0;
}

//Now in some other code creating two instances of MyClass
//and altering the variable will affect all instances

MyClass instance1 = new MyClass();
MyClass instance2 = new MyClass();

MyClass.myVariable = 5;  //This change is reflected in both instances

final 은 전적으로 관련이 없으며 한 번만 초기화를 정의하는 방법입니다. 변수를 정의 할 때 또는 생성자 내에서 다른 곳에서 초기화 할 수 있습니다.

note 최종 메서드 및 최종 클래스에 대한 참고로, 메서드 또는 클래스를 각각 재정의 / 확장 할 수 없음을 명시 적으로 나타내는 방법입니다.

추가 읽기
정적 주제에 대해서는 정적 블록에서 사용되는 다른 용도에 대해 이야기했습니다. 정적 변수를 사용할 때 클래스를 사용하기 전에 이러한 변수를 설정해야하는 경우도 있지만 불행히도 생성자를 얻지 못합니다. 정적 키워드가 나오는 곳입니다.

public class MyClass {

    public static List<String> cars = new ArrayList<String>();

    static {
        cars.add("Ferrari");
        cars.add("Scoda");
    }

}

public class TestClass {

    public static void main(String args[]) {
        System.out.println(MyClass.cars.get(0));  //This will print Ferrari
    }
}

인스턴스 생성자 전에 호출되는 인스턴스 초기화 블록과 혼동해서는 안됩니다 .


답변

이 둘은 실제로 비슷하지 않습니다. static필드는 클래스의 특정 인스턴스에 속하지 않는 필드입니다 .

class C {
    public static int n = 42;
}

여기서 static필드 n는 특정 인스턴스와는 관련이 없으며 C전체 클래스와 일반적으로 연결 되므로 필드 C.n에 액세스 할 수 있습니다. 여전히 인스턴스를 사용 C하여 액세스 할 수 n있습니까? 예-그러나 특히 좋은 방법은 아닙니다.

final 반면에 특정 변수가 초기화 된 후에는 변경할 수 없음을 나타냅니다.

class C {
    public final int n = 42;
}

여기, n이 때문에 다시 할당 할 수 없습니다 final. 또 다른 차이점은 변수를 선언 할 수 있지만 final모든 변수를 정적으로 선언 할 수는 없다는 것입니다.

또한 final확장 할 수 없음을 나타내는 클래스를 선언 할 수 있습니다 .

final class C {}

class B extends C {}  // error!

마찬가지로, 메소드는 final로 선언 되어 확장 클래스에 의해 재정의 될 수 없음을 나타냅니다 .

class C {
    public final void foo() {}
}

class B extends C {
    public void foo() {}  // error!
}


답변

최종-

1) 변수에final “키워드를 적용하면 해당 변수의 값이 일정하게 유지됩니다. (또는) 변수final 로 선언하면 해당 변수의 값을 변경할 수 없습니다.

2) 프로그램 수명 기간 동안 변수 값이 변하지 않을 때 유용 합니다

정적-

1) ” static “키워드를 변수에 적용 하면 클래스에 속한다는 의미입니다.
2) 메소드에static “키워드를 적용 하면 클래스의 인스턴스를 만들지 않고 메소드에 액세스 할 수 있음을 의미합니다.


답변

static 클래스의 모든 인스턴스가 공유하는 메모리에 변수 사본이 하나만 있음을 의미합니다.

final키워드는 값이 변경 될 수 없음을 의미합니다. 이 없으면 final모든 객체가 변수 값을 변경할 수 있습니다.


답변

정적 및 최종에는 몇 가지 큰 차이점이 있습니다.

정적 변수 또는 클래스는 항상 어디서나 사용할 수 있습니다. Final은 키워드 일 뿐이므로 변수를 변경할 수 없습니다. 그렇다면 :

public class Test{
   public final int first = 10;
   public static int second = 20;

   public Test(){
     second = second + 1
     first = first + 1;
   }
}

“첫 번째”정수를 변경하려고 할 때까지 프로그램이 실행되어 오류가 발생합니다. 이 클래스 외부에서 클래스를 인스턴스화 한 경우 “첫 번째”변수에만 액세스 할 수 있습니다. 이것은 항상 사용할 수있는 “초”와 대조적입니다.


답변

스피커와 같은 물체를 생각하십시오. Speaker가 클래스 인 경우 볼륨, 고음, 저음, 색상 등과 같은 변수가 달라집니다. Speaker 클래스를 정의하는 동안이 필드를 모두 정의하십시오. 예를 들어 정적 수정자를 사용하여 색상 필드를 선언했습니다. 즉, 클래스를 인스턴스화 한 횟수에 관계없이 컴파일러에이 변수의 사본이 정확히 하나만 존재 함을 알려줍니다.

선언

static final String color = "Black"; 

이 클래스가 인스턴스화 될 때마다 색상 필드의 값이 변경되지 않는 한 “검정색”이되도록합니다.

public class Speaker {

static String color = "Black";

}

public class Sample {

public static void main(String args[]) {
    System.out.println(Speaker.color); //will provide output as "Black"
            Speaker.color = "white";
    System.out.println(Speaker.color);  //will provide output as "White"
}}

참고 : 이제 최종 키워드로 필드의 값이 변경되지 않도록하기 때문에 최종 코드로 스피커의 색상을 변경하면이 코드가 실행되지 않습니다.

public class Speaker {

static final String color = "Black";

}

public class Sample {

public static void main(String args[]) {
    System.out.println(Speaker.color); //should provide output as "Black"
            Speaker.color = "white"; //Error because the value of color is fixed.  
    System.out.println(Speaker.color); //Code won't execute.
}}

이 코드를 복사하여 에뮬레이터에 직접 붙여 넣을 수 있습니다.