생성자가 최종적이 될 수없는 이유
생성자가 Java에서 최종, 정적 또는 추상이 될 수없는 이유는 무엇입니까?
예를 들어, 유효하지 않은 이유를 설명해 주시겠습니까?
public class K {
abstract public K() {
// ...
}
}
final
의미 하는대로 메서드를 설정하면 "어떤 클래스도이를 재정의하고 싶지 않습니다." 그러나 Java 언어 사양에 따르면 :
JLS 8.8- "생성자 선언은 멤버가 아닙니다. 상속되지 않았거나 재정의 할 수 없습니다."
abstract
의미 하는대로 메서드를 설정하면 "이 메서드에는 본문이 없으며 자식 클래스 에서 구현해야합니다 ." 생성자는 그러나 new
키워드가 사용될 때 암시 적으로 호출 되므로 본문이 부족할 수 없습니다.
static
의미 하는대로 메소드 를 설정하면 "이 메소드는 특정 개체가 아닌 클래스에 속합니다." 그러나 생성자는 호출을 초기화하기 위해 생성 묵시로부터 호출이 생성되지 않습니다.
질문은 신고자가되기를 원하는 이유 static or abstract or final
입니다.
용도는 생성되지 않습니다.
생성자는 클래스의 인스턴스가 생성 될 때 자동으로 호출 종료 클래스의 인스턴스 필드에 액세스 할 수 있습니다. 정적 생성자의 사용은 무엇입니까?
생성자는 재정의 할 수있는 추상 생성자로 무엇을 할 수 있는지.
자바는 생성자 암시 적으로 최종적이고, 그 의미의 정적 / 정적 측면은 non- 암시 적 1 이며, 자바가 추상적 인 생성자 [해석] 의미 가 없습니다 .
이는 final
및 static
수정자가 중복되고 abstract
키워드가 전혀 의미가 없음을 의미합니다.
당연히 Java 디자이너는 생성자에 대한 이중 및 / 또는 무의미한 액세스 수정 해독 허용하지 문법에서 허용하지 않습니다.
곁에 : 방법에 대해 설명하는 방법 public
및 abstract
수정되는 인터페이스 방법에 부끄러운 일입니다. 아마도 이것에 대한 (고대) 아마도 이유가있을 것입니다. 그러나 어느 쪽이든 기존의 수백만 개의 Java 프로그램을 배포 할 수 없던 것은 고칠 수 없습니다.
1- 실제로 생성 정적 및 비 정적 의미가 혼합되어 있습니다. 인스턴스에서 생성 될 "호출"할 수 있습니다. 작동하는 방식과 유사합니다. 반면에 생성자의 본문은 this
인스턴스 메서드처럼을 참조하고 인스턴스 메서드를 호출 할 수 있습니다 . 그리고 생성자에게 고유 한 생성자 체인이 있습니다. 그러나 진짜 요점은 의미가 고정되어 있고, 아마도 혼란스러운 static
수정 이 허용되는 요점이 있습니다.
public
constructor : 어디서나 객체를 생성 할 수 있습니다.기본 생성자 :에서만 생성 될 수 있습니다.
protected
건설자 : 클래스는 하위 클래스 인 경우에만 패키지 외부의 클래스에서 생성 할 수 있습니다.private
건설자 : 클래스 내에서만 생성 될 수 있습니다 (예 : 싱글 톤 구현시).
static
, final
및 abstract
키워드는 생성자 때문에
static
멤버는 클래스에 속하지만 생성자는 객체를 생성하는 데 필요합니다.abstract
클래스는 클래스에서 구현 될 수있는 추상 메소드를 포함하는 부분적으로 구현 클래스입니다.final
수정을 제한합니다 : 변수는 상수가되고, 메서드는 재정의 될 수 있으며, 상속 될 수 없습니다.
결정적인 : 모든 것이 생성 될 수 있기 때문입니다. 클래스를 확장 생성하거나 (최종으로 만드는 것을 방지하기 위해) 메소드를 쓸 수 있습니다.
정적 : 실행을 보면 정적이 아닙니다 (인스턴스 필드에 액세스 할 수 있음), 호출자 측을 보면 (일종) 정적입니다 (인스턴스없이 호출합니다. 생성하기 상상하기 어렵습니다. 완전히 정하고 정적이지 않고 두 가지 론적으로 분리하지 않고 의미가 없습니다.
요약 : 초록은 쓰기 쓰기 / 확장이있는 경우에만 의미가 있으므로 '최종'과 동일한 주장이 적용됩니다.
생성자는 최종적으로 선언 될 수 없습니다. 컴파일러는 항상 "최종 수정자가 허용되지 않음"유형의 오류를 제공합니다. Final은 메소드에 발생하는 하위 클래스에서 메소드를 재정의 할 수 없음을 의미합니다. 생성자는 일반적인 방법이 아닙니다. (다른 규칙이 적용됨) 최종적으로 선언되는 데 의미가 없습니다.
- 생성자는 일반적인 방법이 아닙니다. (다른 규칙이 적용됨)
- 또한 생성되지 않습니다. 최종적으로 선언되는 데 의미가 없습니다. 생성자는 절대 최종적으로 선언 될 수 없습니다. Y 우리 컴파일러는 항상 "modifer final not allowed"를 제공합니다.
- JLS 섹션 8.8.3을 확인하십시오 (JLS 및 API 문서는 기본 정보 소스 중 일부 택합니다).
JLS 섹션 8은 이것을 언급합니다.
생성자 (§8.8)는 메소드와 유사 하지만 메소드 호출로 직접 호출 할 수 없습니다. 새 클래스 인스턴스를 초기화하는 데 사용됩니다. 방법과 많은 오버로드가 가능합니다 (§8.8.8).
그러나 일반 방법이 아닙니다. 그들은 그렇게 그렇게 수 없습니다.
최종적인 이유는 위의 답변에서 잘 정의되어 있습니다.
Abstract : "Abstract"는 구현되지 않음을 의미합니다. 상속을 통해서만 구현할 수 있습니다. 따라서 일부 클래스를 확장하면 "Constructor"를 제외한 모든 부모 클래스 멤버가 하위 클래스 (자식 클래스)에 상속됩니다. 그래서, 생성자가 자식 클래스에서 상속을 얻지 못할 때 어떻게 생성자를 "Abstract"로 선언 할 수 있는가?
그것이 생성자가 abstract 일 수없는 이유입니다.
첫 번째 최종 공개 K () {
* 수정 자 final 위에는 제한이 있습니다. 왜냐하면 그것이 최종적인 경우 다른 클래스 또는 동일한 클래스에서만 우리가 재정 의하여 여기서 거의 최종적이지 않은 상황이 발생하지 않는 상황이기 때문입니다.
we want public void(int i,String name){
//this code not allowed
클래스 수준에 대해 모두 static ,, static itz를 사용하지만 'new'키워드를 사용하여 객체 기반 생성자를 만듭니다. 그래서 ,,,,,, thatsall
추상적 인 방법이나 선언 된 방법이 없기 때문에 여기에 대한 최악의 추상 itz
참고 URL : https://stackoverflow.com/questions/9477476/why-constructors-cannot-be-final
'ProgramingTip' 카테고리의 다른 글
Java에서 디렉토리 컨텐츠를 삭제하는 방법은 무엇입니까? (0) | 2020.10.15 |
---|---|
프레임 워크를 사용할 수 없음 GoogleToolboxForMac (0) | 2020.10.15 |
bash 히스토리를 사용하여 이전 명령을 가져오고 복사 한 다음 '실행'하지만 명령이 주석 처리됨 (0) | 2020.10.15 |
rails- 콘솔 출력을 파일로 리디렉션 (0) | 2020.10.15 |
파일을 업로드하기 전에 파일 확인 확인 (0) | 2020.10.15 |