인터페이스의 모든 필드가 암묵적으로 스태틱하고 최종적인 이유는 무엇입니까?
로 정의되어 있는 가 암묵적으로 「」라고 하는 있을 입니다.static
★★★★★★★★★★★★★★★★★」final
을 유지한다는 ······························.static
수 , 그 가 왜 「」, 「이유」인지, 「이유」라고 하는 은 이해할 수 있습니다.final
(?)
내의 나 알고 .static
★★★★★★★★★★★★★★★★★」final
인터페이스는, 실장의 상세가 아니고, 인터랙션 계약을 지정하는 것을 목적으로 하고 있습니다.개발자는 인터페이스를 보는 것만으로 실장을 사용할 수 있어야 하며, 실장 클래스 내부를 볼 필요가 없습니다.
컨스트럭터를 지정할 수 없기 때문에 인터페이스에서는 인스턴스를 만들 수 없습니다.따라서 instance state를 가질 수 없습니다.단, 인터페이스 필드에서는 암묵적으로 스태틱하고 최종적인 상수를 정의할 수 있습니다.
인터페이스에서는 메서드 본문 또는 이니셜라이저 블록을 지정할 수 없습니다.단, Java 8부터는 기본 메서드를 본문으로 지정할 수 있습니다.이 기능은 모든 구현을 갱신하지 않고 기존 인터페이스에 새로운 메서드를 추가할 수 있도록 하기 위한 것입니다.그러나 먼저 인터페이스를 구현한 인스턴스를 작성하지 않으면 이러한 메서드를 실행할 수 없습니다.
기타: 어나니머스 내부 클래스를 사용하여 인터페이스를 구현할 수 있습니다.
interface Foo {
String bar();
}
class FooBar {
Foo anonymous = new Foo() {
public String bar() {
return "The Laundromat Café";
};
}
어나니머스 내부 클래스를 컴파일하려면 인터페이스의 완전한 실장을 제공해야 합니다.
new Foo()
는 기본 생성자를 사용하여 익명 내부 클래스를 초기화 중입니다.
★★★★★★★의 이유final
필드의 값이 최종으로 정의되지 않은 경우 구현에서 필드의 값을 변경할 수 있습니다.그러면 구현의 일부가 됩니다.인터페이스는 구현되지 않은 순수 사양입니다.
★★★★★★★의 이유static
스태틱한 경우 오브젝트나 오브젝트의 런타임타입이 아닌 인터페이스에 속합니다.
여기에는 몇 가지 요점이 설명되어 있습니다.
인터페이스의 필드가 암묵적으로 정적인 최종 필드라고 해서 컴파일 시간 상수이거나 불변할 필요가 있는 것은 아닙니다.예를 들어 정의할 수 있습니다.
interface I { String TOKEN = SomeOtherClass.heavyComputation(); JButton BAD_IDEA = new JButton("hello"); }
(주석 정의 내에서 이 작업을 수행하면 위의 내용이 실제로 정적 이니셜라이저로 컴파일된다는 사실과 관련하여 javac이 혼동될 수 있습니다.)
또, 이러한 제한의 이유는 기술적인 것보다 스타일리시하기 때문에, 많은 사람들이 느긋하게 하고 싶다고 생각하고 있습니다.
필드는 추상적일 수 없으므로 정적이어야 합니다(메서드처럼).추상적일 수 없기 때문에 구현자는 필드의 다른 구현을 논리적으로 제공할 수 없습니다.
필드는 최종적인 것이어야 합니다.많은 다른 실장자가 필드에 액세스 할 수 있기 때문에 변경할 수 있기 때문에 (동기화로서) 문제가 있을 수 있습니다.또, 재실장(숨김)을 회피합니다.
그냥 내 생각일 뿐이야.
최종적인 필드는 Java 언어 설계자의 실수이며 지나치게 제한적이라고 생각합니다.예를 들어, 구현에서 인터페이스 유형의 객체에 대한 작업을 수행하기 위해 필요한 상수를 설정해야 하는 경우가 있습니다.구현 클래스의 코드 패스를 선택하는 것은 크러지입니다.이 회피책은 인터페이스 함수를 정의하고 리터럴을 반환함으로써 구현합니다.
public interface iMine {
String __ImplementationConstant();
...
}
public class AClass implements iMine {
public String __ImplementationConstant(){
return "AClass value for the Implementation Constant";
}
...
}
public class BClass implements iMine {
public String __ImplementationConstant(){
return "BClass value for the Implementation Constant";
}
...
}
단, 이 구문을 사용하는 것이 보다 간단하고 명확하며 이상 구현의 가능성이 낮아집니다.
public interface iMine {
String __ImplementationConstant;
...
}
public class AClass implements iMine {
public static String __ImplementationConstant =
"AClass value for the Implementation Constant";
...
}
public class BClass implements iMine {
public static String __ImplementationConstant =
"BClass value for the Implementation Constant";
...
}
사양서, 계약서...필드 액세스를 위한 기계 명령은 개체 주소와 필드 오프셋을 사용합니다.클래스는 다수의 인터페이스를 실장할 수 있기 때문에 이 인터페이스를 확장하는 모든 클래스에서 비최종 인터페이스 필드에 동일한 오프셋을 설정할 수 없습니다.따라서 필드 액세스에는 다른 메커니즘이 구현되어야 합니다.즉, 1개의 가상 필드 테이블(가상 메서드테이블의 아날로그)을 유지하는 것이 아니라 2개의 메모리액세스(필드 오프셋 취득, 필드 값 취득)가 필요합니다.기존 방식(방법)을 통해 쉽게 시뮬레이션할 수 있는 기능을 위해 jvm을 복잡하게 만들고 싶지 않았던 것 같습니다.
스칼라에서는, 인터페이스내에 필드를 설정할 수 있습니다만, 내부적으로는 상기의 설명(메서드로서)이 실장되어 있습니다.
다음과 같습니다static
.
음음변( 또는 방법)인것static
에서는 바 in음음음음음음음음음음음음음음 in in in in in in in in in in in라고 호출할 수.Classname.variablename
★★★★★★★★★★★★★★★★★」Classname.methodname
오브젝트명만을 사용하여 호출할 필요는 없습니다.
할 수 .또한 오브젝트는 선언할 수 없습니다.static
를 사용하면 오브젝트 이름 없이 클래스 이름만으로 변수를 호출할 수 있습니다.
다음과 같습니다final
.
변수의 하위 클래스에서 재정의할 수 없으므로 변수의 값을 일정하게 유지하는 데 도움이 됩니다.
언급URL : https://stackoverflow.com/questions/1513520/why-are-all-fields-in-an-interface-implicitly-static-and-final
'programing' 카테고리의 다른 글
간단한 Python 루프를 병렬화하려면 어떻게 해야 하나요? (0) | 2023.02.02 |
---|---|
끈을 피한다는 게 무슨 뜻이죠? (0) | 2023.02.02 |
JavaScript 배열의 마지막 요소 선택 (0) | 2023.02.02 |
MySQL vs MariadB:일반 오류: 1205 잠금 대기 시간 초과. 트랜잭션을 다시 시작해 보십시오. (0) | 2023.02.02 |
Django DB를 SQLite에서 MySQL로 마이그레이션하는 가장 좋은 방법은 무엇입니까? (0) | 2023.02.02 |