<jupyter_start><jupyter_text>PolimorfismoPolimorfismo é a capacidade de um operador executar a ação apropriada dependendo do tipo do operando. Uma classificação comum de tipos de polimorfismo é:- universal    - sobrescrita    - parametrização- ad-hoc    - sobrecarga    - coersão de tipo (casting)    Cada linguagem orientada a objeto pode suportar diferentes tipos. O polimorfismo pode ser estático (em tempo de compilação) ou dinâmico (em tempo de execução). Os códigos abaixo apresentam exemplos de **sobrescrita** e **sobrecarga** dinâmicos. Em outras palavras, o método a ser executado será escolhido (binding) em tempo de execução, de acordo com o objeto corrente.  SobrescritaOutros termos: sobreposição, redefinição, *override*Um método com a mesma assinatura é redefinido em uma subclasse.A classe *Pessoa* possui o método *imprime*. A subclasse class *Aluno* redefine o método *imprime*, com uma implementação própria. No momento da execução, o interpretador verifica que se o objeto é uma instância de *Aluno* e chama o método apropriado.<jupyter_code>class Pessoa {
    String nome;
    void imprime() {
        System.out.println("Nome: "+nome);
    }
}

class Aluno extends Pessoa {
    String matricula;
    void imprime(){
        super.imprime();
        System.out.println("Matricula: "+matricula);    
    }    
}

class Programa {
    public static void main(){
        Pessoa pessoa = new Pessoa ();
        pessoa.nome = "Rita";
        pessoa.imprime();
        
        Aluno aluno = new Aluno();
        aluno.nome = "Bruna";
        aluno.matricula = "20201415";
        aluno.imprime();        
    }
}

Programa.main();<jupyter_output><empty_output><jupyter_text>Sobrescrita e tipo das variáveisUma variável pode ser declarada com o tipo da superclasse, e receber tanto instâncias da superclasse (*Pessoa*) como da subclasse (*Aluno*). O contrário não é válido, pois um *Aluno* é uma *Pessoa*, mas uma *Pessoa* não é um *Aluno*.Na chamada do método *imprime*, é o tipo do objeto que define a chamada do método, não da variável declarada. Isto é, a primeira chamada é sobre o *imprime* em *Pessoa*, e a segunda é sobre o *imprime* em *Aluno*.Foi necessário fazer um *cast* para acessar o atributo *matricula*, pois a variável do tipo *Pessoa* "não sabe" em tempo de compilação, que receberá uma instância de *Aluno*. *Cast*s errados podem causar erros na execução.<jupyter_code>class Pessoa {
    String nome;
    void imprime() {
        System.out.println("Nome: "+nome);
    }
}

class Aluno extends Pessoa {
    String matricula;
    void imprime(){
        super.imprime();
        System.out.println("Matricula: "+matricula);    
    }    
}

class Programa {
    public static void main(){
        Pessoa pessoa = new Pessoa ();
        pessoa.nome = "Rita";
        pessoa.imprime();
        
        Pessoa aluno = new Aluno();
        aluno.nome = "Bruna";
        ((Aluno)aluno).matricula = "20201415";
        aluno.imprime();        
    }
}

Programa.main();<jupyter_output><empty_output><jupyter_text>SobrecargaOutros termos: overloadRedefinição baseada em tipo. Os métodos possuem o mesmo nome, porém tipo de retorno ou número de parâmetros diferentes. É a assinatura do método que define qual será executado.No código abaixo, o método *imprime* no aluno está sobrecarregado, pois há duas implementações, cada uma com um número de parâmetros diferente.<jupyter_code>class Pessoa {
    String nome;
    void imprime() {
        System.out.println("Nome: "+nome);
    }
}

class Aluno extends Pessoa {
    String matricula;
    void imprime(){
        super.imprime();
        System.out.println("Matricula: "+matricula);    
    }    
    void imprime(String descricao){
        imprime();
        System.out.println(descricao + matricula);    
    }        
}

class Programa {
    public static void main(){        
        Aluno aluno = new Aluno();
        aluno.nome = "Bruna";
        aluno.matricula = "20201415";
        aluno.imprime();        
        aluno.imprime("Matrícula do aluno: ");
    }
}

Programa.main();<jupyter_output>Nome: Bruna
Matricula: 20201415
Nome: Bruna
Matricula: 20201415
Matrícula do aluno: 20201415
{'fraction_non_alphanumeric': 0.09267241379310345, 'fraction_numerical': 0.011494252873563218, 'mean_word_length': 3.131552917903066, 'pattern_counts': {'":': 0, '<': 12, '<?xml version=': 0, '>': 12, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '3', 'dir': 'jupyter-structured-clean-dedup', 'id': '273561', 'license': 'Unlicense', 'n_tokens_mistral': 1465, 'n_tokens_neox': 1422, 'n_words': 444, 'path': 'Polimorfismo.ipynb', 'repo_name': 'Marcosddf/programacaojava', 'size': '4176'}