わかりやすい言葉や記事へのリンクで説明してください。
19 に答える
extends
クラスを拡張するためのものです。
implements
インターフェイスを実装するためのものです
インターフェイスと通常のクラスの違いは、インターフェイスでは宣言されたメソッドを実装できないことです。インターフェイスを「実装」するクラスのみがメソッドを実装できます。インターフェイスに相当するC++は、抽象クラスになります(まったく同じではありませんが、ほとんど同じです)。
また、Javaはクラスの多重継承をサポートしていません。これは、複数のインターフェイスを使用することで解決されます。
public interface ExampleInterface {
public void doAction();
public String doThis(int number);
}
public class sub implements ExampleInterface {
public void doAction() {
//specify what must happen
}
public String doThis(int number) {
//specfiy what must happen
}
}
現在、クラスを拡張しています
public class SuperClass {
public int getNb() {
//specify what must happen
return 1;
}
public int getNb2() {
//specify what must happen
return 2;
}
}
public class SubClass extends SuperClass {
//you can override the implementation
@Override
public int getNb2() {
return 3;
}
}
この場合
Subclass s = new SubClass();
s.getNb(); //returns 1
s.getNb2(); //returns 3
SuperClass sup = new SuperClass();
sup.getNb(); //returns 1
sup.getNb2(); //returns 2
@Override
また、元のインターフェイスメソッドにはオーバーライドされるものがないため、インターフェイスの実装にタグは必要ないことに注意してください。
オブジェクト指向プログラミングにおける動的バインディング、ポリモーフィズム、および一般的な継承について、さらに調査することをお勧めします。
プロファイルにC++の質問がいくつかあることに気付きました。C ++からの多重継承(他の複数のクラスから特性を継承するクラスを指す)の概念を理解している場合、Javaはこれを許可しませんがinterface
、C++の純粋な仮想クラスのようなキーワードを持っています。多くの人が言っているように、あなたextend
はクラス(そしてあなたは1つからしか拡張できません)、そしてあなたimplement
はインターフェースです-しかしあなたのクラスはあなたが好きなだけ多くのインターフェースを実装することができます。
つまり、これらのキーワードとその使用を管理するルールは、Javaでの多重継承の可能性を示しています(スーパークラスは1つだけですが、複数のインターフェースを実装できます)。
通常、インターフェイスの実装に使用される実装と、基本クラスの動作または抽象クラスの拡張に使用される拡張。
extends:派生クラスは基本クラスを拡張できます。確立された関係の動作を再定義できます。派生クラス"は"基本クラスタイプです
実装:契約を実装しています。インターフェイス「」を実装するクラスには「」機能があります。
java 8リリースでは、インターフェースはインターフェースにデフォルトのメソッドを持つことができ、インターフェース自体に実装を提供します。
それぞれをいつ使用するかについては、この質問を参照してください。
物事を理解するための例。
public class ExtendsAndImplementsDemo{
public static void main(String args[]){
Dog dog = new Dog("Tiger",16);
Cat cat = new Cat("July",20);
System.out.println("Dog:"+dog);
System.out.println("Cat:"+cat);
dog.remember();
dog.protectOwner();
Learn dl = dog;
dl.learn();
cat.remember();
cat.protectOwner();
Climb c = cat;
c.climb();
Man man = new Man("Ravindra",40);
System.out.println(man);
Climb cm = man;
cm.climb();
Think t = man;
t.think();
Learn l = man;
l.learn();
Apply a = man;
a.apply();
}
}
abstract class Animal{
String name;
int lifeExpentency;
public Animal(String name,int lifeExpentency ){
this.name = name;
this.lifeExpentency=lifeExpentency;
}
public void remember(){
System.out.println("Define your own remember");
}
public void protectOwner(){
System.out.println("Define your own protectOwner");
}
public String toString(){
return this.getClass().getSimpleName()+":"+name+":"+lifeExpentency;
}
}
class Dog extends Animal implements Learn{
public Dog(String name,int age){
super(name,age);
}
public void remember(){
System.out.println(this.getClass().getSimpleName()+" can remember for 5 minutes");
}
public void protectOwner(){
System.out.println(this.getClass().getSimpleName()+ " will protect owner");
}
public void learn(){
System.out.println(this.getClass().getSimpleName()+ " can learn:");
}
}
class Cat extends Animal implements Climb {
public Cat(String name,int age){
super(name,age);
}
public void remember(){
System.out.println(this.getClass().getSimpleName() + " can remember for 16 hours");
}
public void protectOwner(){
System.out.println(this.getClass().getSimpleName()+ " won't protect owner");
}
public void climb(){
System.out.println(this.getClass().getSimpleName()+ " can climb");
}
}
interface Climb{
public void climb();
}
interface Think {
public void think();
}
interface Learn {
public void learn();
}
interface Apply{
public void apply();
}
class Man implements Think,Learn,Apply,Climb{
String name;
int age;
public Man(String name,int age){
this.name = name;
this.age = age;
}
public void think(){
System.out.println("I can think:"+this.getClass().getSimpleName());
}
public void learn(){
System.out.println("I can learn:"+this.getClass().getSimpleName());
}
public void apply(){
System.out.println("I can apply:"+this.getClass().getSimpleName());
}
public void climb(){
System.out.println("I can climb:"+this.getClass().getSimpleName());
}
public String toString(){
return "Man :"+name+":Age:"+age;
}
}
出力:
Dog:Dog:Tiger:16
Cat:Cat:July:20
Dog can remember for 5 minutes
Dog will protect owner
Dog can learn:
Cat can remember for 16 hours
Cat won't protect owner
Cat can climb
Man :Ravindra:Age:40
I can climb:Man
I can think:Man
I can learn:Man
I can apply:Man
理解すべき重要なポイント:
- 犬と猫は動物であり、から共有することによって
remember
()と()を拡張しましたprotectOwner
name,lifeExpentency
Animal
- 猫は登ることができますが()、犬はできません。犬はthink()できますが、猫はできません。これらの特定の機能は、その機能に追加され
Cat
、Dog
その機能を実装することによって追加されます。 - 人は動物ではありませんが、彼はできます
Think,Learn,Apply,Climb
これらの例を通して、あなたはそれを理解することができます
無関係のクラスはインターフェースを介して機能を持つことができますが、関連するクラスは基本クラスの拡張を介して動作をオーバーライドします。
次の図に示すように、クラスは別のクラスを拡張し、インターフェイスは別のインターフェイスを拡張しますが、クラスはインターフェイスを実装します。
詳細については
extends
基本クラスから継承する(つまり、その機能を拡張する)場合に使用します。
implements
インターフェイスを実装する場合に使用します。
ここから始めるのが良いでしょう:インターフェースと継承。
class
は、を「実装」することしかできませんinterface
。クラスはaを「拡張」するだけclass
です。同様に、interface
は別のを拡張できますinterface
。
Aclass
は他の1つだけを拡張できclass
ます。Aclass
はいくつかのを実装できますinterface
。
代わりに、abstract class
esとinterface
sをいつ使用するかを知りたい場合は、次のスレッドを参照してください:インターフェイスと抽象クラス(一般的なOO)
インターフェイスは、オブジェクトが実行できるアクションの説明です。たとえば、ライトスイッチを切り替えると、ライトが点灯します。方法は関係ありません。オブジェクト指向プログラミングでは、インターフェイスは、オブジェクトが「X」になるために必要なすべての関数の記述です。繰り返しになりますが、例として、ライトを「ACTS LIKE」するものには、turn_on()メソッドとturn_off()メソッドが必要です。インターフェイスの目的は、コンピュータがこれらのプロパティを適用できるようにし、TYPE Tのオブジェクト(インターフェイスが何であれ)にX、Y、Zなどの関数が必要であることを認識できるようにすることです。
インターフェイスは、コンピュータがオブジェクト(クラス)に特定のプロパティを適用できるようにするプログラミング構造/構文です。たとえば、車のクラスとスクーターのクラスとトラックのクラスがあるとします。これらの3つのクラスには、それぞれstart_engine()アクションが必要です。各車両の「エンジンの始動」方法は各特定のクラスに任されていますが、start_engineアクションが必要であるという事実は、インターフェースのドメインです。
拡張:これは、親クラスの属性を子クラスに取得するために使用され、子クラスでオーバーライドできる定義済みのメソッドが含まれている場合があります。
実装:これは、子クラスで定義することにより、インターフェース(関数の署名のみを持ち、定義は持たない親クラス)を実装するために使用されます。
特別な条件が1つあります。「新しいインターフェイスを既存のインターフェイスの子にしたい場合はどうすればよいですか?」上記の条件では、子インターフェースは親インターフェースを拡張します。
両方のキーワードは、Java言語で独自の新しいクラスを作成するときに使用されます。
違い: implements
クラスでJavaInterfaceの要素を使用していることを意味します。 extends
拡張する基本クラスのサブクラスを作成していることを意味します。子クラスで拡張できるクラスは1つだけですが、必要な数のインターフェースを実装できます。
詳細については、インタフェースのOracleドキュメントページを参照してください。
これは、インターフェースとは何か、およびそれらの使用に関する規則を明確にするのに役立ちます。
AはBを拡張します:
AとBは両方ともクラスまたは両方のインターフェースです
AはBを実装します
Aはクラスで、Bはインターフェイスです
Aがインターフェースで、Bがクラスである残りのケースは、Javaでは無効です。
実装はインターフェースに使用され、extendsはクラスを拡張するために使用されます。
簡単に言うと、インターフェースは、それが聞こえるようなものであり、インターフェースであり、モデルであり、アイデアとともに適用する必要があります。
Extendはクラスに使用されます。ここでは、機能を追加することにより、既存のものを拡張しています。
さらにいくつかのメモ:
インターフェイスは別のインターフェイスを拡張できます。
また、特定のシナリオでインターフェイスを実装するかクラスを拡張するかを選択する必要がある場合は、インターフェイスの実装に進んでください。クラスは複数のインターフェイスを実装できますが、拡張できるのは1つのクラスのみであるためです。
SubClassは、 SuperClassですでに宣言されている機能(メソッドまたはインスタンス変数)を使用する場合、またはSuperClassの機能を少し変更する(メソッドのオーバーライド)場合にのみ、 SuperClassを拡張します。しかし、たとえば、Animalクラス(SuperClass)とDogクラス(SubClass)があり、Animalクラスで定義したメソッドはほとんどありません。doEat(); 、doSleep(); ... などなど。
これで、DogクラスはAnimalクラスを単純に拡張できます。犬に、Animalクラスで宣言されたメソッドのいずれかを使用させたい場合は、Dogオブジェクトを作成するだけでそれらのメソッドを呼び出すことができます。ですから、こうすることで、食べたり寝たり、犬にやりたいことを何でもできる犬がいることを保証できます。
さて、ある日、猫の恋人が私たちのワークスペースにやって来て、彼女が動物のクラスを拡張しようとしていると想像してみてください(猫も食べて寝ます)。彼女はCatオブジェクトを作成し、メソッドの呼び出しを開始します。
しかし、たとえば、誰かがAnimalクラスのオブジェクトを作成しようとします。猫がどのように眠るか、犬がどのように食べるか、象がどのように飲むかを知ることができます。しかし、Animalクラスのオブジェクトを作成することには意味がありません。それはテンプレートであり、私たちは一般的な食べ方を望まないからです。
その代わりに、誰もインスタンス化できないが、他のクラスのテンプレートとして使用できる抽象クラスを作成することを好みます。
結論として、Interfaceは、メソッドの実装を含まず、定義(テンプレート)のみを含む抽象クラス(純粋な抽象クラス)にすぎません。したがって、インターフェイスを実装する人は誰でも、 doEat()のテンプレートがあることを知っています。およびdoSleep(); ただし、独自のdoEat()を定義する必要があります。およびdoSleep(); 必要に応じた方法。
SuperClassの一部を再利用したい場合にのみ拡張し(ただし、必要に応じていつでもSuperClassのメソッドをオーバーライドできることに注意してください)、テンプレートが必要で、独自に定義したい場合に実装します。 (必要に応じて)。
コードの一部を共有します。さまざまな入力セットで試して、結果を確認します。
class AnimalClass {
public void doEat() {
System.out.println("Animal Eating...");
}
public void sleep() {
System.out.println("Animal Sleeping...");
}
}
public class Dog extends AnimalClass implements AnimalInterface, Herbi{
public static void main(String[] args) {
AnimalInterface a = new Dog();
Dog obj = new Dog();
obj.doEat();
a.eating();
obj.eating();
obj.herbiEating();
}
public void doEat() {
System.out.println("Dog eating...");
}
@Override
public void eating() {
System.out.println("Eating through an interface...");
// TODO Auto-generated method stub
}
@Override
public void herbiEating() {
System.out.println("Herbi eating through an interface...");
// TODO Auto-generated method stub
}
}
定義されたインターフェース:
public interface AnimalInterface {
public void eating();
}
interface Herbi {
public void herbiEating();
}
最も簡単な用語では、 extendsはクラスから継承するために使用され、implementsはクラスにインターフェースを適用するために使用されます
拡張:
public class Bicycle {
//properties and methods
}
public class MountainBike extends Bicycle {
//new properties and methods
}
実装:
public interface Relatable {
//stuff you want to put
}
public class RectanglePlus implements Relatable {
//your class code
}
それでも混乱する場合は、https ://docs.oracle.com/javase/tutorial/java/IandI/subclasses.htmlhttps://docs.oracle.com/javase/tutorial/java/IandI/usinginterface.htmlをお読みください 。
サブクラスがクラスを拡張すると、サブクラスはスーパータイプで定義されたコードを継承(再利用)およびオーバーライドできます。クラスがインターフェースを実装すると、そのクラスから作成されたオブジェクトを、インターフェースの値を期待する任意のコンテキストで使用できるようになります。
ここでの本当の落とし穴は、私たちが何かを実装している間、それは単にそれらのメソッドをそのまま使用していることを意味するということです。それらの値と戻り値のタイプを変更する余地はありません。
しかし、私たちが何かを拡張しているとき、それはあなたのクラスの拡張になります。変更、使用、再利用が可能であり、スーパークラスの場合と同じ値を返す必要はありません。
クラスとインターフェースはどちらもコントラクトです。これらは、アプリケーションの他の部分が依存するメソッドとプロパティを提供します。
このコントラクトの実装の詳細に関心がない場合は、インターフェースを定義します。気にする唯一のことは、コントラクト(インターフェース)が存在することです。
この場合、契約がどのように履行されるかについての詳細を気にするために、インターフェースを実装するクラスに任せます。クラスのみがインターフェースを実装できます。
extendsは、既存の契約の詳細を置き換える場合に使用されます。このようにして、契約を履行するための1つの方法を別の方法に置き換えます。クラスは他のクラスを拡張でき、インターフェイスは他のインターフェイスを拡張できます。
extends
子クラス/インターフェースに親クラス/インターフェースの属性が必要な場合にimplements
使用され、クラスにインターフェースの属性が必要な場合に使用されます。
例:
クラスを使用して拡張
class Parent{ } class Child extends Parent { }
インターフェイスを使用して拡張
interface Parent { } interface Child extends Parent { }
実装
interface A { } class B implements A { }
拡張と実装の組み合わせ
interface A { } class B { } class C implements A, extends B { }
拡張します
- クラスは1つのクラスのみを拡張します
- インターフェイスは1つ以上のインターフェイスを拡張します
実装
- クラスは1つ以上のインターフェースを実装します
- インターフェイスは「できません」は何も実装しません
抽象クラスもクラスのように機能し、拡張および実装します
Javaでは、クラス(サブクラス)は別のクラス(スーパークラス)を拡張し、スーパークラスで定義されたメソッドをオーバーライドできます。
実装は、クラスがインターフェイスで定義されたメソッドを宣言しようとするときに使用されますが、そのクラスは拡張されます。
これらの2つのキーワードは、OOPのコアコンセプトである継承に直接関連付けられています。一部のクラスを別のクラスに継承する場合はextendsを使用できますが、一部のインターフェイスをクラスに継承する場合はextendsを使用できません。実装を使用する必要があり、 extendsキーワードを使用して別のインターフェイスからインターフェイスを継承できます。