¿Alguien sabe por qué puede hacer referencia a un static método en la primera línea del constructor utilizando this() o super(), pero no es un método no estático?

Considerar el siguiente trabajo:

public class TestWorking{
    private A a = null;
    public TestWorking(A aParam){
       this.a = aParam;
    }

    public TestWorking(B bParam)
    {
        this(TestWorking.getAFromB(bParam));
    }

    //It works because its marked static.
    private static A getAFromB(B param){
        A a = new A();
        a.setName(param.getName());
        return a;
    }
}

Y la siguiente No-ejemplo de Trabajo:

public class TestNotWorking{
    private A a = null;
    public TestNotWorking(A aParam){
       this.a = aParam;
    }

    public TestNotWorking(B bParam)
    {
        this(this.getAFromB(bParam));
    }

    //This does not work. WHY???
    private A getAFromB(B param){
        A a = new A();
        a.setName(param.getName());
        return a;
    }
}
  • Éste podría ser el código de ejemplo pero una inquietud que me gustaría tener acerca de este código es que usted tiene la lógica de la construcción de una A instancia de un B instancia enterrado en una tercera clase TestNotWorking.
  • Estoy de acuerdo con tu inquietud. La razón por la que estoy haciendo esto de esta manera es la siguiente: estoy utilizando una tercera parte de la API que ha limitado la capacidad de una clase y la clase está marcada final. La única forma era clonar el objeto original y el trabajo en la copia. He utilizado el objeto original como el parámetro para mi nuevo objeto. Para el propósito del ejemplo que he modificado un poco.
  • ¿Por qué es de extrañar que TestNotWorking.getAFromB(bParam) no funciona? es el método de instancia. usted debe crear el objeto o el uso de este.
InformationsquelleAutor Koekiebox | 2010-09-10

6 Comentarios

  1. 16

    Métodos no estáticos son los métodos de instancia. Esto sólo son accesibles en la instancia existente, y de la instancia no existe sin embargo, cuando usted está en el constructor (que aún está en construcción).

    Por qué es así? Debido a que los métodos de instancia puede instancia de access (no estático) de los campos, que pueden tener diferentes valores en diferentes instancias, por lo que no tiene sentido llamar a este método en algo más que los existentes, terminado instancia.

    • Esto está cerca, pero no exacto. Las instancias de hacer existen cuando usted está en un constructor, y puede invocar métodos de instancia en ellos. Pero, usted no puede hacerlo hasta que la super-clase’ constructor ha completado. Si desea invocar dentro de su propio constructor, que está bien, pero la super clase tiene que ser terminado.
    • Esto no es una respuesta exacta. Comentar también que no obtenga el punto totalmente, porque la pregunta no es acerca de llamar a super constructor, pero el constructor de la misma clase del curso es también porque necesitamos súper llamada al constructor de primera, pero la respuesta de comentario y no lo ponen claramente.
    • Lo que acerca de este código? clase ClassForTest{ ClassForTest(int k){ }; { método(); } ClassForTest(){ this(1); }; int metodo(){return 1;} }
    • cuando puedo modificar el código como este puedo obtener esta excepción «No puede referirse a una instancia de campo de la prueba, mientras que invocar explícitamente un constructor de» clase pública ClassForTest { int test=0; ClassForTest(int k) { } { método(); } ClassForTest() { this(test);//No se puede hacer referencia a una instancia de campo de la prueba, mientras que invocar explícitamente un constructor } int metodo() { return 1; } public static void main(String[] args) { new ClassForTest(); } }
    • lo que has dicho es cierto, pero ¿por QUÉ? quiero decir, ¿por qué es diseñado de forma que después de las variables de estado pueden ser contemplados después de la superclase constructor de invocación, pero no antes? ¿Cuál es la razón detrás? Usted afirma que las instancias que existen en el constructor, así que ¿en qué momento es la instancia creada?
    • Creada la instancia (es decir, el espacio es asignado) en primer lugar, a continuación, los constructores con el fin de Object a la mayoría de los derivados de la subclase. Si los métodos podrían ser invocados ante la superclase’ constructor completado, podría operar en el parcialmente inicializa los campos, lo que podría violar las condiciones esperadas.

  2. 12

    Ver el Java Lenguaje De Especificación De 8.8.7.1. Esto indica que

    Un constructor explícito invocación declaración de un constructor del cuerpo no puede referirse a cualquiera de las variables de instancia o métodos de instancia o interior de las clases declaradas en esta clase o de cualquier superclase, o el uso this o super en cualquier expresión; de lo contrario, un error en tiempo de compilación se produce.

    Esto es debido a que no se puede llamar a un método de instancia antes de creada la instancia. Por el camino, es posible llamar a un método de instancia más tarde en el constructor (aunque no es una solución para usted).

    • o el uso de este o super en cualquier expresión; de lo contrario, un error en tiempo de compilación se produce por favor aclarar
    • esto significa que se crea la instancia en la pila después de que el explícito/implícito constructor de la superclase invocación que se hace, aunque su inicialización no se ha completado todavía?
    • no, no es así. El montón se ha creado el objeto antes de que cualquiera de los constructores se invoca.
  3. 1

    Yo creo que es porque en última instancia las variables no se han definido todavía (por lo que no han instancia aún) y un método de instancia podría acceder a uno. Mientras que todos los inicialización estática ha sido hecho antes de la llamada al constructor.

    Saludos,
    GHad

  4. 1

    porque al llamar a esta o super en el constructor el objeto no es construido todavía. (la instancia no está inicializado completamente todavía). por lo que llamar a un método de instancia no hacer la escena.

  5. 1

    TestNotWorking no está inicializado en ese punto. El problema es: el primer constructor (TestNotWorking(Un aParam)) podría ser la llamada a super() (internamente siempre lo hace), lo que significa que podría llamar a un método antes de que el constructor de la superclase se invoca. Eso es ilegal.

  6. 0

    Si un método no estático, a continuación, usted debe llamar en un objeto.

    En el segundo ejemplo que usted necesita para crear un objeto de la clase TestNotWorking y llame a getAFromB en ese objeto.

    Algo como:

    object = new TestNotWorking();
    object.getAFromB(bParam);

Dejar respuesta

Please enter your comment!
Please enter your name here