Duvida sobre herança

9 respostas
P

Olá,

uma duvida nesse exemplo pois coloquei na opção 1
pra entender melhor se o metodo existisse na classe Base seria certo…

é isso nessa condição somente da pra usar qdo Agg a = new Agg() é isso a idéia ???

class Base {}

class Agg extends Base{
        public String getFields(){
         String name =  "Agg";
        return name;
        }
}


public class Avf{
public static void main(String argv[]){
        Base a = new Agg();
        //Here
        }
}

What code placed after the comment //Here will result in calling the getFields method resulting in the output of the string "Agg"?
 
Incorrect options are shown by strikethrough, any options you chose are marked by a tick  
1)  System.out.println(a.getFields());  
2)   System.out.println(a.name);  
3)   System.out.println((Base) a.getFields());  
4)   System.out.println( ((Agg) a).getFields());

9 Respostas

victorwss

A resposta é 4.
2 dá erro de compilação porque não existe um atributo name na classe Base.
3 dá erro de compilação porque o cast tem prioridade menor do que o operador “.”, resultando em um cast de String para Base que o compilador obviamente vê que é impossível.
1 dá erro de compilação porque a referência é de Base e Base não tem o método getFields().
4 é correto porque o cast de Base para Agg é válido e Agg tem o método getFields() que sempre retorna a String “Agg”.

marcosharbs

é possivel fazer isso?

Base a = new Agg();

??

rafaelglauber

marcosharbs:
é possivel fazer isso?

Base a = new Agg();

??

Por quê não poderia? Agg é uma especialização de Base. O contrário é que seria incorreto, lembre-se do teste É-UM.

Cachorro é um Animal, mas nem todo Animal é um Cachorro.

victorwss

marcosharbs:
é possivel fazer isso?

Base a = new Agg();

??

Sim. Isso é possível porque Agg herda de Base.
É o mesmo que fazer isso:

Animal a = new Cachorro();

Isso é possível porque uma variável do tipo da superclasse pode receber uma instância da subclasse:

Animal b;
if (voar) {
    b = new Passarinho();
} else if (nadar) {
    b = new Peixe();
} else {
    b = new Vaca();
}

O mesmo vale para interfaces:

class X implements ActionListener { ... } ActionListener a = new X();

marcosharbs

hmmm entendi
obrigado pelos exemplos e por me tirar essa duvida
vlww

T
paribe:
Olá,

uma duvida nesse exemplo pois coloquei na opção 1
pra entender melhor se o metodo existisse na classe Base seria certo....

é isso nessa condição somente da pra usar qdo Agg a = new Agg() é isso a idéia ?????

class Base {}

class Agg extends Base{
        public String getFields(){
         String name =  "Agg";
        return name;
        }
}


public class Avf{
public static void main(String argv[]){
        Base a = new Agg();
        //Here
        }
}

What code placed after the comment //Here will result in calling the getFields method resulting in the output of the string "Agg"?
 
Incorrect options are shown by strikethrough, any options you chose are marked by a tick  
1)  System.out.println(a.getFields());  
2)   System.out.println(a.name);  
3)   System.out.println((Base) a.getFields());  
4)   System.out.println( ((Agg) a).getFields());

Paribe, sua resposta esta certa, é o 1 mesmo. Não se esqueça do polimorfismo. ;-)

victorwss

tiago_stos:

Paribe, sua resposta esta certa, é o 1 mesmo. Não se esqueça do polimorfismo. ;-)

Você leu a minha resposta lá em cima?

danilopelegrino
tiago_stos:
paribe:
Olá,

uma duvida nesse exemplo pois coloquei na opção 1
pra entender melhor se o metodo existisse na classe Base seria certo....

é isso nessa condição somente da pra usar qdo Agg a = new Agg() é isso a idéia ?????

class Base {}

class Agg extends Base{
        public String getFields(){
         String name =  "Agg";
        return name;
        }
}


public class Avf{
public static void main(String argv[]){
        Base a = new Agg();
        //Here
        }
}

What code placed after the comment //Here will result in calling the getFields method resulting in the output of the string "Agg"?
 
Incorrect options are shown by strikethrough, any options you chose are marked by a tick  
1)  System.out.println(a.getFields());  
2)   System.out.println(a.name);  
3)   System.out.println((Base) a.getFields());  
4)   System.out.println( ((Agg) a).getFields());

Paribe, sua resposta esta certa, é o 1 mesmo. Não se esqueça do polimorfismo. ;-)

O victor ta certo Tiago, neste trexo:
Base a = new Agg();

Esta ocorrendo um CAST UP do objeto da classe Agg para classe Base, ou seja, ele perde as funcionalidades da classe Agg que é a classe que contem o metodo getFields. Portanto se ele tentar acessar o metodo vai dar erro.

Agora no item 4, ele esta efetuando o Cast Down do objeto a, novamente para a classe Agg, ou seja, agora ele consegue acesso aos metodos desta classe :)

Espero ter ajudado...t++ abraçooo fuiiiii

T
danilopelegrino:
tiago_stos:
paribe:
Olá,

uma duvida nesse exemplo pois coloquei na opção 1
pra entender melhor se o metodo existisse na classe Base seria certo....

é isso nessa condição somente da pra usar qdo Agg a = new Agg() é isso a idéia ?????

class Base {}

class Agg extends Base{
        public String getFields(){
         String name =  "Agg";
        return name;
        }
}


public class Avf{
public static void main(String argv[]){
        Base a = new Agg();
        //Here
        }
}

What code placed after the comment //Here will result in calling the getFields method resulting in the output of the string "Agg"?
 
Incorrect options are shown by strikethrough, any options you chose are marked by a tick  
1)  System.out.println(a.getFields());  
2)   System.out.println(a.name);  
3)   System.out.println((Base) a.getFields());  
4)   System.out.println( ((Agg) a).getFields());

Paribe, sua resposta esta certa, é o 1 mesmo. Não se esqueça do polimorfismo. ;-)

O victor ta certo Tiago, neste trexo:
Base a = new Agg();

Esta ocorrendo um CAST UP do objeto da classe Agg para classe Base, ou seja, ele perde as funcionalidades da classe Agg que é a classe que contem o metodo getFields. Portanto se ele tentar acessar o metodo vai dar erro.

Agora no item 4, ele esta efetuando o Cast Down do objeto a, novamente para a classe Agg, ou seja, agora ele consegue acesso aos metodos desta classe :)

Espero ter ajudado...t++ abraçooo fuiiiii

Foi maus galera. Sinceramente nunca tinha ouvido falar de "CAST UP" e "CAST DOW" em todo tempo que estudo java, e todo exemplo que via o acesso era realizado da forma:

Base a = new Agg();
System.out.println(a.getFields());

Mas é mais uma pra coleção de conhecimentos.

Criado 7 de novembro de 2008
Ultima resposta 9 de nov. de 2008
Respostas 9
Participantes 6