56

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

내가 그것을 이해함에 따라 :

  • 정적 클래스는 중첩 클래스에만 적용되며 중첩 클래스에 외부 클래스에 대한 참조가 없음을 의미합니다.

  • 정적 필드는 하나의 인스턴스 만 있고 동일한 클래스의 다른 멤버와 공유된다는 점에서 전역 변수와 비슷합니다.

  • 정적 메서드는 개체가 아직 인스턴스화되지 않은 경우에도 호출 할 수 있음을 의미합니다.

나는 Java 과정에 대한 소개를하고 있으며 다른 지식을 의미하는 데 다른 키워드가 사용되지 않은 이유를 파악하는 것뿐만 아니라 지식을 시멘트 화하려고합니다.


  • 어쨌든 OOP의 표준 명칭으로 static class / field / method라는 이름을 사용하지 마십시오. 예를 들어 파이썬에서는 자바의 정적 메소드를 클래스 메소드라고 부르며 다른 메소드 인 정적 메소드가 존재합니다. 대답에 의하면자바정적이란 무엇인가 의미합니다.수업과 관련된그 인스턴스에는 적용되지 않습니다. - Bakuriu
  • 소개하고 싶지 않습니다.너무 많아키워드를 언어로 개척자 (각 키워드는 컴파일러 실행 파일을 커지고 컴파일 속도를 느리게 함)의 문제를 제외하고 모든 키워드는 사용자에게 유용한 식별자를 의미하지 않습니다. (예를 들어, 도메인 특정 언어로 작업하고 있습니다.input예약어입니다.고통이다, 나는 너에게 말한다.) 그래서, 언제비슷한일이 성취되어야한다.다른키워드를 다시 사용하는 것은 유효한 옵션입니다. - DevSolar
  • 합리적인 관점에서, 그것들은 모두 똑같은 일을합니다 : 일을 맡아서 그 범위를 실례로 바꿉니다. C 및 C ++는static정말 과부하입니다. - Kevin
  • " 왜 다른 단어가 아닌지 " 이 질문이 언어 디자이너에 대해 묻지 않는다는 것을 명확히하기 위해 제목에서 질문하십시오. ' 의도를 묻지 만 실제로는 " 무엇을합니까?static의미, 정말로? " 나는 언어에 대한 좋은 이해를 보여주는 훌륭한 질문이라고 생각합니다. 대부분의 자바 프로그래머는 이것을 묻지 않을 것이며,static마법의 단어로. - Jeffrey Bosboom
  • @ user1803551 질문이 같을 수도 있지만이 질문에 대한 답변이 귀하의 링크에있는 답변보다 우수하다고 생각합니다. - stanek

6 답변


70

예제는 모두 정확하지만 모두 공통된 기능을 공유합니다. 정적 인 단어는엔 클로징 인스턴스필요가 없습니다.

  • 인스턴스를 포함하지 않고 정적 내부 클래스 만 존재할 수 있습니다. 예를 들어 클래스가있는 경우Foo및 비 정적 인 내부 클래스Bar다음 인스턴스를 만들 수 없습니다.Bar예를 들면Foo.

  • 정적 메소드는 메소드를 호출하기 위해 클래스의 인스턴스가 필요 없다는 것을 의미합니다. 전화해도됩니다String.format실제없이String예를 들어.

  • 정적 필드는 클래스의 인스턴스 없이도 존재합니다. 귀하의Foo수업에는counter정적 인 필드는 해당 인스턴스를 인스턴스화하지 않고도 액세스 할 수 있습니다.Foo수업.

인터페이스가 정적 클래스, 정적 필드 및 정적 메서드를 가질 수 있음을 명확히하는 지점으로 간주합니다. 그러나, 그것들은 비 정적 인 버전을 가질 수 없다 (개념에 ad-hoc의 일종 인 디폴트 메소드를 무시함). 이것은 인터페이스의 인스턴스를 결코 만들 수 없기 때문에 인클로저 인스턴스가 결코 존재할 수 없기 때문입니다.

이 경우 키워드가 완전히 중복 되어도 내부 인터페이스, 주석 및 enum을 정적으로 선언 할 수 있습니다 (예 : 인터페이스 메소드 추상화 선언과 유사). 인터페이스, 주석, 열거 형 (enum)은 둘러싸는 클래스와 관계가 없으므로 정적은 실제로 그것을 제거 할 수 없습니다.

