Referenciar atributo protected herdado de outro pacote

9 respostas
thiagolgf

Possuo 5 classes distribuídas em 4 pacotes.

(default package) -> TesteConta.java
br.com.odeon.clientes -> Cliente.java
br.com.odeon.contas -> Conta.java e ContaCorrente.java
br.com.odeon.exceptions -> ValorInvalidoException.java

Gostaria de entender o motivo de estar ocorrendo erro no seguinte trecho da classe ‘TesteConta.java’:

System.out.println("Cliente " + cc1.titular.getNome() + " eh portador da Conta " + cc1.numeroConta + " com saldo de R$ " + cc1.getSaldo());[/b]

O Eclipse reclama da chamada “cc1.titular.getNome()” e “cc1.numeroConta”

Por quê não posso me referenciar aos atributos ‘titular’ e ‘numeroConta’ a partir de cc1 (ContaCorrente) que está herdando Conta? Considerando que todos os atributos das classes Conta e Cliente são PROTECTED.

Att,

Thiago Freitas

9 Respostas

R

Amigão dê uma lida nos identificadores java, o protected consiste em apenas classes do mesmo pacote poderem acessar atributos identificados como protected, ou seja, se identificou ele como protected e quer utiliza lo em outra package é melhor mudar a estrategia ou dê uma lida em alguns padrões de projeto, podem lhe ajudar na solução deste caso.
ja testou ele private?!

L

PROTECTED = Mesmo Pacote OU Heranca.

Como as classes estão em pacotes diferentes, a primeira chance é eliminada.

Pelo jeito, TesteConta não herda ContaCorrente e por isso a segunda chance tambem é eliminada.

Faça acesso via gets.

Abs.

thiagolgf

Caro ramatisreis, segue abaixo o que consta na planilha da Caelum sobre este assunto.

Apostila “caelum-java-objetos-fj11.pdf” com o título “FJ-11 Java e Orientação a Objetos” na página 164.

“protected - Aquilo que é protected pode ser acessado por todas as classes do mesmo pacote e por
todas as classes que o estendam, mesmo que essas não estejam no mesmo pacote. Somente atributos,
construtores e métodos podem ser protected.”

Com esta explicação da Caelum, a sua explicação fica sem sentido e minha dúvida persiste.

Quem está certo e quem está errado?

Att,

Thiago Freitas

L

Thiago,
vou tentar explicar como funciona o protected.
Nem compilei o código abaixo, mas aconselho vc compilar pra entender melhor.
Se persistir dúvidas, ou se tiver algo errado aí, posta novamente.

package primeiro;

class A {
	protected String t;
	private String p;
	public String l;
}


package segundo;

import primeiro.A;

// veja esse detalhe, B é filho de A
// por B ser filho de A, entenda que os atributos de A protected e public sao herdados
class B extends A{

	void metodo(){
		// isso nao funciona
		// apesar de protected poder ser utilizado para heranca, isso dara erro, porque 
		// aqui vc cria um novo A, como se nem existisse a heranca de B para A
		// portanto apenas o acesso ao atributo l (public) funcionaria desta maneira
		A a = new A();
		a.t = "oi";
	}

	void metodo2(){
		// ja neste caso vc estah acessando a variavel protected via heranca, 
		// que eh a situacao onde o protected pode ser acessado fora do mesmo pacote
		this.t = "Teste";

               // CORRIGIDO ACIMA PARA this.t APÓS MENSAGEM POSTERIOR A ESSE POST
	}
}
thiagolgf

Isouza, devo ser muito burro mesmo, pois continuo sem entender…

Na explicação abaixo você diz que estou acessando a variável protected e isso não é verdade, pois o atributo “p” é private e não protected.

void metodo2(){

// ja neste caso vc estah acessando a variavel protected via heranca,

// que eh a situacao onde o protected pode ser acessado fora do mesmo pacote

this.p = Teste;

}

Att,

Thiago Freitas

L

Cara, erro meu.

Eu quis dizer:

this.t = "algo";

Mas posta aí se ficar com duvida.

Ninguém é burro kra, todos estamos aprendendo juntos.

Valeu!

thiagolgf

RESOLVIDO!

Caro Isouza, te agradeço imensamente pela paciência no atendimento da minha dúvida.

Consegui fazer funcionar através da sua explicação.

Segue abaixo o código demonstrando o funcionamento.

package odeon;

public class Classe0 {
	protected String nome;
}
package br;

import odeon.Classe0;

public class Classe1 {

	protected Classe0 prot;
	private String priv;
	public String pub;
	
	public Classe0 getProt(){
		return this.prot;
	}
	
}
package com;

import br.Classe1;

public class Classe2 extends Classe1{	
	
}
package com;

import com.Classe2;

public class TesteConceito {
	public static void main(String[] args){
		Classe2 c2 = new Classe2();
		System.out.println(c2.getProt());	
	}
}
L

Ótimo cara.

Mas você pode alterar ainda mais o código pra entender ainda melhor:

coloque

public Classe0 getProt(){
		return this.prot;
	}

na Classe2. Mas lembre-se de fazer o import abaixo na Class2 também

import odeon.Classe0;

Veja o que mudou e veja também que agora, this.port vai ser utilizado na classe filha.

thiagolgf

Perfeito!

Funcionou também…

Continuando meu aprendizado…

Abs,

Thiago Freitas

Criado 15 de março de 2013
Ultima resposta 16 de mar. de 2013
Respostas 9
Participantes 3