정적 메서드를 인터페이스에서 선언할 수 없는 이유는 무엇일까요?
public interface ITest {
public static String test();
}
위의 코드는 다음과 같은 오류를 발생시킵니다(적어도 이클립스에서는): "인터페이스 메서드 ITest.test()에 대한 잘못된 수정자; 공개 및 추상만 허용됩니다".
몇 가지 현안에 놀이를하고 삽입하십시오. 첫 번째는 호관련 정적 메서드는 선언 없이 정의합니다. 이 차이는
public interface Foo {
public static int bar();
}
및
public interface Foo {
public static int bar() {
...
}
}
첫 번째는 [에스포] [1] 언급을 하는 이유 때문이다. # 39, 올바른 정의를 구현하고 있는 클래스는 너회가 don& 수 있을지 알 수 없다.
[1]: https://stackoverflow.com/questions/21817/why-cant-i-declare-static-methods-in-an-interface # 21826
인터페이스에 정적 메서드를 가질 수 없는 이유는 Java가 정적 참조를 해결하는 방식에 있습니다. Java는 정적 메서드를 실행하려고 할 때 클래스의 인스턴스를 찾으려고 애쓰지 않습니다. 정적 메서드는 인스턴스 종속적이지 않으므로 클래스 파일에서 바로 실행할 수 있기 때문입니다. 인터페이스의 모든 메서드가 추상적이라는 점을 감안할 때, 정적 메서드를 실행할 수 있는 코드를 찾기 위해 VM은 인터페이스의 특정 구현을 찾아야 합니다. 이는 정적 메서드 해결의 작동 방식과 모순되며 언어에 불일치를 초래할 수 있습니다.
있다, 그 이유는 디자인 때문이다. jave 다중 상속 허용하지 않습니다. 다중 상속 문제를 통해 알 수 있습니다 다음 예:
public class A {
public method x() {...}
}
public class B {
public method x() {...}
}
public class C extends A, B { ... }
이제 전화하시기 C. x () 어떻게 될까요? X () () 또는 발스 적립율은 A. 실행됨을? 이 문제를 해결할 수 있는 다중 상속 모든 언어가 있다.
자바 가상 머신 (jvm) 에 허용하시겠습니까 인터페이스와도 일종의 제한되었거나 다중 상속. 이 문제를 방지하려면 않는 이상, 가질 수 있습니다. 같은 문제를 보면 정적임 인터페이스 및 방법:
public interface A {
public static method x() {...}
}
public interface B {
public static method x() {...}
}
public class C implements A, B { ... }
여기에 동일한 문제가 발생할 경우, 어떤 전화하시기 C. x ()?
지금 심지어 정적임 방법으로 정의할 수 있게 Java8 인터페이스입니다.
interface X {
static void foo() {
System.out.println("foo");
}
}
class Y implements X {
//...
}
public class Z {
public static void main(String[] args) {
X.foo();
// Y.foo(); // won't compile because foo() is a Static Method of X and not Y
}
}
참고: 이런 경우 기본적으로 우리는 여전히 추상적인 방법으로 인터페이스를 사용할 수 있도록 기본 / t # 39, 명시적으로 don& 여러_키워드 기본 방법 및 정적 메서드는 정적 응답.
[1]: # 370967 https://stackoverflow.com/questions/370962/why-cant-static-methods-be-abstract-in-java/370967
정적 메서드에 인터페이스입니다 [jave 8] 에서 볼 수 있는 것 같다 (http://www.techempower.com/blog/2013/03/26/everything-about-java-8/) 에, 뭐, 그냥 내 솔루션은 정의하십시오 내부 구분된다.
interface Foo {
// ...
class fn {
public static void func1(...) {
// ...
}
}
}
같은 기법을 주석입니다) 에서도 사용할 수 있습니다.
public @interface Foo {
String value();
class fn {
public static String getValue(Object obj) {
Foo foo = obj.getClass().getAnnotation(Foo.class);
return foo == null ? null : foo.value();
}
}
}
항상 액세스되는 인터페이스윈프노스 '대신' 안쪽 클래스용 형태로 클라세이프니컬러스 폐기할 수 있습니다 '다음' 모호한 문제다.
그러나 정적 메서드에 인터페이스입니다 인도하심이라만일 jave 8 세상을 바꿀 수 있는 제공하십시오 docname 구축 할 수 있습니다.
public interface StaticMethodInterface {
public static int testStaticMethod() {
return 0;
}
/**
* Illegal combination of modifiers for the interface method
* testStaticMethod; only one of abstract, default, or static permitted
*
* @param i
* @return
*/
// public static abstract int testStaticMethod(float i);
default int testNonStaticMethod() {
return 1;
}
/**
* Without implementation.
*
* @param i
* @return
*/
int testNonStaticMethod(float i);
}
불법 조합을 수정자는: 정적 및 요약
만약 한 멤버가 같이 선언된 클래스의 정적 클래스 이름을 함께 사용할 수 있습니다, 한정돼 있는 해당 클래스의 객체를 만들지 않고.
멤버 로 선언된 클래스의 경우, 추상 클래스) 로 선언해야 합니다 요약 제공해야 할 때 그 이행을 추상 클래스 멤버 중 상속됨 (하위).
추상 클래스의 멤버 구축현 제공해야 합니다 수 있는 동작은 정적 메서드는 하위 where you are 변화를 가져 올 수 있는 지역에 따라, 또한 기본 클래스, 이는 정확하지 않은 추상적인 선언
>. Java 8, 정적 메서드는 인터페이스와도 함께 할 수 있게 되었습니다.
예를 들어, 비교자 정적임 나투라로더 () 는 메서드입니다.
인터페이스를 구현할 수 있는 여유가 되었습니다 요구 사항을 포함할 수 없습니다. 이제 인터페이스와도 너희가운데 " default"; 일반 구현을 통해 구현할 수 있는 방법, 마치 하나의 예외: 의 경우 둘 다 기본 구축 및 수직 인터페이스입니다 상속됩니다 수퍼 superclass& # 39 에서 구현, s 는 항상 시행하십시오 구축현 우선_순위.
아마도 a, C #, # 39 m, 코드 예 보호하리요 I& 사용하려는 확장하지만 따라 준수하십시오 수 있어야 합니다.
우리는 비헤이비어는 치라구요 인터페이스입니다 이페이이블 불렀으매
public interface IPayable
{
public Pay(double amount);
}
이제 이 인터페이스를 구현하는 구체적인 클래스뿐만 2:
public class BusinessAccount : IPayable
{
public void Pay(double amount)
{
//Logic
}
}
public class CustomerAccount : IPayable
{
public void Pay(double amount)
{
//Logic
}
}
이제 우리는 취합은 계정임, 그렇게 하려면 사용할 수 있도록 치라구요 다양한 유형의 이페이이블 일반 목록
List<IPayable> accountsToPay = new List<IPayable>();
accountsToPay.add(new CustomerAccount());
accountsToPay.add(new BusinessAccount());
이제 우리가 원하는 모든 이들에게 50 달러 를 지불할 계정임:
foreach (IPayable account in accountsToPay)
{
account.Pay(50.00);
}
이제 어떻게 인터페이스는 매우 유용합니다.
이들은 주로 인스턴스화됩니다 객체에는 뿐입니다. 아님 정적 클래스.
한 때 이슬람세를 정적임 했을 경우, # 39 의 IPayable& 통해 루프을 이스카운트스토페이 무리라구 강구해야 할 수 있을 경우, 호츨 이슬람세를 켜짐이 비즈니사카운트 또는 쿠스토메라코런트.