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


174

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

그들은 어떻게 다릅니 까?

답변:


238

정적 키워드는 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해당 메소드의 범위에서 선언 된 모든 변수는 내부 클래스 내에서 액세스 할 수 있습니다. 일단 지정되면 최종 변수의 값을 변경할 수 없습니다.


5
(나는 당신을 공감하지 않았다) 몇 가지 추가 설명 : "정적 메소드는 정적 데이터에만 액세스 할 수 있습니다. 정적이 아닌 데이터 (인스턴스 변수)에는 액세스 할 수 없습니다."-클래스의 인스턴스를 가지고 있거나 만들지 않는 한. "정적 메소드는 다른 정적 메소드 만 호출 할 수 있으며 비 정적 메소드는 호출 할 수 없습니다." -클래스의 인스턴스를 가지고 있거나 생성하지 않는 한.
xagyg 1

1
정적 메소드에서 구문 설명을 잘못 언급했습니다. 그것은 수Class.methodName()
Mdhar9e

정적 클래스도 가질 수 있습니다. 답을 수정하십시오. 감사합니다 :)
Madhusudan

Java 8부터 익명 클래스 (및 람다)는 최종 변수에 효과적으로 액세스하고 최종 키워드를 제한하지 않습니다.
akhil_mittal

38

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.
따르면

2
상황이 간단하고 명확해야합니다. 받아 들여진 대답은 .... 장황하다.

22

이 둘은 실제로 비슷하지 않습니다. 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!
}

입력 주셔서 감사합니다. 코드는 오류를 제공합니다. class C {public static int n = 42; }이 필드는 정적이 아닌 유형으로 static을 선언 할 수 없습니다. 왜 Cn을 선언하거나 할 수 없습니까?
TechnoCorner

@TechnoCorner는 최상위 클래스 ( public파일을 정의하는 잠재적 클래스) 또는 static내부 클래스 만 static변수 를 정의 할 수 있습니다 . 다른 내부 클래스는 외부 클래스의 인스턴스이며 정적 변수를 가질 수 없습니다.
zapl

17

최종-

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

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

정적-

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


12

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

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


3

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

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

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

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

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


3

스피커와 같은 물체를 생각하십시오. 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.
}}

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


2

쉬운 차이,

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으로 호출하고 변경할 수 있습니다. "


1

정적은 클래스의 모든 객체가 호출 할 수 있으며 본질적으로 객체 유형에 속합니다.

변수는 전체 클래스의 최종 변수가 될 수 있으며 더 이상 변수를 변경할 수 없음을 의미합니다. 한 번만 설정할 수 있으며 다시 설정하면 오류가 발생합니다. 변경 불가능한 상수를 선언하려는 여러 가지 이유로 유용합니다.

예제 코드 :

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 키워드 목록이 포함되어 있습니다 .


특정 물체에 대해 무엇을 의미합니까? 설명해 주시겠습니까?
TechnoCorner

0

나는 여기에 완전한 대답을하려고하지 않을 것이다. 저의 추천은 그들 각자가하는 일을 이해하는 데 초점을두고 그 효과가 완전히 다르며 왜 함께 사용되는지를 분명히 알 수 있어야합니다.

static은 클래스 멤버 (속성 및 메서드)를위한 것이며 인스턴스가 아닌 정적 멤버와 달리 이해되어야합니다. Java Tutorials의 "인스턴스 및 클래스 멤버 이해"를 읽는 것이 좋습니다 . 나는 또한 static블록 으로 사용될 수 있지만 시작을 위해 그것에 대해 걱정하지 않을 것입니다.

final변수, 메소드, 클래스 또는 다른 경우에 적용되는지에 따라 다른 의미를 갖습니다. 여기 Wikipedia 설명이 더 좋습니다.


-1

변수의 사본 하나가 애플리케이션을 통과하지만 정적 변수 값은 변경 될 수 있지만 최종 변수 값은 한 번 초기화 될 수 있으며 애플리케이션 전체에서 변경할 수 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.