Subclasse não consegue acessar método da superclasse

Só acrescentando, se você somente herdar a classe, uma instância da classe filha não conseguirá acessar o método protected herdado a partir de um pacote diferente.

A não ser que subscreva e tranforme ele em public.

[quote=turim]GilsonNunes

Sim, como o nel, disse é parte da especificação.[/quote]
e não rodou não?

olha a tabela do link q vc postou.

Access Levels
Modifier____Class Package Subclass World
public_______Y____Y________Y_____Y
protected____Y____Y________Y_____N
no modifier__ Y____Y________N_____N
private______Y____N________N_____N

ta vendo o subclass?

o que eu disse está errado ?


package A;

public class ClasseA {

	protected void printProtected(){
		System.out.println("protected");
	}
	
	void printDefault(){
		System.out.println("Default");
	}
	
}
package B;

import A.ClasseA;

public class ClasseB extends ClasseA {

	public void testeComInstancia(ClasseB b){
		b.printProtected();
	}
	
	
	public void testeComThis(){
		this.printProtected();
	}
	
	
}

Mas eu fiz o teste aqui e acessou, pelo fato de que a subclasse acessa os membros com modificador protected da super classe atravéz de herança , independente se é o mesmo pacote ou não.

[quote=turim]Só acrescentando, se você somente herdar a classe, uma instância da classe filha não conseguirá acessar o método protected herdado a partir de um pacote diferente.

A não ser que subscreva e tranforme ele em public.[/quote]

protected consegue sim , o default não consegue em pacote diferente , teste o código que postei acima.

Eu quiz dizer a nível de instância.

Se você criar uma instância da classe filha em outro pacote, não conseguirá acessar o método protected.

Como foi o caso da pessoa que criou esse tópico.

isso quad.mostra();, ela não irá conseguir fazer.

[quote=turim]Eu quiz dizer a nível de instância.

Se você criar uma instância da classe filha em outro pacote, não conseguirá acessar o método protected.

[/quote]

Claro , nesse caso o modificador de acesso deveria ser public.

[quote=turim]Eu quiz dizer a nível de instância.

Se você criar uma instância da classe filha em outro pacote, não conseguirá acessar o método protected.

Como foi o caso da pessoa que criou esse tópico.

isso quad.mostra();, ela não irá conseguir fazer.[/quote]

o q vc quiz dizer com herdar aki então?

[quote=turim]Eu quiz dizer a nível de instância.

Se você criar uma instância da classe filha em outro pacote, não conseguirá acessar o método protected.

Como foi o caso da pessoa que criou esse tópico.

isso quad.mostra();, ela não irá conseguir fazer.[/quote]

Consegue cara…é isso que estamos tentando dizer. Olha o código que o GilsonNunes postou.
O protected em comparação ao public possui uma diferença bem básica, a obrigatoriedade de que a classe que estará acessando o método (que é o caso em questão) protected seja uma classe filha, simples assim. Enquanto no public, não há necessidade de relação de herança.

[quote=viniciusalvess][quote=turim]Eu quiz dizer a nível de instância.

Se você criar uma instância da classe filha em outro pacote, não conseguirá acessar o método protected.

[/quote]

Claro , nesse caso o modificador de acesso deveria ser public.[/quote]

Então, talvez eu não tenho sido claro, mas essa era a dúvida inicial, creio eu.

Da forma que foi colocado eu não conseguiria:

package C;  

public class Main {


	public static void main(String[] args) {
		ClasseB instancia = new ClasseB();
		
		instancia.printProtected();

	}

}

Teria um erro de compilação. Como o caso da sula.fenix.

Não cara, não dá erro de compilação.

Dará erro sim , o post anterior do Turin.
Nesse caso o Turin está correto ! O que não é o caso inicial do tópico.

Obrigada galera.
Acho que entendi.

Nossa, não pensei que essa minha dúvida fosse gerar tantos comentários.
Mas vamos lá.
Eu não preciso fazer com que o código funcione, eu preciso explicar porque não funciona.
A pergunta do exercício é: Se QuadradoDiferente é subclasse de Quadrado, por que a compilação falha?

Segue o código:

package geometria;

	public class Quadrado {
	float a, b, c;
	
	public Quadrado () {
		
	}

	public Quadrado(float ax, float ay, float ar) {
		this.a = ax;
		this.b = ay;
		this.c = ar;
	}

	protected void mostra() {
		System.out.println("(" + this.a + "," + this.b + "," + this.c + ")");
	}

}
package geometria.borda;

import geometria.*;

public class QuadradoDiferente extends Quadrado {

	public void mostra() {
		System.out.println("A área é: ");
		super.mostra();
	}

	public static void main(String args[]) {
		Quadrado quad = new Quadrado(1, 1, 1);
		quad.mostra();
	}
}

Como o método mostra() na classe Quadrado está como protected, no main da QuadradoDiferente, ocorre erro na linha: quad.mostra();

Dará erro sim , o post anterior do Turin.
Nesse caso o Turin está correto ! O que não é o caso inicial do tópico.[/quote]

Dá erro porque está tentando acessar um método protected com a instância da própria classe Pai, só não havia ficado claro no código isso pra mim.
É o mesmo caso da sula.fenix, que instancia a própria classe Pai. Se fosse a instancia da classe filho, funcionaria perfeitamente.

Graças às respostas de vocês eu mandei a seguinte resposta para o meu exercício:

Como a classe está em outro pacote, e o método na classe Circulo é protected, só é possível acessar esse método através de herança, e não instanciando um objeto da classe.

E o professor considerou certa!

Valeu galera!

[Resolvido]