87

이 질문에는 이미 답변이 있습니다.

나는 Wikipedia에 대해 여러 가지 정의를 들었다. 그러나 Java의 초보자로서 나는 그것이 무엇을 의미하는지 아직 확신하지 못한다. 자바와 바보에 능통 한 사람?


  • 어떤 정적? 통계가 많이 있습니다 (예 : 비 한정적인 목록).mindprod.com/jgloss/static.html). - kennytm
  • @Philip Strong : static은 Java idiosynchrasy이며 배심원은 여전히 static ' 객체 지향 언어로 그 자리를 차지하고있다.) - SyntaxT3rr0r

6 답변


225

static은 클래스 레벨에서 사용할 수있는 변수 또는 메소드를 의미합니다. 즉, 액세스 할 클래스의 인스턴스를 만들 필요가 없습니다.

public class Foo {
    public static void doStuff(){
        // does stuff
    }
}

따라서 Foo의 인스턴스를 만든 다음doStuff이렇게 :

Foo f = new Foo();
f.doStuff();

방금 클래스에 대해 메소드를 호출하면됩니다.

Foo.doStuff();


  • 그건 의미가 있습니다! 감사. - Philip Strong
  • 정적 필드는 클래스의 모든 인스턴스에서 공유되므로 모두 동일한 값을 볼 수 있습니다. - Péter Török
  • @Peter : "모든 인스턴스에서 공유"하지 않습니다. 클래스에 속하기 때문에 그 중 하나 일뿐입니다. 어떤 것public static엄격하게 인스턴스간에 공유되는 것이 아니라 모두를위한 자유 다. - polygenelubricants
  • @inkedmn 정말 고마워. - theJollySin
  • 정적 메소드는 개념적으로 Python 및 C ++과 같은 언어에서 소위 자유 함수와 유사합니다. 함수 이름의 범위가 클래스 이름 안에 있다고합니다. - seand

36

매우 평신도 용어에서 클래스는 곰팡이이며 개체는 그 곰팡이로 만든 복사본입니다. 정적은 금형에 속하며 복사하지 않고 직접 액세스 할 수 있으므로 위의 예를 참조하십시오.


12

static 키워드는 Java에서 여러 가지 다른 방법으로 사용될 수 있으며 거의 모든 경우에 수정중인 항목을 나타내는 수정 자입니다.둘러싸는 객체 인스턴스없이 사용할 수 있습니다..

Java는 객체 지향 언어이며 기본적으로 작성하는 대부분의 코드에는 사용할 객체의 인스턴스가 필요합니다.

public class SomeObject {
    public int someField;
    public void someMethod() { };
    public Class SomeInnerClass { };
}

someField, someMethod 또는 SomeInnerClass를 사용하려면SomeObject의 인스턴스를 먼저 만들어야합니다..

public class SomeOtherObject {
    public void doSomeStuff() {
        SomeObject anInstance = new SomeObject();
        anInstance.someField = 7;
        anInstance.someMethod();
        //Non-static inner classes are usually not created outside of the
        //class instance so you don't normally see this syntax
        SomeInnerClass blah = anInstance.new SomeInnerClass();
    }
}

내가 정적 인 것을 선언하면엔 클로징 인스턴스가 필요 없다..

public class SomeObjectWithStaticStuff {
    public static int someField;
    public static void someMethod() { };
    public static Class SomeInnerClass { };
}

public class SomeOtherObject {
    public void doSomeStuff() {
        SomeObjectWithStaticStuff.someField = 7;
        SomeObjectWithStaticStuff.someMethod();
        SomeObjectWithStaticStuff.SomeInnerClass blah = new SomeObjectWithStaticStuff.SomeInnerClass();
        //Or you can also do this if your imports are correct
        SomeInnerClass blah2 = new SomeInnerClass();
    }
}

정적 인 것을 선언하는 것은 몇 가지 함의를 가진다.

먼저,전체 응용 프로그램 전체에 정적 필드의 값 하나만 존재할 수 있습니다..

public class SomeOtherObject {
    public void doSomeStuff() {
        //Two objects, two different values
        SomeObject instanceOne = new SomeObject();
        SomeObject instanceTwo = new SomeObject();
        instanceOne.someField = 7;
        instanceTwo.someField = 10;
        //Static object, only ever one value
        SomeObjectWithStaticStuff.someField = 7;
        SomeObjectWithStaticStuff.someField = 10; //Redefines the above set
    }
}

두 번째 문제는정적 메서드 및 내부 클래스는 둘러싸는 객체의 필드에 액세스 할 수 없습니다.(아무도 없기 때문에).

public class SomeObjectWithStaticStuff {
    private int nonStaticField;
    private void nonStaticMethod() { };

    public static void someStaticMethod() {
        nonStaticField = 7; //Not allowed
        this.nonStaticField = 7; //Not allowed, can never use *this* in static
        nonStaticMethod(); //Not allowed
        super.someSuperMethod(); //Not allowed, can never use *super* in static
    }

    public static class SomeStaticInnerClass {

        public void doStuff() {
            someStaticField = 7; //Not allowed
            nonStaticMethod(); //Not allowed
            someStaticMethod(); //This is ok
        }

    }
}

static 키워드는 내부 인터페이스, 주석 및 enum에도 적용 할 수 있습니다.

