이 질문에는 이미 답변이 있습니다.
나는 Wikipedia에 대해 여러 가지 정의를 들었다. 그러나 Java의 초보자로서 나는 그것이 무엇을 의미하는지 아직 확신하지 못한다. 자바와 바보에 능통 한 사람?
static은 클래스 레벨에서 사용할 수있는 변수 또는 메소드를 의미합니다. 즉, 액세스 할 클래스의 인스턴스를 만들 필요가 없습니다.
public class Foo {
public static void doStuff(){
// does stuff
}
}
따라서 Foo의 인스턴스를 만든 다음doStuff
이렇게 :
Foo f = new Foo();
f.doStuff();
방금 클래스에 대해 메소드를 호출하면됩니다.
Foo.doStuff();
public static
엄격하게 인스턴스간에 공유되는 것이 아니라 모두를위한 자유 다. - polygenelubricants
매우 평신도 용어에서 클래스는 곰팡이이며 개체는 그 곰팡이로 만든 복사본입니다. 정적은 금형에 속하며 복사하지 않고 직접 액세스 할 수 있으므로 위의 예를 참조하십시오.
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;
}
}
정적 속성의 또 다른 좋은 예작업을 적용 할 때 작업이 사용됩니다.하나씩 일어나는 것디자인 패턴. 간단히 말해서, Singleton 디자인 패턴은 특정 클래스의 하나의 객체 만 시스템의 수명 동안 구성되도록 보장합니다. 하나의 객체 만 구성되도록하기 위해 Singleton 패턴의 일반적인 구현은 단일 허용 객체 인스턴스에 대한 내부 정적 참조를 유지하고 해당 인스턴스에 대한 액세스는static
조작
@inkedmn이 지적한 것 외에도 정적 멤버는 클래스 수준에 있습니다. 따라서 해당 멤버는 해당 클래스에 대해 한 번 JVM에 의해 메모리에로드됩니다 (클래스가로드 될 때). 즉,엔에로드 된 정적 멤버의 인스턴스엔클래스가 속한 클래스의 인스턴스.
위의 내용은 정확하며 Static 키워드에 대한 몇 가지 중요한 사항을 추가하고 싶습니다.
정적 키워드를 사용할 때 내부적으로 어떤 일이 일어나는지는 내부적으로 저장됩니다.영구 메모리(즉,힙 메모리), 우리는 두 종류의 메모리가 있다는 것을 알고 있습니다.스택 메모리(임시 메모리) 및힙 메모리(영원한 기억), 그래서 당신이 정체되는 키워드를 사용하지 않는 경우에 안으로 인 임시 기억 장치에서 저장하십시오스택 메모리(또는 전화로 부를 수 있습니다.휘발성 메모리).
그래서이 권리의 사용은 무엇인지 의심 스러울 것입니다. ???
예: 정적 int = 10; (1 프로그램)
방금 정적 키워드를 사용한다면변수또는을 위해방법그것은에 저장됩니다영구 메모리권리.
그래서 나는 키워드와 같은 변수를 선언했다.공전다른 가치를 가진 다른 프로그램에서.
예: 정적 int = 20; (2 프로그램)
변수 'a'는 힙 메모리에 저장됩니다.프로그램 1같은 정적 변수 'a'가프로그램 2그 당시에는힙 메모리에서 변수를 다시 생성하는 대신 10에서 20의 값을 대체합니다..
일반적으로다시 한번'a'를 정적 변수로 선언하지 않으면 스택 메모리 (임시 메모리)에서 'a'변수를 사용하십시오.
전반적으로 정적 키워드를 사용하면
1. 우리는 기억을 저장할 수있다.
2. 우리는 중복을 피할 수있다.
클래스 이름의 도움으로 정적 변수에 액세스하기 위해 개체를 순서대로 생성 할 필요가 없습니다. 액세스 할 수 있습니다.