Interface in Java 8(Default/Static methods)

5422 단어 Java
jdk 1.7 이전 에는 인터페이스 에서 declare method 만 있 을 수 있 으 며 define method 는 안 됩 니 다.그래서 jdk 1.8 에 서 는 뭐 가 달라 요?
  • Default method

  • 1.7 에서 우 리 는 이렇게 interface 를 정의 하고 declare method 를 정의 합 니 다.
    public interface Play{
        void show();
    }

    show () 방법 은 기본적으로 Public abstract 입 니 다.만약 우리 가 abstract class 를 정의 하려 면, 이렇게:
    public abstract class AbstractPlay {
        public abstract  void show();
    
        public boolean isTrue(){
            return true;
        }
    }

    abstract method 를 설명 할 수도 있 고 하나의 method 를 정의 할 수도 있 습 니 다. 모두 OK 이지 만 인터페이스 에 서 는 abstract method 만 선언 할 수 있 습 니 다. 이것 이 바로 interface 와 abstract class 의 주요 차이 입 니 다.
    그러나 Jdk 1.8 까지 Stream API 가 생 겼 습 니 다. 이것 은 어떤 귀신 입 니까? 만약 에 이런 상황 이 있다 면 interface (이 interface 는 이미 여러 곳 에서 사용 되 었 습 니 다) 의 특성 을 확장 하고 싶 습 니 다. 이 원시 적 인 interface 에 방법 을 추가 하여 더욱 강해 지게 하려 면 어떻게 하 시 겠 습 니까?직접 추가?만약 그렇다면, 이전에 이 인 터 페 이 스 를 실현 한 클 라 스 가 이 인 터 페 이 스 를 모두 다시 실현 해 야 한 다 는 것 을 의미 합 니 다. 정말 좋 습 니까?이러 면 안 돼.
    그래서 jdk 1.8 에 default key word 가 있어 서 이 문 제 를 우호 적 으로 해결 할 수 있 습 니 다.
    public interface TestDefaultMethod {
        void add();
        default  void show(){
    
        }
    }

    이렇게 인터페이스 에서 하나의 method 를 정의 할 수 있 습 니 다. amazing 그 렇 죠?ok, 사실 여기 서 보충 해 야 할 문제 가 있 습 니 다. 자바 에 서 는 다 중 inheritance 를 허용 하지 않 는 다 는 것 을 알 고 있 습 니 다. 다 중 inheritance 는 diamond problem 이 라 고 부 릅 니 다. 즉, class C inherit class A 와 class B 가 있 으 면 A 와 B 중 에 똑 같은 방법 이 있 습 니 다 show ().이때 class C 의 인 스 턴 스 는 obj 라 고 합 니 다. obj. show () 일 때 invoke 에 가 는 어떤 show () 를 모 릅 니 다. 맞 습 니까?
    두 개의 인터페이스 A 와 인터페이스 B 일 때 는 A 와 B 에서 default 키 워드 를 사용 하지 않 고 똑 같은 두 개의 show () 를 define 했다.class C implements 라 는 두 인터페이스, 그러면 C 에 서 는 rewrite show () 를 가 야 합 니 다.A 와 B 중 에는 show () 만 선언 했 을 뿐 define show () 는 없 기 때문에 이 럴 때 충돌 하지 않 는 다.그리고 C 의 intance obj 는 obj. show () 로 갈 수 있 습 니 다. 이것 은 매우 정상 적 인 상황 입 니 다. 1.7 전에 모두 이렇게 했 습 니 다.그렇다면 현재 default 키워드 define 을 사용 하여 똑 같은 show () 두 개 를 사용 했다 면, 이때 의 상황 은 앞의 diamond problem 과 비슷 해 졌 고, 이때 도 error 가 있 을 수 있 기 때문에 이 문 제 는 Jdk 1.8 에 도 존재 한다. 이 문 제 를 해결 하 는 방법 은 C 에서 rewrite show () 방법 이 었 으 면 좋 겠 다.따라서 하나의 Implements 하나의 interface (이 interface 에서 default define 하나의 show () 를 사용한다 면, 이때 obj. show () 를 직접 호출 할 수 있 습 니 다. C 에서 rewrite 하지 않 아 도 됩 니 다. implements 두 개의 Interface 를 사용 하고, 두 인터페이스 에 default define 을 사용 하 는 두 개의 같은 show () 방법 이 포함 되 어 있 습 니 다.이 럴 때 는 C 에서 다시 rewrite show () 를 해 야 합 니 다.
    일 을 좀 더 복잡 하 게 해라.
    public interface I {
        default  void show(){
            System.out.println("A");
        }
    }
    
    public class C {
        public void show(){
            System.out.println("C");
        }
    }
    
    public class A extends C implements I{
    
    }

    class A 의 instance obj, obj. show () 는 어떤 상황 일 까요?정 답 은 출력 C 입 니 다. class 가 interface 보다 더 많은 power 를 가지 고 있 기 때문에 이 럴 때 class C 의 show () 는 interface I 의 show () 를 숨 깁 니 다.
    또 하나의 작은 문제 가 있 습 니 다. 인터페이스 에서 default define 을 사용 하면 Object 에 존재 하 는 방법 을 사용 할 수 있 습 니까?
    public interface I {
        default boolean equals (Object o){
            return true;
        }
    }

    기억 해라, 이렇게 하면 안 된다.
  • Static method

  • jdk 1.7 이전 에는 interface 에서 static method 를 사용 할 수 없습니다.하지만 jdk 1.8 이면 됩 니 다. 아래 처럼:
    public interface StaticKeyWordTest {
    
        static void sayHi(){
            System.out.println("Hi static !");
        }
    
        static void main(String... args){
            StaticKeyWordTest.sayHi();
        }
    }

    여기까지 만 얘 기 하 자.
    더 많은 것 은 여 기 를 참고 할 수 있 습 니 다.https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html

    좋은 웹페이지 즐겨찾기