이 질문에는 이미 답변이 있습니다.
내가 그것을 이해함에 따라 :
정적 클래스는 중첩 클래스에만 적용되며 중첩 클래스에 외부 클래스에 대한 참조가 없음을 의미합니다.
정적 필드는 하나의 인스턴스 만 있고 동일한 클래스의 다른 멤버와 공유된다는 점에서 전역 변수와 비슷합니다.
정적 메서드는 개체가 아직 인스턴스화되지 않은 경우에도 호출 할 수 있음을 의미합니다.
나는 Java 과정에 대한 소개를하고 있으며 다른 지식을 의미하는 데 다른 키워드가 사용되지 않은 이유를 파악하는 것뿐만 아니라 지식을 시멘트 화하려고합니다.
예제는 모두 정확하지만 모두 공통된 기능을 공유합니다. 정적 인 단어는엔 클로징 인스턴스필요가 없습니다.
인스턴스를 포함하지 않고 정적 내부 클래스 만 존재할 수 있습니다. 예를 들어 클래스가있는 경우Foo
및 비 정적 인 내부 클래스Bar
다음 인스턴스를 만들 수 없습니다.Bar
예를 들면Foo
.
정적 메소드는 메소드를 호출하기 위해 클래스의 인스턴스가 필요 없다는 것을 의미합니다. 전화해도됩니다String.format
실제없이String
예를 들어.
정적 필드는 클래스의 인스턴스 없이도 존재합니다. 귀하의Foo
수업에는counter
정적 인 필드는 해당 인스턴스를 인스턴스화하지 않고도 액세스 할 수 있습니다.Foo
수업.
인터페이스가 정적 클래스, 정적 필드 및 정적 메서드를 가질 수 있음을 명확히하는 지점으로 간주합니다. 그러나, 그것들은 비 정적 인 버전을 가질 수 없다 (개념에 ad-hoc의 일종 인 디폴트 메소드를 무시함). 이것은 인터페이스의 인스턴스를 결코 만들 수 없기 때문에 인클로저 인스턴스가 결코 존재할 수 없기 때문입니다.
이 경우 키워드가 완전히 중복 되어도 내부 인터페이스, 주석 및 enum을 정적으로 선언 할 수 있습니다 (예 : 인터페이스 메소드 추상화 선언과 유사). 인터페이스, 주석, 열거 형 (enum)은 둘러싸는 클래스와 관계가 없으므로 정적은 실제로 그것을 제거 할 수 없습니다.
최후의 비잔틴 포인트. 정적 가져 오기를 수행하는 경우 (import static pack.age.Foo.*
정적 (static)으로 중복 표시되었는지 여부에 관계없이 인터페이스, 주석 및 열거 형을 포함하여 클래스의 정적 항목에 대한 규정되지 않은 참조를 작성할 수 있습니다.
정적은 문맥에 따라 다른 의미를 갖는 이유는 무엇입니까? 왜 다른 핵심 단어가 사용되지 않았습니까?
그것은 실제로 다른 의미를 가지고 있지 않습니다.
당신은static
키워드는 다음 위치를 나타낼 수 있습니다.
"특정 인스턴스에 관계없이"
정적 필드는 특정 인스턴스가 아닌 클래스에 속한 필드입니다.
정적 메소드는 클래스에 정의되어 있으며 다음과 같은 개념이 없습니다.this
. 이러한 메소드는 인스턴스가 전달 될 때를 제외하고는 특정 인스턴스의 인스턴스 필드에 액세스 할 수 없습니다.
정적 멤버 클래스는 그 둘러싸는 클래스의 개념을 가지지 않는 중첩 클래스이며 그러한 인스턴스가 전달 된 경우가 아니면 (예를 들어 생성자에 대한 인수와 같은) 그 둘러싸는 클래스의 특정 인스턴스와 아무런 관계가 없습니다.
Class
오브젝트 " 아니요, Class 객체에 속하지 않습니다. 메서드와 동일합니다. - immibisClass
객체 전체. - scottb
에서코어 자바Cay Horstmann 저 :
"정적"이라는 용어는 흥미로운 역사가 있습니다. 처음에는 정적 키워드가 C에서 도입되었습니다. 블록이 종료 될 때 사라지지 않는 지역 변수를 나타냅니다. 그 맥락에서, 용어 "static"은 의미가 있습니다 : 블록이 입력 될 때 변수는 계속 남아 있고 블록 안에 있습니다. 다시. 그런 다음 static은 C에서 두 번째 의미를 가지며 전역 변수와 함수를 나타냅니다. 다른 파일에서 액세스 할 수 없습니다. 키워드 static은 단순히 재사용되었습니다. 새로운 키워드를 소개합니다. 마지막으로, C ++은 키워드를 세 번째, 무관계, 해석 - 클래스에 속하지만 어떤 클래스에도 속하지 않는 변수와 함수를 나타냅니다. 클래스의 특정 객체. 이것은 키워드가 Java와 동일한 의미입니다.
자바는 C ++과 C를 상속받습니다.static
추가로 두 가지 의미가 있습니다. 다음과 같이 정규화 된 로컬 변수 (함수 범위)static
클래스의 정적 필드와 의미가 다소 비슷합니다. 그러나 Java는 "정적"이라는 컨텍스트를 지원하지 않습니다. 변수 또는 함수를 다음과 같이 정규화합니다.static
파일 범위의 C 또는 C ++에서 "Ssh!는 링커에게 말하지 마십시오!"를 의미합니다. Java는이 평균값을 지원하지 않습니다.static
, 어느 쪽이든.
영어에서는 문맥에 따라 같은 단어가 여러 의미를 가질 수 있습니다. 사전에 일반적으로 사용되는 단어를 찾아 보면 해당 단어에 대한 여러 정의가 있습니다. 어떤 단어는 여러 의미를 가질뿐만 아니라 여러 부분의 말을 사용합니다. 예를 들어, "카운터"는 상황에 따라 명사, 동사, 형용사 또는 부사가 될 수 있습니다. 문맥에 따라 다른 단어는 모순 된 의미를 가질 수 있습니다. "사과"는 "정말 미안해!"라는 뜻입니다. 또는 "나는 전혀 미안하지 않다!"를 의미 할 수 있습니다. 후자의 가장 좋은 예는 G.H. Hardy의 "수학자의 사과"입니다. 이 점에있어서 영어는 전혀 독특하지 않습니다. 인간이 서로 의사 소통하기 위해 사용하는 언어에도 똑같이 적용됩니다. 인간으로서, 우리는 문맥에 따라 다른 의미를 갖는 단어에 상당히 익숙합니다.
키워드가 너무 적고 컴퓨터 언어가 너무 많다는 것은 내재 된 갈등입니다. Lisp, forth, and smalltalk는 키워드가 거의없는 매우 아름다운 언어입니다. 그것들은 몇개의 특수 문자를 가지고있다. 예를 들어, 괄호를 열고 닫을 수있다. (완전 공개 : 저는이 세 가지 언어로 프로그래밍 했으므로 좋아했습니다.) 문제가 있습니다. 사실 6 개월 후 자신이 작성한 코드를 읽으면서 행운을 빈다. 그 코드를 다른 사람에게 넘겨주는 것조차도 행운입니다. 결과적으로 이들 언어에는 제한된 수의 지지자가 있습니다. 다른 언어들도 최상위로 올라가 엄청난 수의 단어를 "키워드"로 보유하고 있습니다. (완전한 공개 : 나는 그 언어로 프로그램을 강요 당했고, 나는 그것을 싫어했다.)
컴퓨터 언어에 너무 적거나 많은 키워드를 사용하면인지가 불일치하게됩니다. 동일한 키워드를 사용하는 것은 다른 상황에서 다른 상황을 가지지 않습니다. 왜냐하면 인간으로서 우리는 그 개념에 익숙하기 때문입니다.
클래스 메소드 및 변수와 마찬가지로 정적 중첩 클래스는 다음과 같습니다. 외부 클래스와 연관되어 있습니다. 정적 클래스 메소드와 마찬가지로 정적 중첩 클래스는 인스턴스 변수를 직접 참조 할 수 없거나 클래스를 둘러싸는 것으로 정의 된 메소드 : 객체 참조
기본적으로 "정적"이란 클래스가 표시된 엔터티가 클래스의 인스턴스와 분리되었음을 의미합니다. 정적 메서드에는 연결된 인스턴스가 없습니다. 정적 필드는 모든 인스턴스간에 공유됩니다 (본질적으로 인스턴스가 아닌 클래스에 있음).
정적 중첩 클래스는 둘러싼 인스턴스와 분리됩니다. 여러분은 비 정적 메소드와 필드가있는 정적 중첩 클래스의 인스턴스를 가질 수 있기 때문에 다소 혼란 스럽다.
static이라는 단어를 "나는 엔티티, 필드, 메소드 또는 내부 클래스를 선언하고있다.엔 클로징 인스턴스"
언급 된 모든 정적 사용은 내가 보았을 때 공통점이 있습니다. 모든 경우에 클래스 / 필드 / 메소드가 정적이 아닌 경우보다 클래스 인스턴스에 덜 묶여 있음을 의미합니다. 물론 정적 필드와 정적 메서드 간의 동등성은 분명해야합니다. 즉, 다른 언어의 전역 개체와 비슷한 방식으로 해당 필드에서 작동하는 단일 클래스 (클래스 별 로더) 필드와 메서드를 선언하는 방법입니다.
아마도 중첩 된 클래스에 대한 정적 사용은 똑같은 정신으로 분명하지는 않지만, 다음과 같은 측면을 공유합니다.이 구조를 사용하려면 포함하는 클래스의 인스턴스가 필요하지 않습니다..
그래서 나는 이것들이 특히 일관성이없는 것으로 보지 않습니다.
일반적으로 프로그래밍 언어에서 키워드가 다른 목적으로 재사용되는 일반적인 질문에 대한 한 가지 대답은 언어가 발전함에 따라 기능이 도입되는 경우가 많지만 사용 된 기존 프로그램을 깨뜨리기 때문에 새로운 키워드를 추가하는 것은 어렵습니다. 그것은 식별자로. 예를 들어 Java는 실제로 키워드를 예약합니다.const
언어로 사용되지 않더라도 향후 확장을 허용 할 수 있습니다.
새로운 키워드를 추가하기를 꺼리는 경우 종종 오래된 키워드가 오버로드됩니다.
input
예약어입니다.그고통이다, 나는 너에게 말한다.) 그래서, 언제비슷한일이 성취되어야한다.다른키워드를 다시 사용하는 것은 유효한 옵션입니다. - DevSolarstatic
정말 과부하입니다. - Kevinstatic
의미, 정말로? " 나는 언어에 대한 좋은 이해를 보여주는 훌륭한 질문이라고 생각합니다. 대부분의 자바 프로그래머는 이것을 묻지 않을 것이며,static
마법의 단어로. - Jeffrey Bosboom