Duvida em extends

Olá pessoal ,

agora travei porque o resultado abaixo deu “SuperSuperBase”

não entendi …

Se alguém puder me ajudar agradeceria …pois estava estudando

e vi alguns exemplos que quando instanciava uma classe e metodo

que chamava era o que estavamos chamando mas com o exemplo abaixo

todo esse conceito caiu pra baixo …

abs


class SuperBase {
	void print (SuperBase a ){
		System.out.print("Super");
	}
}

class Base extends SuperBase {
	void print (Base b){
		System.out.print("Base");
	}
}

class Derived extends Base {
	static void print (Derived c){
		
	   System.out.print("Derived");
	}
}
public class Test {
	public static void main(String[] args) {

		SuperBase a1 = new SuperBase();
		SuperBase b1 = new Base();
		Base      c1 = new Derived();
		
		a1.print(new Base());
		
		b1.print(new Derived());
		c1.print(new Derived());
		
		
	}

}

isso ta pareçendo pergunta de certificação
esse exemplo não pareçe ser muitosaudavel para o nivel dos seus estudos não hein…

estude polimorfismo, override overload

Exatamente, isso ai é pergunta de certificacao. É um exemplo claro de polimorfismo. Nesse caso, as superclasses chamam os metodos delas mesmas, so recebem como parametro para o metodo print subclasses, o que é perfeitamente aceitavel. Mas nao serve de bom exemplo para iniciantes realmente…

Olá paribe, eu naum sei se isso responde a sua pergunta, mas lá vai:

a1.print(new Base());
// Isso vai imprimir Super, pq a classe instanciada foi SuperBase, e o método dela imprime Super.

b1.print(new Derived());
//Isso vai imprimir Base, pq a classe instanciada foi Base, e o método dela imprime Base.

c1.print(new Derived());
//Isso vai imprimir Derived, pq a classe instanciada foi Derived, e o método dela imprime Derived.

Agora pq? Vamos pegar um caso contraditório que é o :
SuperBase b1 = new Base();
Nesse caso, apesar de você ter declarado SuperBase, você instanciou Base, que é perfeitamente aceitável pq SuperBase é superclasse de base, mas no entanto como você instanciou base, quem “manda” aí é a instância da classe Base, que nesse caso, tem como método print :

void print (Base b){
System.out.print(“Base”);
}

Ok, e agora o que houve com a chamada “b1.print(new Derived());” ?
Ora, primeiramente, a chamada é aceita, pq apesar da assinatura do método pedir um objeto Base, Derived é uma subclasse de Base, então a passagem é válida, no entanto, é impresso Base na console pq b1 é Base certo? E o método invocado aí foi de Base, não de Derived.

Se a explicação for confusa, pode entrar em contato, ok?

Abraços

Como Nossos amigos disseram, estude polimorfismo, tem erro de sobrecarga e sobreescrita nos métodos,

Abraço