public class SomeObject {
    public static interface SomeInterface { };
    public static @interface SomeAnnotation { };
    public static enum SomeEnum { };
}

이 모든 경우 키워드는 중복되어 효과가 없습니다. 인터페이스, 주석 및 열거 형은 내부 클래스와 절대 관계가 없으므로 기본적으로 정적입니다.

이것은 키워드가하는 일을 설명합니다. 키워드 사용이 나쁜 아이디어인지 여부는 설명하지 않습니다. 그 내용은 다음과 같은 다른 질문에서보다 자세히 다루어 질 수 있습니다.정적 메서드를 많이 사용하는 것이 나쁜 것입니까?

키워드 static의 사용 빈도가 다소 적습니다. 고정 수입품을 사용하면 정적 유형 (인터페이스, 주석 및 정적으로 중복 표시되지 않은 enum 포함)을 사용할 수 있습니다.

//SomeStaticThing.java
public class SomeStaticThing {
    public static int StaticCounterOne = 0;
}

//SomeOtherStaticThing.java
public class SomeOtherStaticThing {
    public static int StaticCounterTwo = 0;
}

//SomeOtherClass.java
import static some.package.SomeStaticThing.*;
import some.package.SomeOtherStaticThing.*;

public class SomeOtherClass {
    public void doStuff() {
        StaticCounterOne++; //Ok
        StaticCounterTwo++; //Not ok
        SomeOtherStaticThing.StaticCounterTwo++; //Ok
    }
}

마지막으로 클래스가 처음로드 될 때 실행되는 코드 블록 인 정적 이니셜 라이저가 있습니다 (보통클래스가 응용 프로그램에서 처음으로 인스턴스화되기 직전) 및 (정적 메서드와 마찬가지로) 비 정적 필드 나 메서드에 액세스 할 수 없습니다.

public class SomeObject {

    private static int x;

    static {
        x = 7;
    }
}


  • 당신은 정말로 더 많은 표를 얻는 자격이 있습니다. 대답은 처음부터 끝까지 온 포인트입니다. - s.dragos

6

정적 속성의 또 다른 좋은 예작업을 적용 할 때 작업이 사용됩니다.하나씩 일어나는 것디자인 패턴. 간단히 말해서, Singleton 디자인 패턴은 특정 클래스의 하나의 객체 만 시스템의 수명 동안 구성되도록 보장합니다. 하나의 객체 만 구성되도록하기 위해 Singleton 패턴의 일반적인 구현은 단일 허용 객체 인스턴스에 대한 내부 정적 참조를 유지하고 해당 인스턴스에 대한 액세스는static조작


3

@inkedmn이 지적한 것 외에도 정적 멤버는 클래스 수준에 있습니다. 따라서 해당 멤버는 해당 클래스에 대해 한 번 JVM에 의해 메모리에로드됩니다 (클래스가로드 될 때). 즉,에로드 된 정적 멤버의 인스턴스클래스가 속한 클래스의 인스턴스.


-4

위의 내용은 정확하며 Static 키워드에 대한 몇 가지 중요한 사항을 추가하고 싶습니다.

정적 키워드를 사용할 때 내부적으로 어떤 일이 일어나는지는 내부적으로 저장됩니다.영구 메모리(즉,힙 메모리), 우리는 두 종류의 메모리가 있다는 것을 알고 있습니다.스택 메모리(임시 메모리) 및힙 메모리(영원한 기억), 그래서 당신이 정체되는 키워드를 사용하지 않는 경우에 안으로 인 임시 기억 장치에서 저장하십시오스택 메모리(또는 전화로 부를 수 있습니다.휘발성 메모리).

그래서이 권리의 사용은 무엇인지 의심 스러울 것입니다. ???

: 정적 int = 10; (1 프로그램)

방금 정적 키워드를 사용한다면변수또는을 위해방법그것은에 저장됩니다영구 메모리권리.

그래서 나는 키워드와 같은 변수를 선언했다.공전다른 가치를 가진 다른 프로그램에서.

: 정적 int = 20; (2 프로그램)

변수 'a'는 힙 메모리에 저장됩니다.프로그램 1같은 정적 변수 'a'가프로그램 2그 당시에는힙 메모리에서 변수를 다시 생성하는 대신 10에서 20의 값을 대체합니다..

일반적으로다시 한번'a'를 정적 변수로 선언하지 않으면 스택 메모리 (임시 메모리)에서 'a'변수를 사용하십시오.

전반적으로 정적 키워드를 사용하면

  1. 우리는 기억을 저장할 수있다.

  2. 우리는 중복을 피할 수있다.

  클래스 이름의 도움으로 정적 변수에 액세스하기 위해 개체를 순서대로 생성 할 필요가 없습니다. 액세스 할 수 있습니다.


  • -1, 질문은 초급 용어로 뭔가를 찾고있었습니다. 영구, 임시 및 휘발성에 대한이 이야기는 초보자가 실제로 이해하지 못하며 어쨌든 사실 사실이 아닙니다. - Martin
  • 그들은 큰 단어 보스가 아니다. 그들은 내가 왜 그들을 언급했는지 실제 차이점을 알아야한다는 것을 이해할 수있다. - sushanth
  • 그들은 큰 단어가 아니지만 당신이 주장하는 것은 자바에서는 완전히 거짓이며 어쨌든이 질문과 관련이 없습니다. - Martin

연결된 질문


관련된 질문

최근 질문