Polymorphism: dynamic dispatch and toString() · Polimorfismo: dispatch dinâmico e toString()
Polymorphism: one type, many behaviours
- Polymorphism means "many forms": one superclass type, many subclass behaviours.
- You can hold a
Dogor aCatin anAnimalvariable, because each is-anAnimal. - When you call a method, the object's real type decides which version runs.
Polimorfismo: um tipo, muitos comportamentos
- Polimorfismo significa "muitas formas": um tipo de superclasse, muitos comportamentos de subclasse.
- Você pode guardar um
Dogou umCatem uma variávelAnimal, porque cada um é-umAnimal. - Quando você chama um método, o tipo real do objeto decide qual versão roda.
Dynamic dispatch
- The variable's type (
Animal) decides which methods you are allowed to call. - But at run time, the actual object (
Dog) decides which overridden version runs. - This run-time choice is called dynamic dispatch — it is the heart of polymorphism.
Dispatch dinâmico
- O tipo da variável (
Animal) decide quais métodos você está permitido a chamar. - Mas em tempo de execução, o objeto real (
Dog) decide qual versão overrideada roda. - Essa escolha em tempo de execução é chamada de dispatch dinâmico — é o coração do polimorfismo.
public class Main {
public static void main(String[] args) {
Animal[] zoo = { new Dog(), new Cat(), new Dog() };
for (Animal a : zoo) {
System.out.println(a.speak()); // Woof, then Meow, then Woof
}
}
}
class Animal {
public String speak() { return "some sound"; }
}
class Dog extends Animal {
public String speak() { return "Woof"; }
}
class Cat extends Animal {
public String speak() { return "Meow"; }
}
One loop handles every subclass
- The loop above never asks "is this a Dog or a Cat?" — it just calls
speak(). - Each object answers in its own way. That keeps the loop short and general.
- Add a brand-new subclass later and the same loop works on it, unchanged.
Um loop lida com toda subclasse
- O loop acima nunca pergunta "este é um Dog ou um Cat?" — ele apenas chama
speak(). - Cada objeto responde de maneira própria. Isso mantém o loop curto e geral.
- Adicione uma subclasse totalmente nova depois e o mesmo loop funciona nele, inalterado.
toString(): every object inherits it from Object
- Every class in Java secretly extends a class called
Object, which has atoString(). - Override
toString()to say how your object should look as text. - Java calls it automatically when you print an object or join it with
+.
toString(): todo objeto herda de Object
- Toda classe em Java estende secretamente uma classe chamada
Object, que tem umtoString(). - Override
toString()para dizer como seu objeto deve parecer como texto. - Java o chama automaticamente quando você imprime um objeto ou o junta com
+.
public class Main {
public static void main(String[] args) {
Object x = new Fraction(3, 4);
System.out.println(x); // 3/4 -- toString() runs
System.out.println("ratio " + x); // ratio 3/4
}
}
class Fraction {
private int numerator;
private int denominator;
public Fraction(int numerator, int denominator) {
this.numerator = numerator;
this.denominator = denominator;
}
public String toString() {
return numerator + "/" + denominator;
}
}
Common mistakes
- The actual object's method runs at run time (dynamic dispatch), not the variable's type.
- Override
toString()for readable output.
Erros comuns
- O método do objeto real roda em tempo de execução (dispatch dinâmico), não o tipo da variável.
- Override
toString()para saída legível.
Now you try
- Use a superclass array, add a new subclass, and override
toString(). - A hidden Harness checks that the right version runs for each object.
- Press Run to compile, then Check answer. Your code runs on the server, so even the first run is fast.
Agora você tenta
- Use um array de superclasse, adicione uma nova subclasse, e override
toString(). - Um Harness oculto verifica que a versão certa roda para cada objeto.
- Pressione Run para compilar, depois Check answer. Seu código roda no servidor, então mesmo a primeira execução é rápida.
Animal, Dog, and Cat are written for you. Complete the static method Zoo.chorus(Animal[] animals) so it returns every animal's sound joined by single spaces. Example: a Dog, Cat, Dog array gives "Woof Meow Woof". An empty array gives "". Loop and call speak() — let polymorphism pick the right sound. · Animal, Dog e Cat estão escritos para você. Complete o método estático Zoo.chorus(Animal[] animals) para retornar o som de cada animal unido por espaços simples. Exemplo: um array Dog, Cat, Dog dá "Woof Meow Woof". Um array vazio dá "". Faça o loop e chame speak() — deixe a polimorfismo escolher o som certo.
Click Run to see the output here. · Clique em Executar para ver a saída aqui.
Animal, Dog, Cat, and a working Zoo.chorus are written for you. Add a class Cow that extends Animal and overrides speak() to return "Moo". Notice the existing chorus loop handles your new Cow with no changes. · Animal, Dog, Cat e um Zoo.chorus funcional estão escritos para você. Adicione uma classe Cow que estende Animal e override speak() para retornar "Moo". Note que o loop chorus existente lida com sua nova Cow sem alterações.
Click Run to see the output here. · Clique em Executar para ver a saída aqui.
Complete Fraction by overriding toString() so it returns the fraction as "numerator/denominator" — for 3 and · e 4 it returns "3/4". Java calls toString() automatically when you print a Fraction or join it with +. · Complete Fraction overrides toString() para que retorne a fração como "numerator/denominator" — para 3 e 4 retorna "3/4". Java chama toString() automaticamente quando você imprime um Fraction ou o junta com +.
Click Run to see the output here. · Clique em Executar para ver a saída aqui.