JDK8 새로운 기능 3-- 기능 인터페이스

방법 1. JDK8이 새로운 인터페이스

jdk8 인터페이스 전

interface 接口名 {
    静态常量;
    抽象方法
}

JDK8 인터페이스를 향상시키기 위해, 인터페이스는 기본 방법과 정적 메서드를 가질 수 있습니다

JDK8 인터페이스 :

interface {
    静态常量;
    抽象方法;
    默认方法;
    静态方法;
}

1.1 인터페이스의 기본 방법

1.1.1 정의 형식

interface 接口名{
    修饰符 default 返回值类型 方法名(){
        body
    }
}

1.1.2 사용

한 가지 방법 : 클래스가 구현 직접 기본 메서드 호출 인터페이스

두 번째 방법 : 당신은 기본 구현 클래스 인터페이스의 메소드를 오버라이드 (override)

예를 들어 A, B, C, B, 및 C가 구현되는 인터페이스를 정의 세

package com.hm.lambda;

public interface AA {
    public default void test01(){
        System.out.println("接口AA的默认方法");
    }
}



package com.hm.lambda;

// 实现类可以直接使用AA的默认方法
public class BB implements AA{
}


package com.hm.lambda;

// 实现类可以重写AA的默认方法
public class CC implements AA {
    @Override
    public void test01() {
        System.out.println("我是CC重写的方法");
    }
}

그런 방법 각각 CC와 BB를 호출

 public static void main(String[] args) {
        BB bb = new BB();
        bb.test01();
        CC cc = new CC();
        cc.test01();
    }

그림에 표시된 실행 결과 :

1.2 인터페이스 정적 메소드

확장을 용이하게하기 위해, JDK8 인터페이스는 고정 수단을 추가

1.2.1 정의 형식

interface 接口名 {
    修饰符 static 返回值类型 方法名(){
        代码;
    }
}

1.2.2 사용

직접 인터페이스 이름을 사용합니다. 정적 메서드 호출을

예를 들면 :

package com.hm.lambda;

public interface AA {
    public default void test01(){
        System.out.println("接口AA的默认方法");
    }

    public static void test02(){
        System.out.println("静态方法test02");
    }
}

전화 :

 public static void main(String[] args) {
        AA.test02();
    }

참고 : 인터페이스 정적 방법이 상속 될 수 없습니다, 다시 쓸 수 없습니다

1.2.3 인터페이스의 차이 기본 방법 및 정적 방법

1) 기본 방법 인스턴스 호출 인터페이스 이름을 통해 정적 메서드 호출

2) 기본 방법은 상속 될 수 있으며, 기본 구현 클래스는 인터페이스 직접적인 방법을 사용할 수 있습니다, 방법은 기본적를 오버라이드 (override) 할 수 있습니다

3) 정적 메서드가 상속 될 수 없습니다, 정적 메서드를 재정의 할 수 없습니다 인터페이스 구현 클래스는, 당신은 단지 인터페이스 욕설을 사용할 수 있습니다

요약 : 기본 방법, 정적 메소드의 정의를 정의 할 때? 이 방법의 요구는, 상속 또는 기본 방법을 사용하면 덮어 쓰기 할 때, 그렇지 않으면 정적 메소드를 사용합니다.

함수 인터페이스를 인식 2

        기능성 추상 메소드 선언 만 인터페이스를 포함하는 인터페이스 (FunctionalImplement)하지만 인터페이스 비추 복수의 방법이있다. 마찬가지로 인터페이스 인스턴스의 특정 인스턴스 여부를 감지 할 수있는 주로 instanceof를 통해 직접 들어 java.io.Serializable을 인터페이스 방법 선언 또는 속성 선언 등과 같은 자바 인터페이스 타입 마커 인터페이스 표지되지.

        인터페이스는 추상적 인 방법을 가질 수있는 인터페이스는, 인터페이스의 종류는 SAM 인터페이스 호출 인터페이스 함수이다.

@FunctionalInterface
public interface LamFilter {
    Boolean filter(Apple apple);
}

         자바 8은 기능 인터페이스는 새 의견 @FunctionalInterface, 주로이 기능 인터페이스 정의에 부합하지 않는 인터페이스를 쓸 때, 컴파일러는 불평, 코멘트와 함께, 오류 검사 컴파일러 수준에 사용을 소개합니다. 플러스 @FunctionalInterface없이 인터페이스의 기능에 영향은 음 그냥 인터페이스는 추상 메소드가 포함되어 있는지 여부를 확인하기 위해 컴파일러를 생각 나게하는, 인터페이스하지 않습니다. 도시 된 바와 같이, 인터페이스 인터페이스 정의 기능의 인터페이스에 주석 @FunctionalInterface 선언.

