Java Interfaceでは、可能な最終変数のみを使用できます。Interfaceで静的変数を作成することもできます。ただし、インターフェイスはのみであるため、同時に静的/最終メソッドを作成することはできません。静的メソッド用です。
Interfaceでstatic/finalメソッドを許可しない理由は正確には何ですか?
最終的なメソッドはオーバーライドできません。実際にメソッドを実装できない場合、それはインターフェースを持つという目的に反します。
静的部分については、 この質問 を参照してください。
間違えている。
すべて変数は暗黙的にパブリック静的であり、インターフェイスで最終的です。
Java 8より前は、インターフェイスで静的メソッドを作成することはできません。すべてのメソッドはインスタンスメソッドです。
インターフェイスの唯一の目標はそれらを実装するクラスを持つことであり、インターフェイスのメソッドは実装を行うことができないため、最終的にすることは意味がありません。実装がなく、オーバーライドすることはできません。
インターフェイスは、静的ではなくインスタンスに対して定義されます。
「最終」は「上書きできない」という意味です。これは、インターフェイスにはまったく意味がありません。
final
は、オーバーライドできないことを意味します。
static
は、クラス名を使用してのみ呼び出すことができることを意味します。インターフェイスには複数の実装があるため、インターフェイスはメソッド自体を実装できないため、どの実装を選択するかをどのように知ることができますか?
それらは、あるクラスによって実装されるインターフェースにあるからです。どこにも実装できないメソッドのポイントは何でしょうか? (これはファイナルが示唆するものです)
インターフェイスメソッドを静的にできない理由を証明するもう1つのポイントがあります。
interface MyInterface {
static void myStaticMethod();
}
次に、2つのクラスで「MyInterface」を実装してみましょう。
// ファーストクラス
class MyClass1 implements MyInterface {
static void myStaticMethod(){
// some implementation
}
}
// 2番目のクラス
class MyClass2 implements MyInterface {
static void myStaticMethod(){
// some implementation
}
}
今、私は以下のようにインスタンス化しています:
1- MyInterface myObj1 = new MyClass1(); 2- myObj1.myStaticMethod();
3- MyInterface myObj2 = new MyClass2(); 4- myObj2.myStaticMethod();
//ここの2行目と4行目では、myStaticMethodは次のようにクラス名を使用して呼び出す必要があるため(myStaticMethodは静的として定義されているため)、間違った呼び出しです。
MyInterface.myStaticMethod();->ただし、この場合、MyClass1クラスとMyClass2クラスによってmyStaticMethod()のさまざまな実装を呼び出す方法。
したがって、インターフェイスメソッドの宣言では静的を使用できないことが証明されています。
最後に、機能をオーバーライドするのとは逆になることは明らかです。
Java 8およびデフォルトのメソッドのコンテキストでは、この質問は新しい意味を持ちます。static
メソッドが許可されるようになり、final
メソッドがまだ許可されない理由可能 この質問で説明されています 。
1:finalメソッドはオーバーライドできないため、finalメソッドを宣言することはできませんが、実装されたクラスで常にすべてのインターフェイスメソッドを定義する必要があります。
2:静的メソッドは常にメソッド本体を必要とするため、静的メソッドはルールと矛盾するため、静的メソッドを宣言できませんが、インターフェイス内でメソッドを定義することはできません。
インターフェイスは純粋な抽象クラスです。したがって、インターフェイスのすべてのメソッドはabtract
であり、子クラスに実装する必要があります。したがって、拡張により、それらのいずれもfinal
として宣言することはできません。
Why Interface methods cannot be “static” & “final”?
インターフェイス内のすべてのメソッドは明示的に抽象化されているため、静的メソッドまたは最終メソッドは抽象化できないため、静的メソッドまたは最終メソッドとして定義することはできません。
インターフェイスインスタンスメソッドのメソッドであるため、インターフェイスのメソッドを静的として宣言できません。また、実装されたクラスでインターフェイスのメソッドをオーバーライドする必要があるため、finalを宣言できません。説明については、このリンクを確認してください ここにリンクの説明を入力してください
静的メソッドはクラスで機能し、インスタンスでは機能しないので、奇妙で無意味です。なんらかの理由でこれが欲しかったと言っても、今は思い出せないので、ずっと昔のことでしょう。
ただし、インターフェイスではクラスを宣言できるため、これを「回避」できます(代替API設計ではありません)。したがって、次のようになります。
interface MyInterface {
static class Helpers {
static void myStaticMethod(); //can be abstract etc as usual
}
}
もちろん、そのクラスなどを通常どおりサブクラス化することも、抽象化、抽象化メソッドなどにすることもできます。
デフォルトでは、インターフェース内に存在するすべてのメソッドはパブリックで抽象的です。インターフェイス内でメソッドをfinalとして宣言すると、まずコンパイラエラーが発生しますが、それでも、子クラスでメソッドをオーバーライドすることはできないため、finalメソッドを使用しても意味がありません。
静的の場合、たとえJavaこれまでのバージョンで許可しても、インターフェイス内で静的を使用することは良いプログラミング手法ではありません。静的メソッドの場合、提供してはならない実装を提供する必要があるからです。さらに、インターフェース内に実装を提供したとしても、それをオーバーライドしてから、クラス名で呼び出す必要があります。