web-dev-qa-db-fra.com

Comment créer un objet d'une classe abstraite et d'une interface

Comment créer un objet d'une classe abstraite et d'une interface? Je sais que nous ne pouvons pas instancier directement un objet d'une classe abstraite.

16
gautam

Vous ne pouvez pas instancier une classe abstraite ou une interface - vous pouvez instancier une de leurs sous-classes/implémenteurs.

Des exemples de ce type sont typiques dans l'utilisation de Java Collections.

List<String> stringList = new ArrayList<String>();

Vous utilisez le type d'interface List<T> comme type, mais l'instance elle-même est un ArrayList<T>.

13
wkl

Pour créer un objet d'une classe abstraite, utilisez simplement new , tout comme pour créer des objets d'autres classes non abstraites avec juste une petite différence, comme suit:

package com.my.test;

public abstract class MyAbstractClass {
    private String name;

    public MyAbstractClass(String name)
    {
        this.name = name;
    }

    public String getName(){
        return this.name;
    }


}

package com.my.test;

public class MyTestClass {

    public static void main(String [] args)
    {
        MyAbstractClass ABC = new MyAbstractClass("name") {
        };

        System.out.println(ABC.getName());
    }

}

De la même manière, vous pouvez créer un objet de type interface, comme suit:

package com.my.test;

public interface MyInterface {

    void doSome();
    public abstract void go();

}

package com.my.test;

public class MyTestClass {

    public static void main(String [] args)
    {

        MyInterface myInterface = new MyInterface() {

            @Override
            public void go() {
                System.out.println("Go ...");

            }

            @Override
            public void doSome() {
                System.out.println("Do ...");

            }
        };

        myInterface.doSome();
        myInterface.go();
    }

}
9
Marcin

Vous pouvez fournir une implémentation en tant que classe anonyme:

new SomeInterface() {
    public void foo(){
      // an implementation of an interface method
    }
};

De même, une classe anonyme peut étendre une classe parent au lieu d'implémenter une interface (mais elle ne peut pas faire les deux).

4
Dmitri
public abstract class Foo { public abstract void foo(); }
public interface Bar { public void bar(); }
public class Winner extends Foo implements Bar {
  @Override public void foo() { }
  @Override public void bar() { }
}
new Winner(); // OK
3
maerics

Vous pouvez y parvenir de deux manières.

1) Soit vous développez/implémentez la classe/interface Abstract dans une nouvelle classe, créez l’objet de cette nouvelle classe, puis utilisez cet objet selon vos besoins.

2) Le compilateur vous permet de créer des objets anonymes des interfaces dans votre code.

Pour par exemple. (new Runnable () {...});

J'espère que cela t'aides.

Cordialement, .__ Mahendra Liya.

3
Mahendra Liya

Vous écrivez une classe qui dérive de la classe abstraite ou implémentez l'interface, puis vous l'instanciez.

2

"instancier" signifie "créer un objet de".

Donc, vous ne pouvez pas en créer un directement.

Le but des interfaces et des classes abstraites est de décrire le comportement d’une classe concrète qui implémente l’interface ou étend la classe abstraite.

Une classe qui implémente une interface peut être utilisée par un autre code ne connaissant que l'interface, ce qui vous aide à séparer les responsabilités et à préciser ce que vous voulez de l'objet. (Le code appelant saura uniquement que l'objet peut effectuer tout ce qui est spécifié dans l'interface; il ne saura rien de ses autres méthodes.)

Si vous utilisez le code de quelqu'un d'autre qui attend une Fooable (où il s'agit du nom d'une interface), aucun objet d'une classe Fooable ne vous est demandé (car il n'y a pas vraiment de classe de ce type). On ne vous demande qu'une instance d'une classe qui implémente Fooable, c'est-à-dire qui déclare qu'elle peut faire tout ce qui se trouve dans cette interface. En bref, quelque chose qui "peut être Foo'd".

2
Karl Knechtel

Ce que vous savez est correct. Vous ne pouvez pas créer un objet de classe abstraite ou d'interface, car il s'agit d'une classe incomplète (l'interface n'est même pas considérée comme une classe.)

Ce que vous pouvez faire est d'implémenter une sous-classe de classe abstraite qui, bien sûr, ne doit pas être abstraite. Pour l'interface, vous devez créer une classe qui implémente l'interface et les corps des méthodes d'interface.

Voici le didacticiel original sur le site Oracle, http://download.Oracle.com/javase/tutorial/Java/IandI/abstract.html et http://download.Oracle.com/javase/tutorial/ Java/concepts/interface.html

2
gigadot

NON, nous ne pouvons pas créer d'objet à partir d'une interface ou d'une classe abstraite car

L’objectif principal de la création d’un objet est d’utiliser les méthodes et les données encapsulées . Comme l’interface n’a pas d’implémentation concrète, nous ne le pouvons pas.

Pour une classe abstraite, nous pouvons avoir une méthode concrète ou une méthode abstraite, ou les deux ..____. Il n’ya aucun moyen pour le développeur d’API de restreindre l’utilisation de la méthode sans implémentation.

J'espère vous aider. 

1
tsingh
public abstract class AbstractClass { ... }

public interface InterfaceClass { ... }

// This is the concrete class that extends the abstract class above and
// implements the interface above.  You will have to make sure that you implement
// any abstract methods from the AbstractClass and implement all method definitions
// from the InterfaceClass
public class Foo extends AbstractClass implements InterfaceClass { ... }
1
digiarnie

Non, vous ne créez pas l'instance de votre classe abstraite ici. Vous créez plutôt une instance d'une sous-classe anonyme de votre classe abstraite. Et ensuite, vous appelez la méthode sur votre référence de classe abstraite pointant sur un objet de sous-classe.

0
Peraiah Karanam

Vous ne pouvez pas instancier la classe abstraite ou une interface - vous pouvez instancier une de leurs sous-classes/implémenteurs

Vous ne pouvez pas instancier une classe abstraite ou une interface, vous ne pouvez instancier qu'une de leurs classes dérivées.

Dans votre exemple

 MyAbstractClass ABC = new MyAbstractClass("name") {
    };

Vous instanciez n'importe quelle classe qui implémente Suprising

0
AnonDCX