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.
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]