답변:
정적 변수와 정적 메소드를 먼저 살펴 보자.
Class.variableClass.methodName() this또는 super어쨌든 키워드.Java에는 "정적 중첩 클래스"도 있습니다. 정적 중첩 클래스는 암시 적으로 외부 클래스의 인스턴스에 대한 참조가없는 클래스입니다.
정적 중첩 클래스는 인스턴스 메소드와 정적 메소드를 가질 수 있습니다.
Java에는 최상위 정적 클래스와 같은 것이 없습니다.
주요 방법은
static인스턴스화가 발생하기 전에 응용 프로그램을 실행하기 위해 액세스 할 수 있어야하기 때문입니다.
final 키워드는 여러 컨텍스트에서 사용되어 나중에 변경할 수없는 엔티티를 정의합니다.final클래스는 서브 클래스화할 수 없습니다. 이는 보안 및 효율성의 이유로 수행됩니다. 따라서 많은 Java 표준 라이브러리 클래스는 final예를 들어 java.lang.System및 java.lang.String입니다. final클래스의 모든 메소드 는 암시 적으로 final있습니다.
final방법은 서브 클래스에 의해 오버라이드 (override) 할 수 없습니다. 서브 클래스에서 예기치 않은 동작이 클래스의 기능이나 일관성에 중요한 메소드를 변경하는 것을 방지하는 데 사용됩니다.
final변수 만 초기화 또는 할당 문을 통해 중, 한 번 초기화 할 수 있습니다. 선언 시점에서 초기화 할 필요는 없습니다. 이것을 blank final변수 라고 합니다. 클래스의 빈 최종 인스턴스 변수는 클래스가 선언 된 클래스의 모든 생성자 끝에 반드시 할당되어야합니다. 마찬가지로 빈 최종 정적 변수는 선언 된 클래스의 정적 초기화 프로그램에 반드시 지정되어야합니다. 그렇지 않으면 두 경우 모두 컴파일 타임 오류가 발생합니다.
익명의 내부 클래스가 메소드 본문 내에 정의되면 final해당 메소드의 범위에서 선언 된 모든 변수는 내부 클래스 내에서 액세스 할 수 있습니다. 일단 지정되면 최종 변수의 값을 변경할 수 없습니다.
Class.methodName()
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
}
}
인스턴스 당 생성자 전에 호출되는 인스턴스 초기화 블록과 혼동해서는 안됩니다 .
final is entirely unrelated, it is a way of defining a once only initialization. You can either initialize when defining the variable or within the constructor, nowhere else.
이 둘은 실제로 비슷하지 않습니다. 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!
}
public파일을 정의하는 잠재적 클래스) 또는 static내부 클래스 만 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.
}}
이 코드를 복사하여 에뮬레이터에 직접 붙여 넣을 수 있습니다.
쉬운 차이,
Final : 변수의 값이 Final이며 어디에서나 변경되지 않음을 의미합니다. final x = 5라고 말하면 x를 변경할 수 없다는 것을 의미합니다.
공전: 객체가 하나만 있음을 의미합니다. 메모리에 x = 5가 있고 x = 5가 있고 클래스 안에 존재한다고 가정 해 봅시다. 클래스의 객체 또는 인스턴스를 만드는 경우 해당 클래스와 해당 변수 및 메서드를 나타내는 특정 상자가 있음을 의미합니다. 그리고 당신이 그 클래스의 다른 객체 나 인스턴스를 생성한다면 그것은 같은 클래스의 두 개의 박스가 메모리 안에 다른 x를 가지고 있다는 것을 의미합니다. 다른 위치에서 x를 모두 호출하고 값을 변경하면 값이 달라집니다. 상자 1에는 x = 5 인 x가 있고 상자 2에는 x = 6이 있습니다. 그러나 x를 정적으로 만들면 다시 만들 수 없습니다. 클래스의 객체를 만들 수는 있지만 그 객체에는 다른 x가 없습니다. x가 정적이면 상자 1과 상자 2는 모두 같은 x를 가지며 값은 5입니다. 예, static 값을 최종이 아닌 곳에서 변경할 수 있습니다. 따라서 상자 1에 x가 있고 그 값을 x = 5로 변경하면 box2라는 다른 상자를 만들고 box2 x의 값을 x = 6으로 변경합니다. X가 정적이므로 두 상자의 x가 같습니다. box2가 5에서 6의 값을 겹쳐 쓰기 때문에 두 상자 모두 box의 값을 6으로 지정합니다.
final과 static은 완전히 다릅니다. 최종 최종은 변경할 수 없습니다. 정적으로 유지되지만 변경 될 수 있습니다.
"이것은 예입니다. 정적 변수는 항상 클래스 이름으로 호출됩니다. 그것들은 해당 클래스의 모든 객체에 대해 하나이기 때문에 항상 클래스 이름에 의해 호출됩니다. 따라서 클래스 A는 x = 5이므로 Ax = 6으로 호출하고 변경할 수 있습니다. "
정적은 클래스의 모든 객체가 호출 할 수 있으며 본질적으로 객체 유형에 속합니다.
변수는 전체 클래스의 최종 변수가 될 수 있으며 더 이상 변수를 변경할 수 없음을 의미합니다. 한 번만 설정할 수 있으며 다시 설정하면 오류가 발생합니다. 변경 불가능한 상수를 선언하려는 여러 가지 이유로 유용합니다.
예제 코드 :
class someClass
{
public static int count=0;
public final String mName;
someClass(String name)
{
mname=name;
count=count+1;
}
public static void main(String args[])
{
someClass obj1=new someClass("obj1");
System.out.println("count="+count+" name="+obj1.mName);
someClass obj2=new someClass("obj2");
System.out.println("count="+count+" name="+obj2.mName);
}
}
Wikipedia에는 전체 Java 키워드 목록이 포함되어 있습니다 .
나는 여기에 완전한 대답을하려고하지 않을 것이다. 저의 추천은 그들 각자가하는 일을 이해하는 데 초점을두고 그 효과가 완전히 다르며 왜 함께 사용되는지를 분명히 알 수 있어야합니다.
static은 클래스 멤버 (속성 및 메서드)를위한 것이며 인스턴스가 아닌 정적 멤버와 달리 이해되어야합니다. Java Tutorials의 "인스턴스 및 클래스 멤버 이해"를 읽는 것이 좋습니다 . 나는 또한 static블록 으로 사용될 수 있지만 시작을 위해 그것에 대해 걱정하지 않을 것입니다.
final변수, 메소드, 클래스 또는 다른 경우에 적용되는지에 따라 다른 의미를 갖습니다. 여기 Wikipedia 설명이 더 좋습니다.
변수의 사본 하나가 애플리케이션을 통과하지만 정적 변수 값은 변경 될 수 있지만 최종 변수 값은 한 번 초기화 될 수 있으며 애플리케이션 전체에서 변경할 수 없습니다.