2011-07-02 31 views
10

En Java, no puedo crear instancias de clases abstractas. Entonces, ¿por qué no eclipse gritar sobre el siguiente código?Java: variables finales en las clases abstractas

public abstract class FooType { 
    private final int myvar; 

    public FooType() { 
     myvar = 1; 
    } 
} 
+0

¿Por qué crees que debería "gritar" en primer lugar? – aps

+0

@aps líneas rojas debajo del lugar crítico (la asignación en el constructor, o el propio constructor) – imacake

Respuesta

13

El código está bien, la variable final se inicializa en el constructor de FooType.

No puede crear instancias FooType porque es abstracto. Pero si crea una subclase no abstracta de FooType, se llamará al constructor.

Si no tiene una llamada explícita al super(...) en un constructor, el compilador de Java lo agregará automáticamente. Por lo tanto, se garantiza que se llame a un constructor de cada clase en la cadena de herencia.

0

Puede crear subclases concretas de FooType y todas tendrán un campo final llamado myvar.

BTW: A public constructor en una clase abstracta es lo mismo que protected, ya que solo se puede invocar desde una subclase.

¿Cuál es su duda?

+0

Ah, es por eso que el eclipse se lo come. Mira, quería hacer una biblioteca de iconos en contexto estático. Pero quería cargar el disco, por lo que no puedo usar final y estático de una vez. – imacake

+0

No estoy seguro de cuál es el problema. Puede hacer una referencia a un objeto que carga desde el disco estático y final. –

3

Puede tener constructores, métodos, propiedades, todo en clases abstractas que puede tener en clases no abstractas también. Simplemente no puedes instanciar la clase. Entonces no hay nada de malo en este código.

En una clase derivada puede llamar al constructor y establezca la propiedad definitiva:

public class Foo extends FooType 
{ 
    public Foo() 
    { 
    super(); // <-- Call constructor of FooType 
    } 
} 

si no se especifica una llamada a super(), que se insertará todos modos por el compilador.

0

Ok. Mira, una clase abstracta puede tener un constructor. Siempre está ahí, implícito o explícito. De hecho, cuando creas un objeto de una subclase de una clase abstracta, lo primero que hace el constructor de la subclase es llamar al constructor de su superclase abstracta usando super(). Simplemente se entiende, es por eso que no tiene que escribir super() explícitamente a menos que use constructores parametrizados. Cada clase, incluso si es abstracta, tiene un constructor implícito que no puede ver. Se llama a menos que crees un constructor propio. siempre que creó clases abstractas sin crear ningún constructor personalizado en ella, por lo que no sabía acerca de la existencia del constructor implícito.

0

No, no puede declarar las variables finales dentro de una clase abstracta. Ver ejemplo siguiente.

public abstract class AbstractEx { 
    final int x=10; 
    public abstract void AbstractEx(); 
} 

public class newClass extends AbstractEx{ 

    public void AbstractEx(){ 
     System.out.println("abc"); 
     } 
    } 

public class declareClass{ 
    public static void main(String[] args) { 
     AbstractEx obj = new newClass(); 
     obj.AbstractEx(); 
     // System.out.println(x); 
    } 
} 

Este código se ejecuta correctamente y producir como salida

abc

Pero si quitamos comentario símbolo de

System.out.println (x);

producirá el error.

Cuestiones relacionadas