최후의 비잔틴 포인트. 정적 가져 오기를 수행하는 경우 (import static pack.age.Foo.*정적 (static)으로 중복 표시되었는지 여부에 관계없이 인터페이스, 주석 및 열거 형을 포함하여 클래스의 정적 항목에 대한 규정되지 않은 참조를 작성할 수 있습니다.


  • s / 변수 / 클래스 / 세 번째 글 머리 점에? - immibis
  • @immibis 감사합니다. - Pace

19

정적은 문맥에 따라 다른 의미를 갖는 이유는 무엇입니까? 왜   다른 핵심 단어가 사용되지 않았습니까?

그것은 실제로 다른 의미를 가지고 있지 않습니다.

당신은static키워드는 다음 위치를 나타낼 수 있습니다.

"특정 인스턴스에 관계없이"

  • 정적 필드는 특정 인스턴스가 아닌 클래스에 속한 필드입니다.

  • 정적 메소드는 클래스에 정의되어 있으며 다음과 같은 개념이 없습니다.this. 이러한 메소드는 인스턴스가 전달 될 때를 제외하고는 특정 인스턴스의 인스턴스 필드에 액세스 할 수 없습니다.

  • 정적 멤버 클래스는 그 둘러싸는 클래스의 개념을 가지지 않는 중첩 클래스이며 그러한 인스턴스가 전달 된 경우가 아니면 (예를 들어 생성자에 대한 인수와 같은) 그 둘러싸는 클래스의 특정 인스턴스와 아무런 관계가 없습니다.


  • 답변의 일반적인 의미는 정확하지만 일부 특정 부분에 동의 할 수 없습니다. 이러한 방법은 인스턴스가 매개 변수로서 전달 될 때를 제외하고는 임의의 특정 인스턴스에서 인스턴스 필드에 액세스 할 수 없다. 아니요, 생성 된 인스턴스 (클래식 팩토리) 또는 정적 변수 (클래식 싱글 톤)에서 가져온 인스턴스에 액세스 할 수 있습니다. 다음 번 글 머리 기호와 동일한 내용 - " 그런 인스턴스가 매개 변수로 생성자에 전달되지 않은 경우 " - 네, 또는 다른 방법으로 setter 메소드, DI, 정적 필드 등 변수를 설정할 수 있습니다. - Ordous
  • " 아니요, 생성 된 인스턴스 (클래식 팩토리) 또는 정적 변수 " "에서 가져 오는 인스턴스에 액세스 할 수 있습니다... 같은 것을 말하는 다른 방법, 나는 말할 것이다. 생성 된 인스턴스는 정적 메서드와 기존 관계가있는 인스턴스가 아닙니다. 반박 정신에 어긋나는 것은 아니지만 게시 된 내용과 모순되지는 않습니다. - scottb
  • " 정적 필드 란Class오브젝트 " 아니요, Class 객체에 속하지 않습니다. 메서드와 동일합니다. - immibis
  • @immibis : 이해는 동의 할 수는 없지만, 그 이해는 구별을위한 유용한 개념 모델이라고 말할 수 있습니다. 오늘은 의미 적 정확성을위한 날이되어야합니다. 내가 수정 한 내용은 다음과 같습니다.Class객체 전체. - scottb

16

에서코어 자바Cay Horstmann 저 :

"정적"이라는 용어는 흥미로운 역사가 있습니다. 처음에는 정적 키워드가 C에서 도입되었습니다.   블록이 종료 될 때 사라지지 않는 지역 변수를 나타냅니다. 그 맥락에서, 용어   "static"은 의미가 있습니다 : 블록이 입력 될 때 변수는 계속 남아 있고 블록 안에 있습니다.   다시. 그런 다음 static은 C에서 두 번째 의미를 가지며 전역 변수와 함수를 나타냅니다.   다른 파일에서 액세스 할 수 없습니다. 키워드 static은 단순히 재사용되었습니다.   새로운 키워드를 소개합니다. 마지막으로, C ++은 키워드를 세 번째, 무관계,   해석 - 클래스에 속하지만 어떤 클래스에도 속하지 않는 변수와 함수를 나타냅니다.   클래스의 특정 객체. 이것은 키워드가 Java와 동일한 의미입니다.


  • 저는 인용문이 C와 C ++에 대해 말하는 "정적"개념에 동의하지 않습니다. 관련이없는 여러 해석이 있습니다. 이들 모두가 공통적으로 가지고있는 한 가지는 변수 또는 함수의 메모리 주소가 어떤 식 으로든 고정되어 있다는 것입니다. 나는 이것이 자바 의미와 잘 일치한다고 생각한다. - Thomas Padron-McCarthy
  • @ ThomasPadron-McCarthy : 그렇습니다. 그렇지만 C의 두 번째 의미는 전역 변수 나 함수의 주소가 정적 인 것과 관계없이 고정되어 있기 때문에 실제로는 아무 관련이 없습니다. - Sebastian Reichelt

9

자바는 C ++과 C를 상속받습니다.static추가로 두 가지 의미가 있습니다. 다음과 같이 정규화 된 로컬 변수 (함수 범위)static클래스의 정적 필드와 의미가 다소 비슷합니다. 그러나 Java는 "정적"이라는 컨텍스트를 지원하지 않습니다. 변수 또는 함수를 다음과 같이 정규화합니다.static파일 범위의 C 또는 C ++에서 "Ssh!는 링커에게 말하지 마십시오!"를 의미합니다. Java는이 평균값을 지원하지 않습니다.static, 어느 쪽이든.

영어에서는 문맥에 따라 같은 단어가 여러 의미를 가질 수 있습니다. 사전에 일반적으로 사용되는 단어를 찾아 보면 해당 단어에 대한 여러 정의가 있습니다. 어떤 단어는 여러 의미를 가질뿐만 아니라 여러 부분의 말을 사용합니다. 예를 들어, "카운터"는 상황에 따라 명사, 동사, 형용사 또는 부사가 될 수 있습니다. 문맥에 따라 다른 단어는 모순 된 의미를 가질 수 있습니다. "사과"는 "정말 미안해!"라는 뜻입니다. 또는 "나는 전혀 미안하지 않다!"를 의미 할 수 있습니다. 후자의 가장 좋은 예는 G.H. Hardy의 "수학자의 사과"입니다. 이 점에있어서 영어는 전혀 독특하지 않습니다. 인간이 서로 의사 소통하기 위해 사용하는 언어에도 똑같이 적용됩니다. 인간으로서, 우리는 문맥에 따라 다른 의미를 갖는 단어에 상당히 익숙합니다.

키워드가 너무 적고 컴퓨터 언어가 너무 많다는 것은 내재 된 갈등입니다. Lisp, forth, and smalltalk는 키워드가 거의없는 매우 아름다운 언어입니다. 그것들은 몇개의 특수 문자를 가지고있다. 예를 들어, 괄호를 열고 닫을 수있다. (완전 공개 : 저는이 세 가지 언어로 프로그래밍 했으므로 좋아했습니다.) 문제가 있습니다. 사실 6 개월 후 자신이 작성한 코드를 읽으면서 행운을 빈다. 그 코드를 다른 사람에게 넘겨주는 것조차도 행운입니다. 결과적으로 이들 언어에는 제한된 수의 지지자가 있습니다. 다른 언어들도 최상위로 올라가 엄청난 수의 단어를 "키워드"로 보유하고 있습니다. (완전한 공개 : 나는 그 언어로 프로그램을 강요 당했고, 나는 그것을 싫어했다.)

컴퓨터 언어에 너무 적거나 많은 키워드를 사용하면인지가 불일치하게됩니다. 동일한 키워드를 사용하는 것은 다른 상황에서 다른 상황을 가지지 않습니다. 왜냐하면 인간으로서 우리는 그 개념에 익숙하기 때문입니다.


6

자바 튜토리얼에서 말하기를

클래스 메소드 및 변수와 마찬가지로 정적 중첩 클래스는 다음과 같습니다.   외부 클래스와 연관되어 있습니다. 정적 클래스 메소드와 마찬가지로   정적 중첩 클래스는 인스턴스 변수를 직접 참조 할 수 없거나   클래스를 둘러싸는 것으로 정의 된 메소드 :   객체 참조

기본적으로 "정적"이란 클래스가 표시된 엔터티가 클래스의 인스턴스와 분리되었음을 의미합니다. 정적 메서드에는 연결된 인스턴스가 없습니다. 정적 필드는 모든 인스턴스간에 공유됩니다 (본질적으로 인스턴스가 아닌 클래스에 있음).

정적 중첩 클래스는 둘러싼 인스턴스와 분리됩니다. 여러분은 비 정적 메소드와 필드가있는 정적 중첩 클래스의 인스턴스를 가질 수 있기 때문에 다소 혼란 스럽다.

static이라는 단어를 "나는 엔티티, 필드, 메소드 또는 내부 클래스를 선언하고있다.엔 클로징 인스턴스"


6

언급 된 모든 정적 사용은 내가 보았을 때 공통점이 있습니다. 모든 경우에 클래스 / 필드 / 메소드가 정적이 아닌 경우보다 클래스 인스턴스에 덜 묶여 있음을 의미합니다. 물론 정적 필드와 정적 메서드 간의 동등성은 분명해야합니다. 즉, 다른 언어의 전역 개체와 비슷한 방식으로 해당 필드에서 작동하는 단일 클래스 (클래스 별 로더) 필드와 메서드를 선언하는 방법입니다.

아마도 중첩 된 클래스에 대한 정적 사용은 똑같은 정신으로 분명하지는 않지만, 다음과 같은 측면을 공유합니다.이 구조를 사용하려면 포함하는 클래스의 인스턴스가 필요하지 않습니다..

그래서 나는 이것들이 특히 일관성이없는 것으로 보지 않습니다.

일반적으로 프로그래밍 언어에서 키워드가 다른 목적으로 재사용되는 일반적인 질문에 대한 한 가지 대답은 언어가 발전함에 따라 기능이 도입되는 경우가 많지만 사용 된 기존 프로그램을 깨뜨리기 때문에 새로운 키워드를 추가하는 것은 어렵습니다. 그것은 식별자로. 예를 들어 Java는 실제로 키워드를 예약합니다.const언어로 사용되지 않더라도 향후 확장을 허용 할 수 있습니다.

새로운 키워드를 추가하기를 꺼리는 경우 종종 오래된 키워드가 오버로드됩니다.

연결된 질문


관련된 질문

최근 질문