2010-12-01 18 views

Respuesta

2

se escribe una clase que deriva de la clase abstracta o implementa la interfaz, y luego instanciar eso.

13

No se puede crear una instancia de una clase abstracta o una interfaz; puede instanciar una de sus subclases/implementadores.

Ejemplos de este tipo son típicos en el uso de Java Collections.

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

Está utilizando el tipo de interfaz List<T> como el tipo, pero la instancia en sí es una ArrayList<T>.

1
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 { ... } 
3
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 
+0

foo() método Suprising en clase abstracta requiere palabra clave abstracto, de lo contrario se lanza error de compilación tiempo. Debería ser como, public abstract void foo(); – user609239

4

Puede proporcionar una implementación como una clase anónima:

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

Del mismo modo, una clase anónima puede extender una clase padre en lugar de implementar una interfaz (pero no puede hacer ambas cosas)

2

"instanciar" significa "crear un objeto de".

Así que no puede crear uno directamente.

El propósito de las interfaces y las clases abstractas es describir el comportamiento de algunas clases concretas que implementan la interfaz o amplían la clase abstracta.

Una clase que implementa una interfaz puede ser utilizada por otro código que solo conozca la interfaz, lo que le ayuda a separar las responsabilidades y tener claro lo que quiere del objeto. (El código de llamada solo sabrá que el objeto puede hacer cualquier cosa especificada en la interfaz, no conocerá ningún otro método que tenga)

Si está utilizando el código de otra persona que espera Fooable (donde ese es el nombre de alguna interfaz), realmente no se te está pidiendo un objeto de alguna clase de Fooable (porque realmente no existe tal clase). Solo se te solicita una instancia de alguna clase que implemente Fooable, es decir, que declare que puede hacer todas las cosas en esa interfaz. En resumen, algo que "puede ser Foo'd".

2

Lo que sabes es correcto. No puede crear un objeto de clase o interfaz abstracta ya que son clases incompletas (la interfaz ni siquiera se considera una clase)

Lo que puede hacer es implementar una subclase de clase abstracta que, por supuesto, no debe ser abstracto. Para la interfaz, debe crear una clase que implemente la interfaz e implemente cuerpos de métodos de interfaz.

Éstos son tutorial original en el sitio de Oracle, http://download.oracle.com/javase/tutorial/java/IandI/abstract.html y http://download.oracle.com/javase/tutorial/java/concepts/interface.html

2

Hay dos maneras de lograr esto.

1) O extiende/implementa la clase/interfaz abstracta en una nueva clase, crea el objeto de esta nueva clase y luego utiliza este objeto según su necesidad.

2) El compilador le permite crear objetos anónimos de las interfaces en su código.

Por ej. (nuevo Runnable() {...});

Espero que esto ayude.

Saludos, Mahendra Liya.

8

Para crear el objeto de una clase abstracta sólo tiene que utilizar nueva al igual que la creación de objetos de otras clases no abstractas con sólo una pequeña diferencia, de la siguiente manera:

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 misma manera puede crear un objeto del tipo de interfaz, tal como sigue:

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(); 
    } 

} 
+10

Eso NO es un objeto de clase abstracta o interfaz. Esa es una clase anónima que extiende (implementa) dicha clase abstracta (interfaz). Enorme diferencia conceptual. – Deltharis

0

no, no puede crear el objeto de una interfaz o clase abstracta debido

La intención principal de crear un objeto es utilizar los datos y los métodos envueltos. Como la interfaz no tiene ninguna implementación concreta, no podemos.

Para la clase abstracta podemos tener un método concreto o un método abstracto, o ambos. No hay forma de que el desarrollador de API restrinja el uso del método que no tiene implementación.

Hope help.

+0

puede crear un objeto de interfaz y clase abstracta utilizando clase anónima; consulte este http://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html – Simmant

+0

que no es un objeto de interfaz o clase abstracta. Es un objeto de dicha clase anónima. – Deltharis

0

No, no está creando la instancia de su clase abstracta aquí. Más bien estás creando una instancia de una subclase anónima de tu clase abstracta. Y luego está invocando el método en su referencia de clase abstracta apuntando al objeto de la subclase.

0

No se puede crear una instancia de la clase abstracta o una interfaz - se puede crear una instancia de una de sus subclases/ejecutores

Usted no puede crear una instancia de una clase abstracta o una interfaz sólo se puede crear una instancia de una de sus clases derivadas.

En su ejemplo

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

Te crear instancias de cualquier clase que implemente

Cuestiones relacionadas