인터페이스 2.1 기능적 특성

방법은 기본값을 정의 할 수 있습니다 2.1.1

기본 방법은 추상적없는 클래스를 구현하여 직접 호출 기본 구현은,이 클래스는 향상된 확장 성을 달성하기 위해이 방법을 구현할 필요가 없습니다!

@FunctionalInterface
interface HelloWorld {
    void print(String str);
    //默认方法
    default void print2(String message) {
       System.out.println(message);
    }
}

참고 : 기본 (디폴트) 메소드 인터페이스 만 구현 클래스를 통해 호출 할 수 있습니다, 그것은 인터페이스 구현 클래스를 상속하거나 기본 메소드를 오버라이드 (override) 할 수있는 구현을 필요로하지 않습니다.  

2.1.2 정적 메소드의 정의를 허용

정적 메소드는 메소드가 구현되어, 직접 인터페이스 호출 추상적 인 방법이 될 수 없습니다. 일반 정적 방법은 동일합니다, 그것은 호출 구현 클래스를 필요로하지 않습니다

@FunctionalInterface
interface HelloWorld {
    void print(String str);
    //静态方法
    static void print3(String message) {
        System.out.println(message);
    }
}

주 : 정적 정적 메소드 만 인터페이스 이름에 의해 호출 될 수 있고, 이는 클래스라고 구현하는 클래스 또는 객체의 클래스 이름에 의해 달성 될 수 없다. 그냥 보통의 정적 클래스 메서드, 클래스와 같은 위치를 직접 호출하는 방법 

2.1.3. java.lang.Object 상위 공용 방법에서 정의 할 수있다

        (그들은 추상적 인 방법을 있지만) 인터페이스 기능이 방법, 그것은 추상적 인 방법으로 처리되지 않고, 모든 인터페이스에서 구현 된 기능은 기본이 java.lang.Object 상위에 그 함유, Object 클래스를 상속으로 추상 메소드를 구현;

2.1.4 여러 하위 인터페이스를 상속 상위 인터페이스를 허용

        인터페이스 상속 복수의 서브 상위 인터페이스를 허용하지만, 추상적 인터페이스 방법은 각각의 부모 존재할 수 있고, 동일한 방법 추상적이어야

참고 : public 메소드를 제외한 기능 인터페이스, 오직 추상적 인 방법, 개체.

3. 사용자 정의 기능 인터페이스

사용자 정의 기능의 3.1 수는 인터페이스 매개 변수        

우리는 우리가 그것을 수행하는 방법의 세 가지 매개 변수가있는 경우 즉, BiFunction JDK는, 두 개의 매개 변수의 최대를 제공 발견? 이 시간 우리는 그것을 달성하기 위해 사용하는 사용자 인터페이스 기능을 필요로한다!

예를 들면 :

Orage.java

package com.bjc.demo1;

public class Orage {
    private  String color;
    private Double price;
    private Double weight;
    
    public Orage(String color, Double price, Double weight) {
        this.color = color;
        this.price = price;
        this.weight = weight;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public Double getPrice() {
        return price;
    }

    public void setPrice(Double price) {
        this.price = price;
    }

    public Double getWeight() {
        return weight;
    }

    public void setWeight(Double weight) {
        this.weight = weight;
    }
}

 사용자 정의 기능 인터페이스 ThreeFunction :

package com.bjc.lambda.demo1;

@FunctionalInterface
public interface ThreeFunction<T,U,V,R> {
    R apply(T t,U u,V v);
}

사용하는 인터페이스 기능 :

ThreeFunction<String,Double,Double,Orage> tFunc = Orage :: new;
Orage orage = tFunc.apply("red", 3.99, 0.78);
System.out.println(orage);

3.2 맞춤 매개 변수가없는 함수 인터페이스

인터페이스 정의 :

interface InterfaceExample{
	Example create(String name);
}

사용

public static void main(String[] args) {
	InterfaceExample com =  Example::new;
	Example bean = com.create("hello world");
	System.out.println(bean.name);
}

참고 : 예 클래스 POJO입니다

게시 된 205 개 원래 기사 · 원의 찬양 9 · 전망 7920

추천

출처blog.csdn.net/weixin_43318134/article/details/104426168