[Resolvido]Uma super classe pode usar um metodo de uma classe filha?

Como pode uma super classe poder utilizar um metodo de uma classe filha?
Por exemplo: A classe Object usa um objeto STRING como retorno do metodo toString. E String estende Objects. como pode?

[quote=devaney]Como pode uma super classe poder utilizar um metodo de uma classe filha?
Por exemplo: A classe Object usa um objeto STRING como retorno do metodo toString. E String estende Objects. como pode?[/quote]

kkkkkkkkkkk
cara, não é que você pensou bem :smiley:
String apenas herda de Object que é para deixar mais abstrato a conversão, não quer dizer que internamente o java cria primeiro Object depois String

A resposta a pergunta é , NÃO.

Houve uma pequena distorção ai,

Object não usa um método da classe String,

ele apenas retorna uma instancia de String

Jovem,

NÃOOOOOOOOOOOOOOO…

Por um simples motivo a classe pai não conhece a classe filha.

Abs,

Pode-se usar objetos da classe filha como tipo de retornos de métodos do pai sem problemas. Você mesmo deu um exemplo disso.
Ambas as classes devem estar implementadas. Mas uma classe pode retornar um objeto do seu próprio tipo, de um tipo pai, ou de um tipo filho.

O que você não pode fazer, e o pessoal explicou, é um objeto da classe pai chamar um método do filho, implicitamente.

[quote=ViniGodoy]Pode sim. Sem problemas.

Não sei de onde o pessoal tirou que não. Você mesmo deu um exemplo disso.
Ambas as classes devem estar implementadas. Mas uma classe pode retornar um objeto do seu próprio tipo, de um tipo pai, ou de um tipo filho, sem problemas.[/quote]

Viny,
Creio existe uma confusão nos termos da orientação ao objetos como herança, polimorfismo, etc.

Gostaria que demonstrasse atraves deste codigo, o que é preciso fazer para imprimir “Classe Filho”. Lembrando que estou instanciando um objeto do tipo Pai.

public class Pai {
	public void imprimir(){
		System.out.println("Classe Pai");
		
	}	
}
public class Filho extends Pai{
	public void imprimir(){
		System.out.println("Classe Filho");
	}
}
public static void main(String[] args) {
	Pai pai = new Pai();
	pai.imprimir();
}

Como ressalva vamos evitar topicos duplicados com respostas divergentes.

Sem mais,

Oi,

Você consegue sim. Só não conseguirá chamar implicitamente … como num super() (Filha -> PAI).

Existe um termo chamado Late Binding que resolverá isso.

Tchauzin!

[quote=Kanin Dragon][quote=ViniGodoy]Pode sim. Sem problemas.

Não sei de onde o pessoal tirou que não. Você mesmo deu um exemplo disso.
Ambas as classes devem estar implementadas. Mas uma classe pode retornar um objeto do seu próprio tipo, de um tipo pai, ou de um tipo filho, sem problemas.[/quote]

Viny,
Creio existe uma confusão nos termos da orientação ao objetos como herança, polimorfismo, etc.

Gostaria que demonstrasse atraves deste codigo, o que é preciso fazer para imprimir “Classe Filho”. Lembrando que estou instanciando um objeto do tipo Pai.

public class Pai {
	public void imprimir(){
		System.out.println("Classe Pai");
		
	}	
}
public class Filho extends Pai{
	public void imprimir(){
		System.out.println("Classe Filho");
	}
}
public static void main(String[] args) {
	Pai pai = new Pai();
	pai.imprimir();
}

Como ressalva vamos evitar topicos duplicados com respostas divergentes.

Sem mais,[/quote]

Oi,

Quem sabe dessa forma:

public static void main(String[] args) { Pai pai = new Filho(); pai.imprimir(); }

Tchauzin!

Lina,
parabéns, seu código está correto e obtem o resultado esperado de forma totalmente eficaz.

A pergunta ainda se faz pertinente, precisamos apenas demonstrar a chamada de um metodo do filho através da instancia do pai e não pela referência.

A minha respostas é NÃOOOOOOOOO.

Permanece o código inicial da questão para livre implementação.

Gostaria que o Viny demostrasse isso através do código exemplo que postei.

abs.

[quote=devaney]Como pode uma super classe poder utilizar um metodo de uma classe filha?
Por exemplo: A classe Object usa um objeto STRING como retorno do metodo toString. E String estende Objects. como pode?[/quote],

