Inheritance
Uma class pode herdar de outra com extends, obtendo automaticamente acesso aos seus fields e methods. super(name) dentro do constructor de uma subclass chama o constructor da parent class, o que é obrigatório antes que o constructor da subclass possa fazer qualquer outra coisa quando a parent não tem um constructor sem argumentos.
Fazendo override com @Override
Marcar um method com @Override diz ao compilador que você pretende substituir a versão da parent class — é opcional, mas detecta erros reais, como um nome de method digitado errado que de outra forma definiria silenciosamente um method completamente novo em vez de fazer override do que você queria. dog.speak() chama a versão própria de Dog, não a de Animal, porque Dog faz override dela.
public class Main {
static class Animal {
String name;
Animal(String name) {
this.name = name;
}
String speak() {
return name + " makes a sound";
}
}
static class Dog extends Animal {
Dog(String name) {
super(name);
}
@Override
String speak() {
return name + " barks";
}
}
public static void main(String[] args) {
Dog dog = new Dog("Rex");
System.out.println(dog.speak());
}
}Rex barks
A seguir: polymorphism e interfaces — a forma de primeira classe que o Java tem de descrever comportamento compartilhado entre classes não relacionadas.
Practice exercise
Defina uma class Animal com um field name e um method speak() que retorne name + " makes a sound". Defina uma class Cat que estenda Animal e faça override de speak() para retornar name + " meows". Crie um Cat chamado "Whiskers" e imprima seu speak().