에서 [기재] 자바 인터페이스와 추상 클래스 간의 대비

자바 추상 ​​클래스와 인터페이스 사이의 대조

첫째, 인터페이스

Interface, 그것은 더 잘 이해 될 수있는 소켓에 번역. 그것은 일반적으로 당신은 노트북 삼각형 언 플러그에 소켓을 연결할 때, 인터페이스의 구현 클래스의 동작을 정의하는 전자 레인지를 대체하기에 연결하는 데 사용됩니다, 당신은 삼각형 플러그입니다이 두 가지를 찾을 수 있습니다. 그런 다음 플러그 삼각형은 원칙적으로 간주하지만,이 두 제품은 동일한 규칙의 두 멤버를 달성하는 것입니다 수 있습니다. A가 동적으로 다른 부재로 대체되도록하는 규칙은 동일한을 달성하기 때문에 부재 훨씬 용이해진다. 그래서 코드에서 같은 사실은 두 클래스가 동일한 인터페이스를 구현할 때, 다른에 원래의 구현 클래스의 클라이언트가 쉽게되고있다.

먼저 다음 코드는 인터페이스를 정의합니다 :

[public] interface InterfaceName {

    void fun1();

}

인터페이스가 암시 적으로 기본값 인 인터페이스에 정의 된 변수와 메소드,하지만 변수를 가질 수있다 public static final변수, 그리고 수정 다른 수정을 사용하는 경우에만 오류 컴파일시 것이다, 그래서이 될 수 있습니다. 마찬가지로, 기본 방법이 될 것입니다 public abstract수정했습니다. 그러나, 당신은 단지 방법을 정의 할 수 있지만 구현 클래스 메소드를 가질 수 없습니다, 방법은 인터페이스 (추상 클래스를 달성하기 위해 방법을 가질 수 있습니다) 다른와 추상 클래스에 단지 추상적 인 방법 할 수있다.

그리고 인터페이스 구현 클래스는 다음 예제 코드에 해당하는

public class ClassName implements InterfaceName, OtherInterface, [...] {
    
    public void fun1() {
        // do something ...
    }
    
}

자바에서 클래스는 단일 상속이지만, 여러 인터페이스를 상속 할 수 있으며, 인터페이스는 여러 인터페이스를 상속 할 수 있습니다.

둘째, 추상 클래스

자바 언어에서는 두 가지 종류가있다 : 하나는 구체적인 클래스이고, 다른 하나는 추상 클래스입니다. 특정 클래스가 인스턴스화 할 수없는 추상 클래스는 인스턴스화됩니다. 그래서 여기 당신이 추상 클래스를 만들고, 생각할 수있는, 당신은 클래스의 과정이 통화 정적 변수와 메소드를 포함하지 않는 당신을 위해 어떤 기능 (달성하기 위해 인스턴스화 할 수없는 사용할 수 없습니다 결국 상속하는 것입니다,하지만 당신은 단지 사용하는 경우 당신이 원하는 왜 그렇게,이 클래스는 추상적 인 것이로 선언?)

추상 클래스를 이해하기 전에, 우리는 먼저 추상적 인 방법을 이해 : 추상적 인 방법은 특별한 방법, 그것은 단지 성명,하지만 구체적인 실현 :

abstract void fun1();

추상 메소드는 클래스 정의 사용해야 무승부 absract키워드 수정 같은 추상 클래스도 할 필요가 abstract수정 키워드

[public] abstract class AbstractClassName {
    
    abstract void fun1();
    
}

클래스는 추상 클래스를 상속하는 경우는 서브 클래스도 추상 클래스로 정의되지 않는 한, 추상 클래스에 정의 된 모든 추상 메소드를 구현하는 것이 필요하다 서브 클래스입니다.

셋째, 비교

문법적 기능 대비

  • 인터페이스는 추상 메소드를 포함 할 수 있으며 일반적인 방법은 추상 클래스, 추상 방법이있을 수 있습니다
  • 인터페이스는 생성자를 포함하지 않는, 추상 클래스는 확장 클래스 상속을 준비하는 생성자를 포함 할 수 있습니다
  • 인터페이스 코드 블록은 정적 코드 블록과 정적 메서드를 가질 수 있습니다 정적 메서드 및 정적, 추상 클래스를 포함 할 수 없습니다
  • 인터페이스는, 모두 추상 클래스는 공통 속성을 정의 할 수 있습니다, 정적 상수 속성을 정의 할 수 있습니다 당신은 또한 정적 상수 속성을 정의 할 수 있습니다

디자인 사고의 비교

, 인터페이스를 구현하는 추상 클래스를 상속 : 우리는 종종 구두 말한다. 사실,이 문장이 표시 인터페이스와 추상 클래스의 차이가 있습니다.

