Duvida em protected;;;;;

Folks,

como fazer para compilar esse codigo abaixo.

O que fazer ???

abs



package p1;
public class A {
      protected int i = 10;
      public int getI() { return i; }
}

package p2;
public class B extends p1.A {
   public void process(A a)
   {  a.i = a.i*2; }
   public static void main(String[] args)
   {
      A a = new B();
      B b = new B();
      b.process(a);
      System.out.println( a.getI() );
   }
}


protected, funciona com acesso direto para classes do mesmo pacote…se vc colocar em outro pacote mesmo sendo subclasse, ele nao funciona…entao vc teria que mudar seu protected para public…pelo menos aqui no meu eclipse funcionou assim…

ficou assim:

package p1;  
public class A {  
	public int i = 10;  
	public int getI() { return i; }
}


package p2;

public class B extends p1.A {  
	public void process(p1.A a)  
	{  a.i = a.i*2; }  
	public static void main(String[] args)  
	{  
		p1.A a = new B();  
		B b = new B();  
		b.process(a);  
		System.out.println( a.getI() );  
	}  
} 

ok…valeu…

Oi,

Essa questão é pegadinha mesmo, quando se “É-UM” em java o acesso protected permite sim acessar o atributo ou método tando ou não no mesmo pacote, ou seja ele é menos restrintivo do que o default, porém o que acontece é que o método

recebe como parêmetro uma referência a classe A e neste caso não adianta B ser uma especialização de A, pois B neste momento tratará uma variável da classe A e não a si mesmo, por exemplo:

se removermos

e colocarmos

o código passa a ser compilável, mesmo que não sirva para nada pois não usamos a variável a para nada.

Pessoal uma dúvida nesse código:

p1.A <<< isso seria um nome totalmente qualificado?

Ou seja, com isso eu não precisaria fazer o import do package que a classe está inserida?

[quote=thinet]Pessoal uma dúvida nesse código:

p1.A <<< isso seria um nome totalmente qualificado?

Ou seja, com isso eu não precisaria fazer o import do package que a classe está inserida?[/quote]

Sim, na verdade o import é como se fosse um alias para a classe, algumas vezes para diferenciar classes de nomes iguais você pode usar p1.A e p2.A

Abs

corrigindo, Protected…se for subclasse, entao os atributos podem se acessados direto, mesmo que nao seja do mesmo pacote.

oque ta pegando nesse codigo é public void process(p1.A a)

pq esse objeto A é que esta “melando tudo” se vc fizer this.a ele vai funcionar…uma vez que B é subclasse de A.

ams pra vc acessar do objeto A diretamente…ou é public ou usa o metodo get… :wink: