O private é herdado, mas não é acessível. Se você acessar um atributo private através de um get ou set que não seja private, vai funcionar normalmente.
O que você tem que se perguntar é se você quer mesmo que outras classes tenham ou não acesso direto a esse atributo:
- Se você quiser que só sua classe tenha acesso direto, mas as demais só possam fazer através de métodos get e set, use o private;
- Se você quiser que sua classe e as do mesmo pacote tenham acesso direto, mas as demais só com get e set, use o default (não escreva nada);
- Se você quiser que sua classe, as do mesmo pacote, e as filhas (onde quer que estejam) tenham acesso direto, e o resto só por get e set, use protected;
- Se você quiser que todos tenham acesso direto (péssima idéia) use public.
Note que classes filhas tem um nível de acesso especial na maioria das linguagem, pois elas representam a relação é um. Mas é uma discussão sem fim se elas devem ou não ter acesso direto, ou protected. Eu dificilmente uso protected em atributos, geralmente eu reservo para métodos mesmo.
Um exemplo de atributo encapsulado:
[code]public class Exemplo {
private int x; //Somente exemplo altera x diretamente
//Permite que classes do mesmo pacote e filhas troquem o valor
protected void setX(int valor) {
if (valor < 0)
throw new IllegalArgumentException(“O valor tem que ser maior que 0!”);
this.valor = valor;
}
//Permite que qualquer um leia o valor
public int getValor() {
return valor;
}
}[/code]
Note que uma classe filhas e do mesmo pacote podem mexer no valor, desde que use um valor >= 0. Classes de outros pacotes e que não sejam filhas, só podem ler o valor. O atributo portanto está encapsulado.
Não é necessário usar super. sempre. Só se houver ambiguidade. Por exemplo:
public class ExemploFilho extends Exemplo {
//Permite que qualquer um troque o X para 50
public void trocarX() {
setX(50); //Essa classe não define setX. Então isso equivale à super.setX(), já que o método é herdado.
}
}
Você só precisa explicitar o super, se você tivesse sobrescrito o setX e seu interesse não fosse chamar seu próprio setX, mas o do pai.
Um atributo protected seria visível na subclasse. Ou seja, você estaria confiando à subclasse a capacidade total e irrestrita de alterar aquele atributo. Não há proteção, mas como a subclasse é um tipo especializado da super (relação é um), você assume que os programadores que estiverem fazendo a herança sabem o que estão fazendo. Entretanto, o atributo fica com acesso protegido a outras classes do sistema, de outros pacotes.[/quote]
Agora entendi perfeitamente bem! Então vou continuar com meus atributos privados e meus métodos públicos (que é o que estou precisando no momento).
Muitíssimo obrigado, eu aprendo muito aqui no GUJ.
PS: depois que eu conseguir resolver este meu programa (segredo por enquanto) eu disponibilizo um desafio la no tópico criado para isso e depois eu posto o meu programa (se der tudo certo!)…