Herança, sobrescrita, treino certificação

public class Cat {
	public String type = "c ";
	
	public Cat() {
		System.out.print("cat ");
	}
}
public class Javanese extends Cat {
	public Javanese() {
		System.out.print("javanese ");
	}
	
	public static void main(String[] args) {
		new Javanese().go();
	}
	
	void go() {
		type = "j ";
		System.out.print(this.type + super.type);
		//Imprime --> Cat Javanese jj
	}
}

A minha duvida é a seguinte:
Sei que a variável type foi sobrescrita e agora vale j, mas na impressão existe uma chamada a super, não era pra imprimir c???

Interessante, mas pelo que entendi, como Javanese extende de Cat, ela passou a ter o atributo type da classe Cat, entao esse atributo passou a pertencer tambem a Javanese, como se fosse da sua propria classe.

Quando executa new Javanese(), a classe Cat é executada primeiro, pois Javanese extends de Cat. Cat então executa o seu metodo construtor exibindo a mensagem “cat”; depois a sequencia volta para a Classe Javanese executando o metodo go(), que sobrescreve type (essa sobrescrita tambem aconteceu lá na Classe cat) “c” passou a ser “j”. Aí finalmente exibe. Quando deu super.type, type já estava sobrescrito

Não era pra imprimir “c” porque o atributo type é um só, não existe uma cópia dele para cada membro da hierarquia de classes. Um Javanese criado herda o atributo type com o valor igual a “c”, mas quando você seta o valor para “j”, ele sobrescreve o valor. Confira:

void go() { System.out.print(this.type + super.type); type = "j "; System.out.print(this.type + super.type); //Imprime --> Cat Javanese jj }

Mas ele não sobrescreve só na classe especializada?
Toda vez que uma variável/ método for sobrescrita a variável/ método da superclasse também será?

Pense nisso como uma herança de verdade. Se você herda um carro do seu pai, só existe um carro. Se você trocou a cor do carro, você trocou a cor do único carro que existe. Se sua subclasse sobrescrever um método da superclasse, você vai sempre chamar o método da subclasse (a menos que você use mecanismos para chamar o método da superclasse, como o super()). Entendeu?

1 curtida

Entendi, obrigado!

Se a variavel for privada não. Por isso a importancia dos gets e sets

1 curtida