Bom dia!
Estava lendo na internet, e em um artigo .ppt o cara disse que na herança, “todo objeto de uma subclasse também é um objeto de sua superclasse”.
Aí me veio uma pergunta.
Quando instanciamos um objeto de uma subclasse também instanciamos um outro objeto de sua superclasse?
ou
Quando instanciamos um objeto de uma subclasse, estamos na verdade instanciando um objeto de sua Superclasse mas de acordo com a referência ao objeto, ele acaba se tornando um objeto da superclasse só que maior, com os métodos e atributos da subclasse? Tipo superclasse + subclasse.
E o caso do método super();? Ele é executado na superclasse logo dois objetos são instanciados ao instanciarmos um objeto da subclasse?
[quote=Bruno Lacerda]Bom dia!
Estava lendo na internet, e em um artigo .ppt o cara disse que na herança, “todo objeto de uma subclasse também é um objeto de sua superclasse”.
Aí me veio uma pergunta.
[/quote]
Vou dar um exemplo prático. Digamos que eu tenha uma classe A
class A {
private int x = 2;
}
e uma classe B
class B extends A {
public int y = 3;
}
O layout da memória ocupado por um objeto da classe A é mais ou menos assim (não levando em conta algum “housekeeping” que é necessário em objetos: )
int x -> 4 bytes; valor inicial 2
O layout da memória ocupado por um objeto da classe B é mais ou menos assim:
int x -> 4 bytes; valor inicial 2
int y -> 4 bytes; valor inicial 3
Quando você instancia um objeto da classe B, não está instanciando 2 objetos e sim 1 objeto só, só que com os membros herdados de todas as suas superclasses (os membros podem estar sobre-escritos ou inacessíveis, como é o caso do campo “x” que não pode ser acessado a partir da classe B, mas estão lá.)
[quote]
E o caso do método super();? Ele é executado na superclasse logo dois objetos são instanciados ao instanciarmos um objeto da subclasse?
Alguém poderia esclarecer?
Valeu pessoal!!![/quote]
O método “super” é na verdade uma forma de chamar o construtor ou o método com o mesmo nome na superclasse. Ele é chamado exatamente onde você o está vendo no programa (ou seja, no início da execução do construtor ou do método sobreescrito.) Por exemplo - vou mostrar para métodos, mas como construtores são uma forma especial de métodos, então vale o que falei também para construtores.
class Animal {
public void emitirSom() { System.out.println ("---"); }
}
class Cachorro extends Animal {
public void emitirSom() { super(); System.out.println ("Au!"); }
}
Note que Cachorro.emitirSom() chama super() (ou seja, Animal.emitirSom() ) e a seguir chama System.out.println (“Au!”).
Note também que eu não poderia escrever:
class Cachorro extends Animal {
public void emitirSom() { emitirSom(); System.out.println ("Au!"); }
}
porque estaria chamando recursivamente Cachorro.emitirSom (não Animal.emitirSom), nem
class Cachorro extends Animal {
public void emitirSom() { Animal.emitirSom(); System.out.println ("Au!"); }
}
porque isso não é permitido pela linguagem (escolher exatamente qual é a superclasse cujo método deve ser chamado.) Você tem de usar “super” e ela deve ser a primeira linha executável do método.