白はJavaSE-day 07のインタフェースを学びます
インタフェース
1、インタフェースの紹介
インタフェースは、双方を制約するための仕様(ルール)です.インタフェースルールを定義すると、インタフェースのルールの下で具体的なコード実装を行い、双方の間で通信することができます.
例:天候データ
各サイトは天気データを表示する必要があるかもしれませんが、データは中央気象局にあります.中央気象局は天気を取得するデータインタフェースを提供し、各サイトはこのインタフェース規範に基づいてデータを伝達し、最終的にある地域の天気情報を取得することができる.
2、Javaで提供するインタフェース
インタフェースの名前とクラス名の表記規範は一致しています.複数の単語は単語の頭文字が大文字です.
インタフェースの変数:固定修飾子(public static final)
インタフェース内のメソッド:JDk 8の前に、インタフェースでは抽象メソッドしか定義できません(public abstract)
インタフェースの変数や抽象メソッドにはデフォルトの修飾があるので、書くときに省略できます.
しかし、書き方をするときは、publicと書いておくことをお勧めします.
3、インタフェースの使用
一般的なインタフェースのメソッドは抽象的なメソッド(JDK 8以前)であり,インタフェースのメソッドを実装するためにクラスが必要であり,そのクラスのオブジェクトを作成し,関連するメソッドを使用する必要がある.
クラスとクラス間:継承関係、および単一継承
インタフェースとクラス間:実装関係であり、implementsキーワードを使用し、1つのクラスが複数のインタフェースを同時に実装できます.
インタフェースとインタフェースの間:継承関係であり、マルチ継承
複数のインタフェースに同名の抽象メソッドがあっても、最終的にはインタフェースに継承されますが、抽象メソッドであり、最終的にはクラスが抽象メソッドを複写する必要があり、最終的には実装クラスのオブジェクトを作成し、クラスの複写メソッドを呼び出して関連機能を完了します.
複数のインタフェースに同じ名前の変数が存在する場合、クラスまたはサブインタフェース呼び出しを実装する際にも不確実性が発生します.この場合、対応するインタフェース名で変数を呼び出す必要があります.
インタフェースを定義するときは、できるだけ名前の変数を変更しないことをお勧めします.
4、インタフェースケース
親と子:それらは常に同じシステムに属します.親に記述された動作(方法)は、このシステムで共有されているに違いない.
インタフェース:一般的に記述されている動作は、システム全体の外のいくつかの追加(特殊な動作)に属します.
5、JDK 8以降のインタフェース書き
1、インタフェースの紹介
インタフェースは、双方を制約するための仕様(ルール)です.インタフェースルールを定義すると、インタフェースのルールの下で具体的なコード実装を行い、双方の間で通信することができます.
例:天候データ
各サイトは天気データを表示する必要があるかもしれませんが、データは中央気象局にあります.中央気象局は天気を取得するデータインタフェースを提供し、各サイトはこのインタフェース規範に基づいてデータを伝達し、最終的にある地域の天気情報を取得することができる.
2、Javaで提供するインタフェース
interface {
//
//
}
インタフェースの名前とクラス名の表記規範は一致しています.複数の単語は単語の頭文字が大文字です.
インタフェースの変数:固定修飾子(public static final)
インタフェース内のメソッド:JDk 8の前に、インタフェースでは抽象メソッドしか定義できません(public abstract)
//
interface Inter{
// final ,
// :ctrl + shift + x
// :ctrl + shift + y
public static final int NUMBER = 12;
int AGE = 33;
public abstract void demo();
void func();
}
インタフェースの変数や抽象メソッドにはデフォルトの修飾があるので、書くときに省略できます.
しかし、書き方をするときは、publicと書いておくことをお勧めします.
3、インタフェースの使用
一般的なインタフェースのメソッドは抽象的なメソッド(JDK 8以前)であり,インタフェースのメソッドを実装するためにクラスが必要であり,そのクラスのオブジェクトを作成し,関連するメソッドを使用する必要がある.
クラスとクラス間:継承関係、および単一継承
class A{
}
class B extends A{
}
class C extends B{
}
インタフェースとクラス間:実装関係であり、implementsキーワードを使用し、1つのクラスが複数のインタフェースを同時に実装できます.
interface Inter1{
}
interface Inter2{
}
interface Inter3{
}
class Demo implements Inter1,Inter2,Inter3{
// , ( )
// ,
}
インタフェースとインタフェースの間:継承関係であり、マルチ継承
interface Inter1{
}
interface Inter2{
}
interface Inter3{
}
interface Inter4 extends Inter1, Inter2 , Inter3{
}
複数のインタフェースに同名の抽象メソッドがあっても、最終的にはインタフェースに継承されますが、抽象メソッドであり、最終的にはクラスが抽象メソッドを複写する必要があり、最終的には実装クラスのオブジェクトを作成し、クラスの複写メソッドを呼び出して関連機能を完了します.
interface Inter1{
public void demo();
public void method();
}
interface Inter2{
public void demo();
public void func();
}
// ,
interface Inter3 extends Inter1 , Inter2{
}
//
class Demo implements Inter3{
public void demo() {
}
public void method() {
}
public void func() {
}
}
public class InterfaceDemo {
public static void main(String[] args) {
Demo d = new Demo();
d.demo();
}
}
複数のインタフェースに同じ名前の変数が存在する場合、クラスまたはサブインタフェース呼び出しを実装する際にも不確実性が発生します.この場合、対応するインタフェース名で変数を呼び出す必要があります.
interface Inter1{
int X = 12;
}
interface Inter2{
int X = 34;
}
interface Inter3 extends Inter1, Inter2{
}
class Demo implements Inter3{
}
class Test{
public static void main(String[] args) {
Demo d = new Demo();
// d.x
// Inter1.X Inter2.X
}
}
インタフェースを定義するときは、できるだけ名前の変数を変更しないことをお勧めします.
4、インタフェースケース
親と子:それらは常に同じシステムに属します.親に記述された動作(方法)は、このシステムで共有されているに違いない.
インタフェース:一般的に記述されている動作は、システム全体の外のいくつかの追加(特殊な動作)に属します.
/*
* : 、 、 , Animal
* ,
*/
abstract class Animal{
// eat
public abstract void eat();
}
//
interface AntiDrug{
public void antiDrug();
}
// Dog
class Dog extends Animal implements AntiDrug{
public void eat() {
System.out.println(" ");
}
//
public void antiDrug() {
System.out.println(" ");
}
}
class Cat extends Animal{
public void eat() {
System.out.println(" ");
}
}
//Pig
class Pig extends Animal implements AntiDrug{
public void eat() {
System.out.println(" ");
}
//
public void antiDrug() {
System.out.println(" ");
}
}
public class InterfaceDemo2 {
public static void main(String[] args) {
Dog d = new Dog();
d.eat();
Pig p = new Pig();
p.antiDrug();
}
}
5、JDK 8以降のインタフェース書き
/*
* JDK8
* : default
*/
interface Inter{
int X = 12;
public void demo();
// JDK8
default void func() {
System.out.println(" default ");
method();
}
// JDK11
static void run() {
System.out.println(" static ");
//
//method();
}
// JDK11
private void method() {
System.out.println(" ");
}
}
// Impl
class InterImpl implements Inter{
public void demo() {
}
}
public class InterfaceDemo3 {
public static void main(String[] args) {
Inter.run();
InterImpl ii = new InterImpl();
ii.func();
ii.demo();
}
}