Classes internas locais de métodos

Oi

quem não tiver estudando pra prova, deve ter tomado um susto com o titulo desse post. :slight_smile:

Seguinte, o que acontece com o código abaixo e pq???

class myOuter2 {
  private String x = "outer2";
  void doStuff() {
    String z = "variavel local"
    class myInner {
      public void seeOuter() {
        System.out.println("Outer x é " + x);
        System.out.println("Variavel Local z é " + z);
      }
    }
  }
}

Ae, não vale explicação do tipo, é assim pq tem que ser hein… :twisted:

T+

nao acontece nada, pois nao ah nenhuma instancia pra classe interna… mas se houvesse acho q seria normal, como se estivesse instanciando uma classe interna na classe, soh q no metodo :wink:

Lembro desse exemplo no livro da Katia…

Então… vai dar erro de compilação:

String z = "variavel local";

Faltou um ;… brincadeira…

O erro será causado porque quando uma classe é definida dentro de um método ele não tem acesso as váriaveis locais (neste caso z), há não ser que ela seja declarada final…

Oi

JavaTeco, po, eu esqueci do ponto e virgula mesmo, mas não é ele o problema mesmo não…

O correto é o que o JavaTeco disse, alguém entendeu?

T+

devagar! devagar! … eu não to no capítulo de Collections ainda… heheheah :lol:

eu entendi mais ou menos, se o Java Teco ou Jeveaux ou o Felipe puderem explicar melhor!

Agradeço!

até mais!

Tudo bem?

Vamos lá…
Regra 1: A classe declarada dentro do método só é visivel dentro dele.
Regra 2: A classe declarada dentro do método só pode acessar atributos com escopo de classe, ou atributos declarados dentro do método, mas este deve ser final e por último, pode tb acessar os parâmetros do método, deste que sejam finais.

A regra 1 é bem óbvia. É como o conceito de escopo de método, ou seja, se ela foi declarada dentro do método só vai existir lá dentro.

Agora a regra 2, tem que pensar um pouco mais… Vou dar um exemplo (que é baseado no livro da Katia, Certificação). Imagine o seguinte, vc tem um objeto na classe principal (no exemplo do jeveaux é o myOuter2). Vc pode acessar este objeto na classe declarada dentro do método (conforme regra 2). Agora imagine dentro do método (no qual foi declarada a classe) tivesse um outro objeto, e este consequentemente pudesse ser atribuído ao objeto de foi declarado na classe principal. O que ia acontecer é que, quando o método fosse finalizado a referência para o objeto declarado dentro dele tb ia pro “espaço”, consequentemente o objeto da classe principal que o recebeu teria uma referência inválida… por isso que que existe a regra 2.

Tentei ao máximo ser bem objetivo… :wink:

poo,

legal kra, agora acho que consegui entender bem esse esquema ai das innerClass. eu tava lendo The Complete Java 2 : Certification Study Guide, e la tem um exemplo um pouco diferente, agora me respondam, já que essa classe foi declarada dentro de um método, como eu faço se eu quizer instanciar um objeto dessa classe???

quando eu executar esse método ele ja vai instanciar um objeto da classe myInner???

cya!

Pessoal,

se puderem deem uma olhada aqui nesse link
http://www.jspbrasil.com.br/conteudo/certificacao/pinnerclasses.pdf

no final da pagina 3 e no começo da 4 tem um codigo, e ele está printando a variável “a” na linha 15 a qual eh membro da classe outer, e declarada como public. Como o Jeve falou nao teria que ser Final???

estou criando uma confusao na minha cabeça eu acho! =) hahaha

que coisa!

cya!!

[quote=“jujo”]poo,

legal kra, agora acho que consegui entender bem esse esquema ai das innerClass. eu tava lendo The Complete Java 2 : Certification Study Guide, e la tem um exemplo um pouco diferente, agora me respondam, já que essa classe foi declarada dentro de um método, como eu faço se eu quizer instanciar um objeto dessa classe???

quando eu executar esse método ele ja vai instanciar um objeto da classe myInner???

cya![/quote]

Quando o método for chamado ele não vai instânciar a classe (é como qualquer outra classe, com algumas restrições)… Pra vc instânciar a classe é como as outras, podemos apenas ser instânciada dentro do método…

[quote=“jujo”]Pessoal,

se puderem deem uma olhada aqui nesse link
http://www.jspbrasil.com.br/conteudo/certificacao/pinnerclasses.pdf

no final da pagina 3 e no começo da 4 tem um codigo, e ele está printando a variável “a” na linha 15 a qual eh membro da classe outer, e declarada como public. Como o Jeve falou nao teria que ser Final???

estou criando uma confusao na minha cabeça eu acho! =) hahaha

que coisa!

cya!![/quote]

O atributo “a” pode ser utilizado, pois está no escopo da classe principal (a classe ClasseExterna) sem utilizar o modificador final.