Bom vamos por partes. Eu ao menos não conheço uma forma de uma super classe utilizar “implicitamente” o método que venha de uma filha, não ao menos usando algo relativo a herança. Diferentemente disso na super classe você pode criar uma instância da classe filha e trabalhar com ela, como acredito que seja o que ocorre neste caso (o metodo toString de Object cria um objeto String e o preenche com o caminho da classe, mais ai está criando um outro objeto String, não usando com algo relativo a uma herança (foi o que eu intendi da pergunta, e creio que metade do pessoal que respondeu).

O que a lina exibiu como o Kanin disse, na verdade o objeto utilizado é o da classe filha, não o da classe pai, como questionado inicialmente.

e o método toString é de Object, não sei se precisava dizer isso mas… fica a informação.

Pessoal…
não sei se estou precipitando mais pelo q entendo a classe object tem um metodo que se chama toString() e este metodo tem como retorno uma string…essa relação nao tem nada a ver com herança e sim é um simples retorno de metodo… o object é a classe mais alta em java…

==============este trecho esta na documentação=======================
toString

public String toString()

Returns a string representation of the object. In general, the toString method returns a string that "textually represents" this object. The result should be a concise but informative representation that is easy for a person to read. It is recommended that all subclasses override this method.

The toString method for class Object returns a string consisting of the name of the class of which the object is an instance, the at-sign character `@', and the unsigned hexadecimal representation of the hash code of the object. In other words, this method returns a string equal to the value of:

     getClass().getName() + '@' + Integer.toHexString(hashCode())
     

Returns:
    a string representation of the object.

===============fim========================

não tem nada a ver com heraça

um exemplo de codigo q tenha o mesmo relacionamento q object e string (bem mais simples claro…rs)


abstract class ClasseA {
    
    public ClasseB retornar(){
        return new ClasseB();
        
    }
}

class ClasseB extends ClasseA{
    
    //aqui é sobrescrita
    public ClasseB retornar(){
        return new ClasseB();
    }
}

NÃO
NÃO
NÃO

uma classe pai não pode chamar um metodo da classe filha, uma coisa é retornar um objeto ou usar um objeto da classe filha

outra coisa é chamar um metodo, isso furaria o conseito de POO

Respondi baseado no exemplo dele:

Acredito que ele estivesse perguntando se era possível um método de uma classe pai ter como tipo de retorno um objeto da classe filha.
Agora, que vi que a pergunta dele falava de métodos, desculpem a confusão.

[quote=ViniGodoy]Respondi baseado no exemplo dele:
Por exemplo: A classe Object usa um objeto STRING como retorno do metodo toString. E String estende Objects. como pode?

Acredito que ele estivesse perguntando se era possível um método de uma classe pai ter como tipo de retorno um objeto da classe filha.

Agora, que vi que a pergunta dele falava de métodos.[/quote]

Viny,
fico extremamente grato por nos mostrar que o caos ainda não se aproxima e, que os paradigmas da POO não foram quebrados.

Resumidamente, para a questão:

A resposta é NÃO.

Ao devaney, peço que coloque o tópico como resolvido para que não sejam geradas distorçoes referentes à Orientação a Objetos.

Abs.

Acho que o máximo que dá pra fazer é executar métodos da subclasse que tenham sido pré-definidos na superclasse, abstratos ou não. O uso do padrão Template Method configura uma situação semelhante:

[code]abstract class Superclasse {
abstract void templateMethod();

void method() {
    this.templateMethod();
}

}

class Subclasse extends Superclasse {
void templateMethod() {
System.out.println(“Executando método definido na classe filha.”);
}
}[/code]

Nossa, sinto um exagero e uma diferente interpretação do que o criador do tópico queria, afinal, entender.
E no fim, ninguém entendeu o que o Viny quis dizer com o comentário dele, não vamos exagerar pessoal, que isso.

Realmente, não tinha lido seu post por completo.

Dessa maneira acredito ser impossível e seria totalmente inviável!

O máximo que da para fazer é algo do tipo:

[code] public static void main(String[] args) {
try
{
Pai pai = new Pai();

		Class< ? > teste = pai.getClass().forName(Filho.class.getName());
		teste.getDeclaredMethod("imprimir", null).invoke(new Filho(), null);
	
		pai.imprimir();
	}
	catch (Exception e)
	{
		e.printStackTrace();
	}
}[/code]

E mesmo assim necessitaria instanciar a classe Filho.

Tchauzin!

Em 90% dos tópicos do Java básico que tem um exemplo, a pergunta está no exemplo, e não necessariamente na questão.
É por isso que me baseei puramente no exemplo dele para entender a dúvida.

Todo professor sabe que iniciantes tendem a não saber se expressar direito e misturar termos, e que geralmente seus exemplos são mais precisos do que suas próprias questões.

Mas claro, só teremos a confirmação quando ele disser qual era exatamente a dúvida. :slight_smile:

Mas concordo com o Kanin:
Um objeto pode acessar métodos do filho implicitamente? Não. Ele sequer sabe que os filhos existem (e, de fato, não existe nenhuma obrigatoriedade para um filho existir), e nem que sua instância se refere ao de uma classe filha.

E também reafirmo o que disse:
Um objeto pode usar seus objetos filhos explicitamente? Sim! Desde que o programa saiba que as duas classes existem, não há impedimento para um objeto usar, criar ou retornar um tipo do filho. Por exemplo, isso é perfeitamente válido:

[code]public class Pai {
public void usaFilho(Filho f) {
f.umMetodo(); //Pai usa filho
}

public Filho criarFilho() {
return new Filho(); //Pai cria filho
}
}

public class Filho extends Pai {
public void umMetodo() {
System.out.println(“Olá!”);
}
}[/code]

public static void main(String[] args) { Pai pai = new Pai(); pai.usaFilho(new Filho()); Filho f = pai.criarFilho(); pai.usaFilho(f); }

Obrigado a todos.