Tecnicamente a documentacao diz o q vc falou, BUT...

Erro no meu compilador (1.2.2 - JDK, Sun Microsystems) no teu programa:

pacote2\ClasseFilha.java:19: No method matching 
printProtected(java.lang.String) found i
n class pacote2.ClasseFilha.
             printProtected("chamando 'printProtected'na Inner Class em 
filha");

                           ^
1 error

Estranho... :-) Tvz isso soh se aplike ao 1.3.x ou superior. Acredito q seja 
um bug nas versoes anteriores, pq segundo o q eu tb entendo deveria 
compilar, mas jah faz 6 meses q venho encontrando esses problemas com o 
1.1.x e o 1.2

Sobre meu exemplo original:

No compilador q vem com o VisualAge 3.02, dah os erros q eu falei (1.1.x)...
No meu JDK 1.2, daki de casa, tb dah pau...

Alguem podia tentar compilar meu codigo no 1.3???
Pai.java

package pai;

public class Pai {
   protected void algo() {
   }
}

*********************************************************

Filho.java

package filho;

import pai.*;

public class Filho extends Pai {
   private class InnerClass {
      public InnerClass() {
         algo(); //ERRO DE VISIBILIDADE DE ACESSO!!!!!!!!
      }
   }
}

>From: [EMAIL PROTECTED]
>Reply-To: [EMAIL PROTECTED]
>To: [EMAIL PROTECTED]
>Subject: Re: RES: [java-list] Basico de OO em JAVA - CUIDADO MESMO!!!!
>Date: 6 Jul 2001 07:38:34 -0700
>
>ou eu nao entendi o que vc esta querendo dizer, ou voce cometeu um pequeno 
>engano.
>uma Inner Class pode chamar metodos protected da super class da classe 
>container, acho que sempre pode,
>desde a introducao de Inner Classes (JDK 1.1, nao lembro mais ??, mas posso 
>estar errado nesse ponto).
>
>o exemplo abaixo compila e executa sem erros. usei JDK 1.3.1
>os .java estao no zip.
>
>/*
>  * ClasseMae.java
>  *
>  * Created on July 6, 2001, 9:46 AM
>  */
>
>package pacote1;
>
>/**
>  *
>  * @author  SLD
>  * @version
>  */
>public class ClasseMae {
>
>     /** Creates new ClasseMae */
>     public ClasseMae() {
>     }
>
>     public void printPublic(String s) {
>         System.out.println(s);
>     }
>
>      protected void printProtected(String s) {
>         System.out.println(s);
>     }
>
>     void printPackage(String s) { // package
>         System.out.println(s);
>     }
>
>     private void printPrivate(String s) {
>         System.out.println(s);
>     }
>}
>
>
>/*
>  * ClasseFilha.java
>  *
>  * Created on July 6, 2001, 9:46 AM
>  */
>
>package pacote2;
>
>/**
>  *
>  * @author  SLD
>  * @version
>  */
>public class ClasseFilha extends pacote1.ClasseMae {
>
>     /** Creates new ClasseFilha */
>     public ClasseFilha() {
>         printPublic   ("chamando 'printPublic'    na classe filha");
>         printProtected("chamando 'printProtected' na classe filha");
>         // printPackage  ("chamando 'printPackage'   na classe filha");  
>// Erro pq eh de outro pacote
>         // printPrivate  ("chamando 'printPrivate'   na classe filha");  
>// Erro pq eh privada na ClasseMae
>
>         InnerClass1 inc = new InnerClass1();
>     }
>
>
>     private class InnerClass1 {
>         public InnerClass1() {
>             printPublic   ("chamando 'printPublic'    na Inner Class em 
>filha");
>             printProtected("chamando 'printProtected' na Inner Class em 
>filha");
>             // printPackage  ("chamando 'printPackage'   na Inner Class em 
>filha"); // Erro pq eh de outro pacote
>             // printPrivate  ("chamando 'printPrivate'   na Inner Class em 
>filha"); // Erro pq eh private na CLasse Mae
>         }
>     }
>
>     public static void main(String[] s) {
>         ClasseFilha cf = new ClasseFilha();
>     }
>
>}
>
>
>
>On Fri, 06 July 2001, "Michael Santos" wrote:
>
> >
> > Desculpe se vc se sentiu ofendido, mas perguntei qdo vc se certificou pq
> > antes da mudanca de outrubro (ou sera setembro?), todas as perguntas da
> > certificacao NAO DIZIAM QTAS OPCOES ESTAVAM CERTAS e pra mim cairam duas
> > perguntas ressaltando este ponto de acesso a private members.
> >
> > Perguntei qdo pq acho q vc deve ter tirado depois disso e tvz isso tenha
> > feito com q o fato de vc desconhecer este ponto sobre private nao tenha 
>tido
> > tanto peso qto deveria... Isso nao eh bem um erro de compilacao, pq pode
> > levar a erros de modelagem e analise (nao sei se eh isso q vc faz). Se 
>vc
> > quiser ser analista OO, precisa conhecer estes pontos...
> >
> > Mais uma curiosidade pra lista: protected eh uma caixinha de surpresas 
>tb.
> > VC aprende desde o tutorial da Sun: protected permite q as subclasses e 
>as
> > classes do mesmo pacote chamem o metodo. Entao em:
> >
> > package pai;
> >
> > public class Pai {
> >    protected void algo() {
> >    }
> > }
> >
> > package filho;
> >
> > import pai.*;
> >
> > public class Filho extends Pai {
> >    private class InnerClass {
> >       public InnerClass() {
> >          algo(); //ERRO DE VISIBILIDADE DE ACESSO!!!!!!!!
> >       }
> >    }
> > }
> >
> > class OutraClasse {
> >    public void algumMetodo() {
> >       Filho f = new Filho();
> >       f.algo(); //ERRO DE VISIBILIDADE DE ACESSO!!!!!!!!
> >    }
> > }
> >
> > vc nao espera q ocorram estes erros de compilacao. O segundo, da
> > OutraClasse, parece ateh aceitavel, jah q um metodo protected soh pode 
>ser
> > chamado por outra classe do pacote ONDE ELE FOI DEFINIDO (ninguem fala 
>isso
> > com estas palavras). Agora, esse primeiro, no qual uma InnerClass NAO
> > CONSEGUE CHAMAR UM METODO PROTECTED DA SUPERCLASSE DA OUTERCLASS parece
> > muito bizarro, jah q vc aprende q todos os metodos da outer class 
>(Filho)
> > sao visiveis a InnerClass e algo() eh um metodo da classe Filho por
> > heranca...
> >
> > Bastante bizarro... Mas a solucao pra essa aberracao eh bem simples:
> >
> > package pai;
> >
> > public class Pai {
> >    protected void algo() {
> >    }
> > }
> >
> > package filho;
> >
> > import pai.*;
> >
> > public class Filho extends Pai {
> >    protected void algo() {
> >       super.algo();
> >    }
> >
> >    private class InnerClass {
> >       public InnerClass() {
> >          algo(); //COMPILA PERFEITAMENTE!!!!!!!!
> >       }
> >    }
> > }
> >
> > class OutraClasse {
> >    public void algumMetodo() {
> >       Filho f = new Filho();
> >       f.algo(); //COMPILA PERFEITAMENTE!!!!!!!!
> >    }
> > }
> >
> > Coisas do Java... Acho q vou traduzir e mandar pro Java Pitfalls da
> > JavaWorld... :-P
> >
> > ----------------------------------------------------
> > Michael Nascimento Santos
> > Sun Certified Programmer for the Java 2 Platform
> > Analista/Consultor
> > Moderador SouJava - www.soujava.org.br
> > CPM Sistemas - www.cpm.com.br
> >
> > >From: "Edson Tirelli" <[EMAIL PROTECTED]>
> > >Reply-To: [EMAIL PROTECTED]
> > >To: <[EMAIL PROTECTED]>
> > >Subject: RES: [java-list] Basico de OO em JAVA - CUIDADO MESMO!!!!
> > >Date: Thu, 5 Jul 2001 17:41:15 -0300
> > >
> > >
> > >    Uuups... q viagem... foi mal por essa...
> > >    Valeu pelo exclarecimento. Como vc pode ver, nunca tinha precisado
> > >disso
> > >antes. Vou passar a testar o codigo antes de enviar. :P
> > >
> > >    Quanto a minha certificacao, garanto q vale tanto quanto a de qq 
>um. Eh
> > >um pedaco de papel q diz q passamos numa prova. Agora na hora do 
>trabalho
> > >serio, nao eh ela q vai entregar o sistema funcionando e dentro do 
>prazo...
> > >erro de compilacao se resolve em 30 segundos... erro de logica e 
>modelagem,
> > >eh outra historia...
> > >
> > >    Abraco,
> > >       Edson
> > >
> > >  ---
> > >  Edson Tirelli
> > >  System Analyst
> > >  Microsoft Certified Professional
> > >  Sun Certified Programmer for Java 2 Platform
> > >  try Automatos @ www.automatos.com
> > >
> > >
> > > > -----Mensagem original-----
> > > > De: Michael Santos [mailto:[EMAIL PROTECTED]]
> > > > Enviada em: quinta-feira, 5 de julho de 2001 16:45
> > > > Para: [EMAIL PROTECTED]
> > > > Assunto: RES: [java-list] Basico de OO em JAVA - CUIDADO MESMO!!!!
> > > >
> > > >
> > > > Acho q seu compilador foi escrito pela Microsoft, meu camarada... 
>:-P
> > > > Isto nao compila nem aki nem na China, tenho certeza absoluta...
> > > > Nao preciso
> > > > nem testar, se vc tem:
> > > >
> > > > public class A {
> > > >   private int x;
> > > > }
> > > >
> > > > public class B extends A {
> > > >   public B() {
> > > >      x = 1;
> > > >   }
> > > > }
> > > >
> > > > e tentar compilar, vc vai receber ou "undefined variable: x" ou
> > > > "variable x
> > > > is not visible to B" ou alguma coisa assim...
> > > > A resposta anterior eh correta...
> > > >
> > > > Qdo vc se certificou?????????????
> > > >
> > > > ----------------------------------------------------
> > > > Michael Nascimento Santos
> > > > Sun Certified Programmer for the Java 2 Platform
> > > > Analista/Consultor
> > > > Moderador SouJava - www.soujava.org.br
> > > > CPM Sistemas - www.cpm.com.br
> > > >
> > > >     From: "Edson Tirelli" <[EMAIL PROTECTED]>
> > > > Reply-To: [EMAIL PROTECTED]
> > > > To: <[EMAIL PROTECTED]>
> > > > Subject: RES: [java-list] Basico de OO em JAVA - CUIDADO
> > > > Date: Thu, 5 Jul 2001 11:49:59 -0300
> > > >
> > > >
> > > >     Amigos,
> > > >
> > > >     Este assunto inclusive circulou aqui na lista a um tempo atras. 
>Eh
> > >um
> > > > erro comum q eu tambem cometia no inicio, mas eh importante 
>exclarecer:
> > >os
> > > > modificadores de acesso limitam o ACESSO EXTERNO aos atributos  da
> > >classe,
> > > > mas NAO LIMITAM A HERANCA.
> > > >     Isso quer dizer q se uma classe eh FILHA de outra, ela vai 
>HERDAR
> > >TUDO
> > > > da classe MAE, podendo eventualmente sobrescrever algumas coisas 
>(por
> > > > exemplo, o q NAO estiver definido como "final" na classe mae).
> > > >     Assim, no exemplo citado pelo colega:
> > > >
> > > > public class Mae {
> > > >     private   int x;
> > > >     protected int y;
> > > > }
> > > >
> > > > public class Filha extends Mae {
> > > >     // A FILHA HERDA O ATRIBUTO PRIVADO "X" E O ATRIBUTO PROTEGIDO 
>"Y"
> > > >     public Filha() {
> > > >        x = 50;  // PERFEITAMENTE CORRETO
> > > >        y = 100; // PERFEITAMENTE CORRETO
> > > >     }
> > > > }
> > > >
> > > >      Pra tentar exclarecer o modificador private, observe essa nova
> > > > implementacao abaixo:
> > > >
> > > > public class Filha extends Mae {
> > > >     // A FILHA HERDA O ATRIBUTO PRIVADO "X" E O ATRIBUTO PROTEGIDO 
>"Y"
> > > >     public Filha() {
> > > >        x = 50;  // PERFEITAMENTE CORRETO
> > > >        y = 100; // PERFEITAMENTE CORRETO
> > > >     }
> > > >
> > > >     public void m() {
> > > >         Mae amae = new Mae();
> > > >         amae.x = 30;     // ERRO DE COMPILACAO -> x eh atributo 
>privado
> > >de
> > > > Mae
> > > >         amae.y = 20;     // CORRETO -> y eh atributo protegido de 
>Mae
> > > >
> > > >         this.x = 50;     // CORRETO -> atributo x herdado
> > > >         this.y = 60;     // CORRETO -> atributo y herdado
> > > >     }
> > > > }
> > > >
> > > >      Observe q a diferenca entre atributos privados e protegidos eh 
>q os
> > > > atributos protegidos permitem o ACESSO EXTERNO quando o objeto q 
>estiver
> > > > fazendo o acesso for de uma classe FILHA ou DO MESMO PACOTE q a 
>classe q
> > > > contem o atributo.
> > > >
> > > >      Espero ter exclarecido, mais do que complicado... :)
> > > >
> > > >      Abraco,
> > > >          Edson
> > > >
> > > > ---
> > > > Edson Tirelli
> > > > System Analyst
> > > > Microsoft Certified Professional
> > > > Sun Certified Programmer for Java 2 Platform
> > > > try Automatos @ www.automatos.com
> > > >
> > > >
> > > >
> > > > -----Mensagem original-----
> > > > De: Alexandre Nóbrega Duarte [mailto:[EMAIL PROTECTED]]
> > > > Enviada em: quinta-feira, 5 de julho de 2001 08:10
> > > > Para: [EMAIL PROTECTED]
> > > > Assunto: Re: [java-list] Basico de OO em JAVA
> > > >
> > > >
> > > > Acho que o que voce quer fazer e isso.
> > > >
> > > >
> > > > public class Mae {
> > > >
> > > >     private int atributo;
> > > >
> > > >     public Mae(){
> > > >
> > > >     }
> > > >
> > > > }
> > > >
> > > >
> > > > public class Filha extends Mae {
> > > >
> > > >     public Filha() {
> > > >         atributo = 0;
> > > >     }
> > > > }
> > > >
> > > > Se for isso, eh impossivel, mas voce pode contornar este problema
> > > > fazendo o
> > > > atributo protected ao inves de private. Dessa forma ele continua a 
>ser
> > > > privado para quem esta de fora da classe mas fica publico para as
> > >classes
> > > > filhas.
> > > >
> > > >
> > > >
> > > > public class Mae {
> > > >
> > > >     protected int atributo;
> > > >
> > > >     public Mae(){
> > > >
> > > >     }
> > > >
> > > > }
> > > >
> > > > Alexandre Nóbrega Duarte
> > > > Pós-Graduação em Informática
> > > > Departamento de Sistemas e Computação
> > > > Universidade Federal da Paraíba
> > > > ----- Original Message -----
> > > > From: Fabio Ferreira
> > > > To: [EMAIL PROTECTED]
> > > > Sent: Wednesday, July 04, 2001 5:13 PM
> > > > Subject: [java-list] Basico de OO em JAVA
> > > >
> > > >
> > > > Como se "seta" um atributo (private) herdado da classe mae no
> > > > construtor da
> > > > classe filha ?
> > > >
> > > > Fabio Ferreira
> > > >
> > > > 
>________________________________________________________________________
> > 
>_________________________________________________________________________
> > Get Your Private, Free E-mail from MSN Hotmail at 
>http://www.hotmail.com.
> >
> >

_________________________________________________________________________
Get Your Private, Free E-mail from MSN Hotmail at http://www.hotmail.com.


------------------------------ LISTA SOUJAVA ---------------------------- 
http://www.soujava.org.br  -  Sociedade de Usuários Java da Sucesu-SP 
dúvidas mais comuns: http://www.soujava.org.br/faq.htm
regras da lista: http://www.soujava.org.br/regras.htm
para sair da lista: envie email para [EMAIL PROTECTED] 
-------------------------------------------------------------------------

Responder a