Como posso usar uma instância da classe interna de outro método de classe interna?

StackOverflow https://stackoverflow.com/questions/1406525

  •  05-07-2019
  •  | 
  •  

Pergunta

public class Ex7 {
    private int fld;

    private void meth(int val) {
        fld = val;
        System.out.println(" meth() -> fld = " + fld);
    }

    public class Ex7Inner1 {
        void operateOnFld() {
            fld = 12;
        }

        void operateOnMeth() {
            meth(10);
        }

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

    class Ex7Inner2 {
        Ex7Inner1 i1 = new Ex7Inner1();
        // how to call i1.bar() ??
        i1.bar();
    }
}
Foi útil?

Solução

Seu problema é que você precisa i1.bar() chamada dentro de uma função. Por exemplo

class Ex7Inner2 {
    Ex7Inner1 i1 = new Ex7Inner1();  // this is now a field of the Ex7Inner2 class
    public void callBar() {
        i1.bar();                    // this will work
    }
}

No futuro, você pode achar que as pessoas são capazes de ser mais útil se você incluir o erro que você começa na sua pergunta, o que eu vou fazer agora. Quando você tenta compilar o código do seu jeito, você receber um erro que se parece com

Ex7.java:26: <identifier> expected
  i1.bar();
        ^
1 error

Este é porque a única coisa que você pode fazer fora de um método (como você tinha originalmente) é variáveis ??DECLARAR. Por isso estava esperando um "identificador" por que isso significava "o nome da variável que você está declarando". Então, se você tinha dito

String s;

então s teria sido o identificador.

Outras dicas

Algumas coisas errado aqui;

  • suas necessidades inner2 estar chamando a i1 dentro de uma função
  • desde que você não declarar inner1 estática que necessita uma instância da anexando EX7 de existir.

Assim você pode fazer algo como isto:

public class Ex7 {

    private Ex7Inner1 i1;
    public class Ex7Inner1 {
        public void bar() {
            System.out.println( " bar() " );
        }
    }

    class Ex7Inner2 {
        // how to call i1.bar() ??
        public Ex7Inner2() {
            Ex7.this.i1.bar();
        }
    }
}

Para acessar i1 da EX7.

Onde sua instância EX7 contém um inner1 e um inner2 e sua referência de dentro inner2 é inner2 -> parentEx7 -> inner1 criança.

Se você fizer a estática classe interna pode acabar com a referência EX7, como você está definindo que a classe interna não precisa de uma instância da classe externa de existir.

mas há nenhum método na classe Ex7Inner2. criar método com 'i1.bar ();' chamar dentro e ele compila ok

Ex7Inner1 precisa de uma referência para Ex7, a fim de criar uma instância. De Ex7Inner2 que a referência é Ex7.this.

Assim dizem

Ex7Inner1 i1 = Ex7.this.new Ex7Inner1()

Veja a Java Tutorial de mais informações .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top