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
Se a variavel for privada não. Por isso a importancia dos gets e sets
1 curtida