나는 항상 javastatic
와 final
키워드를 혼동 합니다.
그들은 어떻게 다릅니 까?
답변
정적 키워드는 4 가지 시나리오에서 사용될 수 있습니다.
- 정적 변수
- 정적 메소드
- 정적 코드 블록
- 정적 중첩 클래스
정적 변수와 정적 메소드를 먼저 살펴 보자.
정적 변수
- 클래스에 속하고 객체 (인스턴스)가 아닌 변수입니다.
- 정적 변수는 실행 시작시 한 번만 초기화됩니다. 이러한 변수는 인스턴스 변수를 초기화하기 전에 먼저 초기화됩니다.
- 클래스의 모든 인스턴스가 공유 할 단일 사본입니다.
- 정적 변수는 클래스 이름으로 직접 액세스 할 수 있으며 객체가 필요하지 않습니다.
- 통사론:
Class.variable
정적 방법
- 객체 (인스턴스)가 아닌 클래스에 속하는 메소드입니다.
- 정적 메소드는 정적 데이터에만 액세스 할 수 있습니다. 비 정적 데이터 (인스턴스 변수)는 클래스의 인스턴스를 가지고 있거나 작성하지 않는 한 액세스 할 수 없습니다.
- 정적 메서드는 다른 정적 메서드 만 호출 할 수 있으며 클래스의 인스턴스를 만들거나 만들지 않는 한 정적이 아닌 메서드를 호출 할 수 없습니다.
- 정적 메소드는 클래스 이름으로 직접 액세스 할 수 있으며 객체가 필요하지 않습니다.
- 통사론:
Class.methodName()
- 정적 방법을 참조 할 수 없습니다
this
또는super
어쨌든 키워드.
정적 클래스
Java에는 “정적 중첩 클래스”도 있습니다. 정적 중첩 클래스는 암시 적으로 외부 클래스의 인스턴스에 대한 참조가없는 클래스입니다.
정적 중첩 클래스는 인스턴스 메소드와 정적 메소드를 가질 수 있습니다.
Java에는 최상위 정적 클래스와 같은 것이 없습니다.
사이드 노트 :
주요 방법은
static
인스턴스화가 발생하기 전에 응용 프로그램을 실행하기 위해 액세스 할 수 있어야하기 때문입니다.
final
키워드는 여러 컨텍스트에서 사용되어 나중에 변경할 수없는 엔티티를 정의합니다.
-
final
클래스는 서브 클래스화할 수 없습니다. 이는 보안 및 효율성의 이유로 수행됩니다. 따라서 많은 Java 표준 라이브러리 클래스는final
예를 들어java.lang.System
및java.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.
}}
이 코드를 복사하여 에뮬레이터에 직접 붙여 넣을 수 있습니다.