인터페이스는 계약이 당신이 달성 할 수 있도록하는 것입니다 계약, 더 간주됩니다. 누군가가 당신에게 인터페이스를 제공하는 경우, 당신은 달성하기 위해 인터페이스에 정의 된 방법으로,이 계약의 실현에있다 할 것이다. 그래서 사실, 인터페이스는 특정 방법과 과정에서 특징 방법에있어서, 상기의 기능의 모음입니다,하지만 그들은 시스템 신흥에서 몇 가지 방법 일반적이다. 하나 개의 인터페이스 프로세스의 기능 만 구현되는 다른 장소에서 이러한 방법의 구현이 존재하지 않는가, 다른 행동을 할 수 있습니다.

더 많은 추상 클래스는 템플릿으로 간주되고, 그것은 상속 출발점을 제공, 그것은 서브 클래스의 공통 부분을 달성에 초점을 맞출 것입니다. 그래서 추상 클래스 템플릿 스타일의 디자인이며, 템플릿 디자인은 무엇인가? PPT B와 PPT의 C를 설계하는 경우 가장 간단한 예를 들어, 우리는, PPT 템플릿 내에서 사용하고 템플릿, PPT B와 PPT의 C가 변경할 수있는 공공 필요의 일부인 경우 일부는, 당신은 단지 변경해야한다 일반 템플릿 템플릿, 그리고 변경할 B와 PPT의 C-PPT를 다시 할 필요가 없습니다 수 있습니다. 즉, 추상 클래스의 구체적인 실현에 직접 추가 할 수있는 새로운 방법을 추가, 서브 클래스는 변경할 수 없습니다 필요하면, 추상 클래스이고, 인터페이스가 변경된 경우 인터페이스에 대해,이 인터페이스의 모든 실현되지 않습니다 클래스는 적절한 변경해야합니다.

넷째, 달성하기 위해 재사용과 규범 사이에서 선택할 상속

인터페이스는 인터페이스의 경우 선택, 후 개발에, 추상 클래스의 특별한 종류입니까? 때 추상 클래스 그것의 선택?

  • 기본 설정 인터페이스

다음의 모든 조건이 만족되면, 추상 클래스의 선택

  • 서브 클래스는 오히려 두 개의 서로 다른 관계 "를 가지고-A"와 "인가-A"를 구별하는 부모 역할,보다 상위 클래스의 특별한 클래스입니다. 가지고-A 관계는 집계 관계를 사용하여 설명되어야하지만 전용-A 관계는 상속과 일치한다.

  • 당신은 클래스의 또 다른 상황 서브 클래스로 서브 클래 싱 할 필요가 없습니다

  • 서브 클래스는 상위 클래스를 확장 할 책임이있다. 대신 교체 아웃 (무시) ​​또는 상각 책임 (무효) 부모 클래스를 갖는. 자식 클래스는 많은 수의 상위 클래스의 동작을 변위 필요가있는 경우, 다음이이 서브 클래스의 상위 클래스의 서브 클래스가되지해야한다.

  • 그들이 상속을 사용하기 전에 부모와 자식 클래스가 같은 분류에 속하는 경우에만, 도구에서 상속하지 않습니다.

다섯, 자바 8의 새로운 기능

자바 (8)을 시작으로, 인터페이스는 또한 기본 인터페이스 방법 유지 보수 비용이 너무 높은 지원하지 않기 때문에 이것이 달성하기위한 기본 방법을 가질 수 있습니다. 자바 (8)하기 전에, 당신이 원하는 경우 인터페이스는 인터페이스를 구현하는 모든 클래스를 수정 한 후, 새로운 방법을 추가 할 수 있습니다.

public interface InterfaceExample {

    void func1();

    default void func2(){
        System.out.println("func2");
    }

}
public class InterfaceImplementExample implements InterfaceExample {
    @Override
    public void func1() {
        System.out.println("func1");
    }
}
public static void main(String[] args) {
    InterfaceExample example = new InterfaceImplementExample();
    example.fun1();
    example.fun2();
}

여섯 번째로, 레퍼런스

  • "자바와 모델"
  • https://www.cnblogs.com/felixzh/p/5938544.html
  • https://www.cnblogs.com/devinzhang/archive/2011/12/24/2300260.html
  • https://github.com/CyC2018/CS-Notes/blob/master/notes/Java%20%E5%9F%BA%E7%A1%80.md#%E6%8A%BD%E8%B1%A1 %의 E7 %의 B1 %의 BB %의 E4 %의 B8의 % 8E % E6 %의 8E의 % A5 %의 E5의 %의 8F %의 A3

추천

출처www.cnblogs.com/jojop/p/11334119.html