Por exemplo… na herança os campos privates não são herdados, mas por exemplo se eu encapsulo um campo da minha superclass e eu pego essa classe e eu herdo-a.
quando eu usar os métodos publicos de encapsulamento os dados ficao gravados em variaveis declaradas pela classe pai?..
HUm… não sei se vcs entenderam… mas… por exemplo… eu tenho uma classe chamada Animal… ai eu coloco um campo nome e encapsulo. crio os métodos get set e beleza… ai eu herdo essa classe de uma por exemplo… Cachorro… no caso eu precisaria definir de novo um campo nome pra cachorro, ou mesmo eu não tendo o campo nome na classe cachorro… eu posso usar o set get da classe pai…
Valeu!!!
Se vc criar variáveis com visibilidade do tipo privada elas não serão visiveis nas subclasses, mas se vc criar com visibilidade protected a visibilidade nas subclasses (apenas nas subclasses) se torna possível e o problema será resolvido.
Indico uma revisão na parte de visibilidade de atributos.
Bem vindo ao forum!
flws
É como o fantomas falou… contudo caso você queira (ou precise) declarar como private na superclasse, você terá que usar os métodos de acesso para utilizá-las dentro da subclass, mas não haveria a necessidade de declarar outro atributo igual, uma vez que a herança já traz ele para você (só não lhe daria acesso direto, no caso de ser private)…
Abraço!
A ta;; bom… mas se eu colocar o protected eu estarei quebrando o encapsulamento neh… ( a ideia do encapsulamento), mas entendi… quer dizer que mesmo eu não tendo acesso aos campos privados das superclasses eu posso utiliza-los normalmente neh…
mas.
mas por exemplo… eu que criei as classes sei que a superclasse tem os campos e a subclasses herdaram métodos para manipular esses campos… mas… como seria a documentacao dessas classes para um terceiro …???
Tipo … eh implicito que tendo campos get e set eu tenho campos privados em superclasses/? tipo assim???
VALEU PELAS BOAS VINDAS…HAHA ACHO Q VOU FREQUENTAR BASTANTE AQUI E ENCHER O PESSOAL DE PERGUNTAS… PQ ESTOU ESTUDANDO JAVA E A CADA 5 MIM SURGE UM DUVIDA… OBRIGADO…
valeus
AAA outra duvida…
Digamos que eu tenha duas classes
Animal — Cachorro
Sendo a animal subclasse de cachorro…
Animal cao = new Cachorro();
Eu posso instanciar uma variavel cao do tipo Animal com referencia da classe Cachorro. BELEZA
mas
Cachorro dog = new Animal();
Por que eu não posso instanciar uma variável dog do tipo Cachorro com referencia da classe Animal???
eu procurrei isso no meu livro base de pesquisa mas não estou entendendo a resposta…
[quote=itopaulo]A ta;; bom… mas se eu colocar o protected eu estarei quebrando o encapsulamento neh… ( a ideia do encapsulamento), mas entendi… quer dizer que mesmo eu não tendo acesso aos campos privados das superclasses eu posso utiliza-los normalmente neh…
mas.
[/quote]
Não, não, não!!! O encapsulamento continua, a diferença é que alteramos a abrangencia com o protected; o encapsulamento ficou com um formato vertical, com isolamento restrito aos seus subtipos, exemplificando: a variável fica visivel apenas na classe Animal e Cachorro, ninguem mais põe as patinhas nesta variável.
[quote=itopaulo]mas por exemplo… eu que criei as classes sei que a superclasse tem os campos e a subclasses herdaram métodos para manipular esses campos… mas… como seria a documentacao dessas classes para um terceiro …???
[/quote]
Pergunta interessante…quando vc cria métodos publicos para estas variáveis elas se transforma em uma outra coisa chamada propriedade (Property). A documentação pode ser igual da API Java fornecida pela SUN http://java.sun.com/j2se/1.5.0/docs/api/, perceba que os métodos visiveis na documentação são do tipo publicos ou protected (vale também para métodos).
Vale aqui de novo a papo sobre propriedades (Properties).
Métodos publicos que alteram o conteúdo de uma variável privada pode dar a impressão de uma coisa errada e até sem noção, mas não é bem assim; pensando um pouco mais vc irá descobrir que através dos métodos publicos vc permite que o objeto usuário configure este objeto alvo de várias maneiras, e além disso a alteração do conteúdo ( set ) não é de qualquer maneira, vc pode estabelecer critérios no ajuste do dados, por exemplo: não deixar que dados menores que ( < ) zero (0) e maiores ( > ) que 10 sejam colocados na variável.
Exemplo:
public void setIdadeMaxima(final byte idadeMaxima)
if (idadeMaxima < 1 || idadeMaxima > 15) {
throw new IllegalArgumentException("Idade máxima inválida!");
}
this.idadeMaxima = idadeMaxima;
}
flws
[quote=itopaulo]or que eu não posso instanciar uma variável dog do tipo Cachorro com referencia da classe Animal???
eu procurrei isso no meu livro base de pesquisa mas não estou entendendo a resposta… [/quote]
As classes na verdade (no meu entender) são tipos que possuem, alem de outras coisas, uma relação hierarquica por isso o tipo de maior abstração é que define a variavel, neste caso Animal possui um nível de abstração maior que Cachorro, o contrario não é verdadeiro. Isso nos dá uma tremenda vantagem quando programamos de forma orientada a objetos. Por exempo:
for( Animal animal : cachorros ) {
animal.emitirSom();
}
Perceba que não importa qual o tipo de cachorro (chiuaua, poodle, pastor etc…) todos irão emitir o seu som (latido) independente do seu tipo (raça).
Coloque em um post a resposta que vc tem, talvez possamos melhorar o entendimento sobre o assunto.
flws
Puts… esclareceu bem as minhas duvidas… valeu… hhaha pelo menos ate agora… mas agora tenho outra…haha
por exemplo…
vamos la no …
Animal dog = new Cachorro();
o objeto dog… terá todos os comportamentos de Cachorro? mesmo sendo um objeto da classe Animal?
e por exemplo… qual seria o motivo de eu fazer essa abordagem…
instanciar um objeto do tipo Hierarquicamente superior mas referencia-lo com a classe filha?
Desde ja … VALEU fantomas
[quote=itopaulo]o objeto dog… terá todos os comportamentos de Cachorro? mesmo sendo um objeto da classe Animal?
[/quote]
Sim.
[quote=itopaulo]e por exemplo… qual seria o motivo de eu fazer essa abordagem…
instanciar um objeto do tipo Hierarquicamente superior mas referencia-lo com a classe filha? [/quote]
Em OO tem uma coisa chamada abstração e dependendo de como se lida com ela, vc acaba melhorando o entendimento do código e facilitando bastante seus algoritimos em termos de manutenção. Exemplo: Imagine que vc possua vários tipos de animais (Cabrito, Cavalo, Vaca, Boi, Lhama, Carneiro, Jumento e etc…) em um sistema grafico, todos desenhadinhos em um pequeno curral. Em um dado momento vc tem que retirar estes animais do curral, fica bem “simples” vc pegar a lista de animais (afinal são do tipo Animal) e fazer com que eles cominhe, independente de que tipo especifico sejam, para fora do curral.
Exemplo:
for( Animal animal : animais ) {
animal.caminhar(); // Aque em um momento pode ser a vaca, em outro o Jumento, em outro o Frango, ...
}
É claro que o código exemplo é bem simplificado (falta dizer a direção, a velocidade, …) mas dá para perceber o que dá para fazer com isto.
O assunto é extenso, vale a pena pesquisar e verificar outros exemplos.
flws
[quote=itopaulo]Por exemplo… na herança os campos privates não são herdados, mas por exemplo se eu encapsulo um campo da minha superclass e eu pego essa classe e eu herdo-a.
quando eu usar os métodos publicos de encapsulamento os dados ficao gravados em variaveis declaradas pela classe pai?..
[/quote]
Exacto. Repare que a classe declara , como bem disse.
Mas cada objeto tem "fisicamente"todos os atributos de toda a hierarquia da classe que lhe deu origem.
A class declara , o objecto tem.
Só um detalhe da primeira dúvida, que acho que não ficou claro.
Você pode, sim, declarar uma variável privada na classe pai, e acessa-la através de gets e sets na classe filha. E não há necessidade nenhuma de redeclarar essa variável.
O filho irá possuir todas as variáveis do pai, mesmo que não consiga ve-las.
[code]public class Pai {
private String nome;
public Pai(String nome) {
this.nome = nome;
}
public String getNome() {
return nome;
}
}
public class Filho extends Pai {
public Filho(String nome) {
super(nome);
}
public void ImprimirNome() {
return System.out.println(getNome()); //funciona!
}
}
[/code]
Alguns autores até mesmo defendem que todas as propriedades deveriam ser privadas e mesmo classes filhas deveriam fazer acesso indireto dessa forma.
Vlws… todas as respostas me ajudaram muito no meu estudo…hahahh ou melhor estao ajudando … e eu vou continuar e vou continuar perguntando…VALEUUUUUUUUUUU