방법 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입니다