Dúvidas com Protected e Classes

Ola, estou com algumas dúvidas…
a primeira é sobre protected…
quando eu devo usar protected??? eu pensei que protected em um método é quando esse método vai ser protegido para sua classe e para as classes que extende-la…
mas fiz os testes e percebi que mesmo eu NAO extendendo a classe a tornando minha super-classe, eu consigo usar o método protected da outra classe…

entao pra que serve o protected?? o private e public eu sei, mas o protected eu nao entendi o porque…

sobre classe… eu tenho um arquivo chamado Teste e dentro dele eu tenho duas classes

public class Teste {
	public static void main(String args[]) {
		Teste2 t = new Teste2();
		t.a();
	}
}
class Teste2 {
  public void a() {
		System.out.println("A");
	}
}

funciona normal…

mas eu posso por o Class Teste2 dentro do Teste, ou seja, criar uma classe dentro da outra… unica coisa que vou precisar fazer é criar um construtor pois dentro do método statico eu nao posso chamar a outra classe dentro da minha classe.
ae fica assim:

public class Teste {
	public Teste() {
		Teste2 t = new Teste2();
		t.a();
	}
	public static void main(String args[]) {
		new Teste();
	}
  class Teste2 {
    public void a() {
  		System.out.println("A");
  	}
  }
}

quando eu coloco uma classe dentro da outra ela vira como um método? ou seja, dentro de métodos staticos eu nao posso chamar ela??

qual a vantagem de usar classe dentro de classe… alguem poderia me dar uma breve explicação por favor??

Obrigado

Quando vc tem um metodo/variavel protected nao quer dizer que ele será exergado apenas na classe que extende dela. Podemos dizer que é a mesma coisa que private. No entanto, o private só fica disponível na classe que foi declarado, enquanto que o protected, além de ficar disponível para a classe que é criado, também estará disponível nas classes subsequentes (que herdam) da classe base.

[]s, Welington B. Souza

as classes do mesmo pacote podem acessar os membros protected de outra classe

só se for algum bug na JVM por que pela especificação, estes metodos não devem ser visiveis no pacote, somente na propria classe e seus descendentes :slight_smile:

fala urubatan! :slight_smile:

entao
nao eh bug nao
eh assim mesmo
protected, por definicao, tambem eh visivel dentro do mesmo pacote
boa notie e amanha nos vemos no justjava!

Tranquilo :slight_smile:
este gprs que to usando ta muito lento perto do ADSL :slight_smile:

seguinte, vou até dar uma olhada na especificação da linguagem, mas se é assim mesmo, só o java que é assim, em todas as outras que conheço é como eu falei antes, só a classe e os descendentes :slight_smile:

mas vou olhar só quando chegar em casa na quarta, por que pelo celular não vai rolar :slight_smile:

To desconectando, até amanha no JustJava :slight_smile:

o Silveira tem razão, em java as classes do mesmo pacote acessam membros protected de classes pertencentes ao mesmo pacote sim…

(removido)

[quote=marcos.ribeiro]Ola, estou com algumas dúvidas…
a primeira é sobre protected…
quando eu devo usar protected??? eu pensei que protected em um método é quando esse método vai ser protegido para sua classe e para as classes que extende-la…
mas fiz os testes e percebi que mesmo eu NAO extendendo a classe a tornando minha super-classe, eu consigo usar o método protected da outra classe…
entao pra que serve o protected?? o private e public eu sei, mas o protected eu nao entendi o porque…
[/quote]

Lembre-se que o nivel padrão de visibilidade é pacote. Por isso que não ha uma palavra especial para esse nivel.
Quando vc cria uma classe publica com métodos de pacote esses métodos não serão visiveis fora do pacote.
Quando vc estender essa classe, se vc quer métodos que possam ser visiveis pela sub-classe , mesmo ela estando noutro pacote, mas ao mesmo tempo vc não quer que eles sejam publicos, então eles são protegidos.

Porque “protegidos” ? Porque eles não são publicos. Eles são visiveis apenas por classes do mesmo pacote e por classes da mesma hierarquia.

Private : Visivel Onde declarados , Não Visivel pelo pacote , Não Visivel pela hierarquia , Não Visivel fora do pacote e da hierarquia

(default) : Visivel Onde declarados , Visivel pelo pacote , Não Visivel pela hierarquia , Não Visivel fora do pacote e da hierarquia

Protected : Visivel Onde declarados , Visivel pelo pacote , Visivel pela hierarquia , Não Visivel fora do pacote e da hierarquia

Public : Visivel Onde declarados , Visivel pelo pacote , Visivel pela hierarquia , Visivel fora do pacote e da hierarquia

Private é uma restrição especial do nivel padrão (pacote) e protected é uma restrição especial do nivel publico

(p.s. tem um jeito simples de fazer tabelas ? )

Sim… o Silveira tem razão, a visibilidade de menbros protected são para as proprias classes, classes filhas e classes do mesmo pacote. Isso é questão de certificação =P

Quanto a essa abordagem, bate com o Urubatan, eu considero uma falha de Java tratar o protected dessa maneira, pq com isso vc pode quebrar o encapsulamento, e como ngm quer fazer isso acaba q membros protected são evitados e esse modificador muitas vezes perde seu sentido. Se ele se aplicasse apenas as proprias classes e classes filhas seria muito interessante.

Voltando a pergunta principal. Quando usar protected.

Costumo usar protected em membros (métodos ou atributos) que devem ser herdados, qd as classes filhas tem autoridade para saber da existência deles. O pessoal está muito bitolado a definir q variável de instancia eh private para se ter encaspulamento e esquecem o protected. Dai classes filhas q teriam total propriedade para conhecer determinados membros, perdem esse direito tendo q ter acesso via get e set.

Para exemplificar umj atributo nome da classe Pessoa, deveria ser protected, daí a classe Cliente q herda de Pessoa teria acesso direto. Afinal cliente TEM um nome! Deve haver henraça sim, caso seja private não haverá herança e o acesso terá q ser dado por get e set.

O pecado do protected de Java é aquele mesmo, daí algumas pessoas justificam com isso o eterno uso dos privates. Porém ainda há uma defesa =P Normalmente classes q ficam no mesmo pacote só quem tem acesso é vc ou alguem do seu grupo de desenvolvimento. Se vc destribui uma framework ou biblioteca ngm poderá botar classes nos seus pacotes e quebrar o encapsulamento pq vc usou protected. Bem… essa eh minha opinião. Quem tiver outras bota ai q a gente discute. Sempre quisa saber opiniões dos demais sobre esse assunto.

[]´s