Prévia do material em texto
Sobrescrita
Apresentação
A abordagem principal na programação orientada a objetos (POO) diz respeito ao design de um
sistema e seus componentes, que incluem entidades, objetos e relacionamentos. Diferentes
métodos são utilizados para determinar o comportamento dos objetos, abrangendo aspectos como
estado, funções e procedimentos da programação estruturada.
Um dos métodos utilizados na POO é a sobrescrita, que está diretamente ligada à herança. Esse
método envolve a existência de um método na classe-mãe, que é herdado pela classe-filha, mas
implementado de forma diferente, mantendo a mesma assinatura. Sobrescrever um método
significa substituir a implementação da superclasse daquele método com a sua própria, mantendo a
mesma assinatura, mas alterando o comportamento. O tipo de retorno pode variar de maneira
particular.
Nesta Unidade de Aprendizagem, você vai explorar as características da sobrescrita e da assinatura
de método, bem como identificar a herança e compreender conceitos básicos sobre a construção
de um aplicativo. Com isso, é possível construir um aplicativo com uma estrutura de herança
fazendo uso da sobrescrita de métodos.
Bons estudos.
Ao final desta Unidade de Aprendizagem, você deve apresentar os seguintes aprendizados:
Definir o que é sobrescrita e assinatura de método.•
Identificar herança.•
Construir um aplicativo com uma estrutura de herança fazendo uso de sobrescrita de
métodos.
•
Desafio
No paradigma da POO, a aplicação de cálculos deve ser implementada com base em boas práticas,
considerando os pilares da POO, entre eles a herança e a sobrescrita. Existem diferentes maneiras
de implementar o cálculo de figuras geométricas. A herança permite a reutilização do código e
define métodos abstratos da classe-pai, já a sobrescrita de método permite realizar o cálculo
correto da área de cada figura.
Para implementar o cálculo com base em uma figura geométrica, é necessário utilizar a forma
adequada e saber o tipo de figura. O cálculo da área também exige a definição de métodos
abstratos na classe abstrata e a definição de herança para efetivar métodos.
Analise a seguinte situação:
A imagem a seguir possui audiodescrição.
Para comprovar a entrega do projeto, considere os seguintes entregáveis:
a) Salve o projeto com o nome “CalculoArea” e encaminhe o arquivo zipado como anexo na
plataforma.
b) Descreva brevemente os passos que foram seguidos para a construção do programa. Fale sobre
estrutura do aplicativo, superclasses, métodos, classes de chamadas e valores inseridos.
Infográfico
A sobrescrita é uma característica permanente da linguagem orientada a objetos. Por isso, quando a
versão de um método é executada, a ação será determinada pelo objeto usado para invocá-la. Se
um objeto de uma classe-pai é usado para chamar o método, a versão na classe-pai é executada; no
entanto, se um objeto da subclasse é utilizado para chamar o método, a versão na classe-filha é
executada.
Algumas linguagens deixam que os programadores escolham entre utilizar e evitar que métodos
sejam sobrepostos. A principal propriedade da substituição de método é que a classe pode prover
sua própria implementação específica para um método herdado sem modificar o código da classe-
pai.
Veja, neste Infográfico, os conceitos de sobrescrita.
A imagem a seguir possui audiodescrição.
Aponte a câmera para o
código e acesse o link do
conteúdo ou clique no
código para acessar.
https://statics-marketplace.plataforma.grupoa.education/sagah/5cc17562-a541-4a31-a88a-e113da7fa856/31f4c63b-fc93-43ee-bcea-44c752486b9a.png
Conteúdo do Livro
A programação orientada a objetos consolidou-se como um dos paradigmas mais utilizados no
desenvolvimento de software moderno, pois possibilita criar sistemas estruturados, modulares e
alinhados ao comportamento das entidades do mundo real. Seu principal fundamento está na
definição de classes e objetos, que encapsulam dados e comportamentos, promovendo
organização, reuso e clareza na construção de aplicações de diversos tamanhos e níveis de
complexidade.
Entre os mecanismos que tornam esse paradigma tão expressivo, a herança ocupa posição central.
Por meio dela, é possível estabelecer relações de especialização entre classes, permitindo que uma
estrutura mais geral seja estendida por tipos mais específicos. Complementando esse mecanismo, a
sobrescrita de métodos possibilita que subclasses redefinam comportamentos herdados,
adequando-os a necessidades particulares. Essa flexibilidade é essencial para criar sistemas
extensíveis, manter código coeso e explorar os benefícios do polimorfismo, tornando o software
mais adaptável a contextos variados.
No capítulo Sobrescrita, você vai ver os conceitos de sobrecarga de métodos e sobrescrita de
métodos e a diferença entre eles. Também vai estudar a implementação de herança em Java e, por
fim, como construir uma aplicação com uma estrutura de herança usando a sobrescrita de métodos.
Esses recursos são amplamente utilizados na programação orientada a objetos. Dominando-os,
você poderá escrever códigos mais eficientes e organizados, reduzindo redundâncias e melhorando
a manutenção e a evolução do seu software.
Boa leitura.
Os elementos gráficos deste capítulo possuem audiodescrição. Para acessar o recurso,
clique aqui
https://creator-files.plataforma.grupoa.education/undefined/9113_Audiodescricao_Conteudo_Livro-2026-04-22T10:37:11-03:00.pdf
PROGRAMAÇÃO
ORIENTADA A
OBJETOS
OBJETIVOS DE APRENDIZAGEM
> Identificar o conceito de herança.
> Definir o que é sobrescrita e assinatura de método.
> Construir um aplicativo com uma estrutura de herança fazendo uso de
sobrescrita de métodos.
Introdução
A programação orientada a objetos (POO) consolidou-se como um dos para-
digmas mais importantes no desenvolvimento de software contemporâneo,
sobretudo em linguagens como Java, amplamente utilizada na indústria, na
academia e em plataformas corporativas. Seu conjunto de conceitos — classes,
objetos, encapsulamento, herança e polimorfismo — permite a construção de
sistemas modulares, extensíveis e organizados, além de facilitar a modelagem
de problemas complexos por meio de abstrações próximas ao mundo real. Como
afirmam Deitel e Deitel (2010), compreender profundamente esses mecanismos
é essencial para desenvolver aplicações robustas e alinhadas às boas práticas
de engenharia de software.
Dentre esses mecanismos, a herança e a sobrescrita de métodos recebem
papel de destaque na estruturação de hierarquias de classes e na promoção
do polimorfismo, permitindo que objetos de uma subclasse especializem
comportamentos herdados de suas superclasses. Horstmann (2021) descreve
a herança como uma forma de estender classes existentes, facilitando o reuso
de código e a criação de sistemas mais flexíveis. Já a sobrescrita de métodos
garante que uma classe derivada possa adaptar comportamentos, garantindo
Sobrescrita
Hygo Sousa De Oliveira
coerência com necessidades específicas, como detalhado também por Bigonha
(2021) ao discutir modularidade e especialização em Java.
Neste capítulo, você vai aprofundar esses elementos fundamentais da POO,
explorando o conceito de herança, sua estrutura em Java e seus benefícios no
processo de modelagem, analisando sobrescrita de métodos e sua relação com
a assinatura. Além disso, verá um exemplo prático completo, implementado em
Java, no qual construiremos uma pequena hierarquia de classes e exibiremos
os efeitos da sobrescrita durante a execução do programa.
Conceito de herança na programação
orientada a objetos
A herança é um dos pilares mais importantes da programação orientada a
objetos (POO), permitindo que classes compartilhem características e com-
portamentos de forma estruturada. No contexto da linguagem Java, a herança
possibilita que uma classe derivada — chamada subclasse — reutilize atributos
e métodos já definidos em outra classe — a superclasse. Segundo Horstmann
(2021), esse mecanismo promoveextensibilidade, evitando duplicação de
código e contribuindo para um design mais claro e modular do sistema. Assim,
em vez de reescrever funcionalidades semelhantes em diferentes partes do
programa, o desenvolvedor pode centralizar comportamentos comuns em
uma superclasse e especializá-los em subclasses.
Sob uma perspectiva conceitual, a herança reflete relações do mundo real.
Muitas vezes, queremos modelar entidades que compartilham propriedades
comuns, mas que também apresentam comportamentos específicos. Deitel
e Deitel (2010) observam que esse recurso possibilita organizar classes em
hierarquias, nas quais as características comuns são mantidas em níveis su-
periores, enquanto as particularidades aparecem nos níveis mais específicos.
Em uma aplicação de gestão de funcionários, por exemplo, pode existir uma
classe mais genérica Funcionario, da qual derivam Professor, Tecnico
ou Administrador, cada uma ampliando ou especializando os atributos e
métodos herdados.
Em Java, a herança é estabelecida por meio da palavra-chave extends,
que indica explicitamente a relação entre as classes. Essa relação cria uma
estrutura hierárquica na qual a subclasse obtém todos os atributos e métodos
públicos e protegidos da superclasse. Bigonha (2021), ao discutir a modulari-
dade aplicada à linguagem Java, destaca que a herança é uma forma natural
de organizar sistemas baseados em tipos, contribuindo para a coesão dos
módulos e reforçando a noção de especialização. Essa estrutura não apenas
Sobrescrita2
simplifica o desenvolvimento inicial, mas também favorece a evolução do
software, uma vez que modificações na superclasse podem beneficiar auto-
maticamente todas as subclasses. A Figura 1 apresenta os tipos de heranças
suportadas pela linguagem Java.
Figura 1. Com base no contexto de classe, existem três tipos de herança em Java: simples,
multinível e hierárquica. Na programação Java, a herança múltipla e híbrida é suportada
apenas por meio de interfaces.
Outro aspecto relevante da herança é sua estreita relação com o polimor-
fismo, um dos pilares da programação orientada a objetos. O polimorfismo
consiste na capacidade de um mesmo método produzir comportamentos
diferentes, conforme a instância da subclasse que o implementa. Como expli-
cam Ascencio e Campos (2012), a herança permite que objetos de diferentes
subclasses sejam tratados como instâncias de uma superclasse comum,
promovendo maior flexibilidade no desenvolvimento de sistemas. Essa ca-
racterística é especialmente útil em coleções heterogêneas, nas quais os
objetos compartilham uma estrutura geral, mas respondem de forma distinta
durante a execução.
Do ponto de vista sintático, todas as classes em Java são, direta ou in-
diretamente, subclasses de uma superclasse especial chamada Object, que
ocupa o topo da hierarquia de classes da linguagem. Isso significa que, mesmo
que o programador não declare explicitamente uma superclasse, toda classe
criada herda, por padrão, os métodos definidos em Object. Como destaca
Horstmann (2021), entre esses métodos herdados estão toString() — que
retorna uma representação textual do objeto — e equals() — que permite
comparar se dois objetos são logicamente equivalentes. Esses métodos
podem ser sobrescritos nas subclasses para ajustar seu comportamento às
necessidades específicas da aplicação. Esse mecanismo mostra que a herança,
em Java, vai além das estruturas criadas pelo desenvolvedor: ela faz parte
Sobrescrita 3
do próprio funcionamento interno da linguagem e garante a uniformidade e
a extensibilidade do modelo orientado a objetos.
Para além do reaproveitamento de código, a herança exerce um papel
estratégico na arquitetura de sistemas orientados a objetos. Ela incorpora o
princípio conhecido como “é-um” (is-a), segundo o qual uma subclasse deve
representar uma especialização legítima da superclasse, ou seja, ser um tipo
mais específico dentro de uma mesma hierarquia conceitual. No entanto, o
uso excessivo ou inadequado desse mecanismo pode resultar em estruturas
rígidas e de difícil manutenção. Por isso, autores como Sierra, Bates e Gee
(2024) recomendam que a herança seja aplicada apenas quando houver uma
relação semântica clara entre as classes envolvidas. Em situações nas quais
essa relação não estiver bem definida, abordagens alternativas, como o uso
de composição, podem oferecer maior flexibilidade e facilitar a evolução do
sistema.
Na prática cotidiana, a herança contribui para organizar o código e facilitar
a manutenção de sistemas, especialmente quando combinada com outro
conceito fundamental da POO: o encapsulamento. Encapsular significa ocultar
os detalhes internos de uma classe e expor apenas o que é necessário para
seu uso externo, por meio de métodos específicos. Isso permite proteger
os dados e garantir que as interações com o objeto sejam feitas de maneira
controlada.
Em um sistema de gerenciamento de veículos, por exemplo, pode-se definir
uma superclasse genérica chamada Veiculo, que agrupa atributos comuns
como velocidade, marca e ano. A partir dela, subclasses como Carro, Moto
e Caminhao podem ser criadas, herdando esses atributos e especializando
comportamentos conforme necessário. O Caminhao, por exemplo, pode
implementar um método específico como calcularCapacidadeDeCarga().
Essa organização hierárquica facilita a expansão do sistema, permitindo a
introdução de novos tipos de veículos sem alterar a estrutura existente, ao
mesmo tempo em que mantém os dados encapsulados e protegidos.
Java não permite herança múltipla de classes. Ou seja, uma subclasse
só pode estender uma única superclasse. Deitel e Deitel (2010) jus-
tificam essa restrição como uma maneira de evitar ambiguidades relacionadas
à origem de atributos ou métodos herdados quando múltiplas superclasses
estiverem envolvidas. Apesar disso, Java permite herança múltipla de compor-
tamentos por meio de interfaces. Essa distinção mantém a linguagem simples,
ao mesmo tempo em que oferece flexibilidade no projeto de sistemas.
Sobrescrita4
Em síntese, a herança constitui um mecanismo essencial para estruturar
sistemas orientados a objetos, favorecendo o reuso, a extensibilidade e a
organização modular do código. A literatura especializada — incluindo Horst-
mann (2021), Deitel e Deitel (2010) e Bigonha (2021) — reforça sua relevância
tanto teórica quanto prática no desenvolvimento em Java. Tendo compre-
endido como esse recurso opera e como ele fundamenta a construção de
hierarquias de classes, avançaremos agora para a discussão da sobrescrita de
métodos, que permite às subclasses redefinirem comportamentos herdados
para atenderem às suas próprias necessidades e sustenta o polimorfismo
em tempo de execução.
Sobrescrita em subclasses
A sobrescrita de métodos é um dos mecanismos centrais da POO e desempenha
papel determinante no comportamento dinâmico dos sistemas desenvolvi-
dos em Java. Em síntese, a sobrescrita (ou method overriding) consiste na
capacidade que uma subclasse possui de redefinir um método herdado da
superclasse, fornecendo uma implementação mais específica para seu con-
texto. Como afirmam Deitel e Deitel (2010), esse recurso permite que objetos
de subclasses respondam de maneira diferenciada às mesmas mensagens
enviadas a um tipo mais geral, viabilizando o polimorfismo e reforçando o
princípio de especialização dentro das hierarquias de classes.
Do ponto de vista técnico, a sobrescrita ocorre quando um método da
subclasse tem a mesma assinatura que o método da superclasse. A assinatura
de um método, segundo Horstmann (2021), é composta pelo nome do método
e pela lista de parâmetros (quantidade, ordem e tipos). O tipo de retorno não
faz parte da assinatura em Java para fins de sobrescrita — embora precise
ser compatível com o elemento que o esteja solicitando. Por exemplo, se a
superclasse Pessoa possui um método exibirDados(), uma subclasse como
Aluno pode sobrescrevê-lo para incluir informações adicionais, desdeque
mantenha exatamente a mesma assinatura. Esse alinhamento é essencial: caso
o número ou o tipo dos parâmetros seja alterado, não ocorrerá sobrescrita, e
sim sobrecarga de métodos (overloading), outro mecanismo da linguagem. Essa
distinção costuma gerar confusões entre iniciantes, pois ambos os recursos
envolvem métodos com nomes iguais, mas funcionam de forma diferente.
A distinção entre sobrecarga e sobrescritas é importante. A sobrecarga,
como enfatizam Ascencio e Campos (2012), ocorre quando métodos com o
mesmo nome coexistem dentro de uma mesma classe, desde que possuam
assinaturas distintas. Trata-se de um recurso estático, resolvido em tempo de
Sobrescrita 5
compilação, ao passo que a sobrescrita é um recurso dinâmico que depende
da instância real do objeto em tempo de execução. Bigonha (2021) argumenta
que essa diferença afeta diretamente o fluxo de chamada dos métodos, uma
vez que o mecanismo de sobrescrita pressupõe uma resolução tardia (late
binding), essencial para o polimorfismo. Por isso, métodos sobrescritos são
escolhidos pelo tipo real do objeto — e não pelo tipo da referência que o
aponta.
Anotação @Override
Em Java, a sobrescrita é reforçada pela anotação @Override. Deitel e Deitel
(2010) destacam que essa anotação auxilia na detecção de erros em tempo
de compilação, prevenindo situações em que o programador acredita estar
sobrescrevendo um método, mas na verdade está criando outro, devido a
diferenças sutis de assinatura. O compilador, ao identificar a anotação, verifica
se o método realmente existe na superclasse. É, portanto, uma medida de
segurança que melhora a qualidade do código.
A sobrescrita também está diretamente relacionada ao mecanismo de
polimorfismo, o qual permite que um mesmo método produza comporta-
mentos diferentes dependendo da subclasse que o implementa. Horstmann
(2021) explica que isso ocorre porque, ao chamar um método por meio de uma
referência do tipo superclasse, Java verifica, em tempo de execução, qual é
o tipo efetivo do objeto apontado, selecionando o método adequado. Essa
dinâmica está representada no fluxo de execução interno da Java Virtual Ma-
chine (JVM), responsável por compilar e interpretar os códigos em linguagem
de programação Java, que associa métodos específicos a objetos particulares,
garantindo flexibilidade e adaptabilidade às aplicações.
A sobrescrita é especialmente útil quando se deseja adaptar ou espe-
cializar comportamentos herdados, adicionando detalhes ou ajustando
funcionalidades às necessidades da subclasse. Por exemplo, considere uma
superclasse ContaBancaria contendo um método calcularTarifa().
Uma subclasse ContaEstudantil pode sobrescrever o método para aplicar
regras específicas, como isenções. Esse é um caso típico de especialização
por sobrescrita, amplamente utilizado em sistemas de grande porte, como
aplicações financeiras, educacionais e corporativas.
Apesar de suas vantagens, a sobrescrita exige cuidado no planejamento
da hierarquia de classes. Sierra, Bates e Gee (2024) alertam que nem sempre
a herança e a sobrescrita são as melhores escolhas, especialmente quando
induzem a acoplamentos rígidos entre subclasses e superclasses. Em algumas
Sobrescrita6
situações, pode ser mais adequado utilizar composição, interfaces ou padrões
de projeto, como Strategy, para permitir variação de comportamento sem
depender diretamente de heranças profundas.
Além disso, é importante compreender que métodos marcados como final
não podem ser sobrescritos. Essa restrição, segundo Deitel e Deitel (2010), é
justificada pela necessidade de evitar modificações indevidas em métodos cuja
integridade é considerada essencial para o funcionamento correto da classe
ou do framework. Do mesmo modo, classes definidas como final também
podem ser estendidas. Um exemplo clássico é a classe String da linguagem
Java. Por ser final, ela não permite que outras classes herdem dela, o que
impede qualquer tipo de sobrescrita de seus métodos. Essa medida evita usos
inadequados e garante a consistência do comportamento dessas classes em
diferentes contextos do sistema.
A sobrescrita só ocorre quando toda a assinatura do método é
idêntica à da superclasse. Se houver qualquer alteração na lista
de parâmetros, mesmo que mínima, Java interpretará como sobrecarga, e não
como sobrescrita. Essa é uma das causas mais frequentes de bugs em códigos
escritos por iniciantes.
A sobrescrita de métodos constitui um dos mecanismos mais poderosos
da POO, permitindo a adaptação e a especialização de comportamentos de
forma segura e estruturada. Ao compreender sua relação com a assinatura
do método, com o polimorfismo e com o processo de resolução dinâmica, o
estudante passa a dominar um dos elementos centrais do desenvolvimento
orientado a objetos em Java. Esse conhecimento é essencial para avançarmos à
próxima seção, na qual construiremos um exemplo prático completo, aplicando
herança e sobrescrita em um pequeno aplicativo funcional.
Exemplo prático
A compreensão dos conceitos de herança e sobrescrita se torna significativa-
mente mais clara quando aplicada a um caso concreto. Por essa razão, esta
seção apresenta a construção passo a passo de um pequeno aplicativo em
Java que utiliza uma hierarquia de classes e o mecanismo de sobrescrita de
métodos. A prática de implementação, como ressaltam Deitel e Deitel (2010),
Sobrescrita 7
é fundamental para consolidar o entendimento das estruturas de POO, pois
permite observar como o comportamento dos objetos se altera em tempo de
execução. Seguindo essa abordagem, desenvolveremos um exemplo simples,
mas pedagógico, baseado em uma situação do cotidiano: um sistema que
representa diferentes tipos de animais e seus sons característicos.
A escolha desse domínio se justifica por sua adequação didática. Como
observa Horstmann (2021), exemplos com entidades do mundo real auxiliam
na assimilação dos conceitos de herança e especialização, pois reproduzem
relações naturais de generalização e particularização. Dessa forma, defini-
remos uma superclasse genérica Animal, da qual derivam as subclasses
Cachorro e Gato. Cada subclasse sobrescreverá o método herdado emi-
tirSom(), implementando-o de acordo com seu comportamento específico.
O propósito é demonstrar como a sobrescrita possibilita que objetos de tipos
distintos respondam de forma diferente a uma mesma chamada de método,
reforçando o entendimento do polimorfismo.
Antes de iniciar a análise detalhada do código, é importante destacar que,
conforme discutido por Bigonha (2021), estruturas simples e bem modeladas
facilitam a identificação das vantagens da modularidade orientada a objetos,
sobretudo quando o foco recai sobre o reuso e a especialização estruturada
do comportamento dos objetos. Portanto, o exemplo apresentado a seguir
foi cuidadosamente elaborado para manter clareza, coesão e alinhamento
com as boas práticas de projeto.
// Superclasse
class Animal {
public void emitirSom() {
System.out.println("O animal faz um som.");
}
}
// Subclasse 1
class Cachorro extends Animal {
@Override
public void emitirSom() {
System.out.println("O cachorro late: Au au!");
}
}
Sobrescrita8
// Subclasse 2
class Gato extends Animal {
@Override
public void emitirSom() {
System.out.println("O gato mia: Miau!");
}
}
// Classe principal
public class TesteHeranca {
public static void main(String[] args) {
Animal a1 = new Animal();
Animal a2 = new Cachorro();
Animal a3 = new Gato();
a1.emitirSom(); // Executa o método da superclasse
a2.emitirSom(); // Executa o método sobrescrito
em Cachorro
a3.emitirSom(); // Executa o método sobrescrito
em Gato
}
}
Ao executar o programa, temos a seguinte saída no console:
� O animal faz um som.
� O cachorro late: Au au!
� O gato mia: Miau!
O código do exemplo apresenta três classes organizadas em uma relação
clara de herança. A classeAnimal atua como superclasse, fornecendo a im-
plementação padrão do método emitirSom(). As classes Cachorro e Gato
utilizam a palavra-chave extends para estabelecer o vínculo de herança,
herdando todos os métodos e atributos públicos da superclasse. Esse padrão
segue o modelo apresentado por Horstmann (2021), que reforça a importância
da herança como mecanismo de generalização e especialização no projeto
de sistemas orientados a objetos.
A sobrescrita ocorre explicitamente nas subclasses Cachorro e Gato,
que redefinem o método emitirSom() para refletir comportamentos mais
específicos. É importante notar o uso da anotação @Override, que, conforme
discutido por Deitel e Deitel (2010), auxilia o compilador na verificação da
correta reescrita do método da superclasse, evitando erros comuns quando
há discrepâncias na assinatura do método. Ao sobrescrever o método, cada
Sobrescrita 9
subclasse passa a fornecer sua própria versão do comportamento herdado,
demonstrando claramente o papel da especialização.
O método main() é responsável por testar o comportamento polimórfico
do sistema. Três referências do tipo Animal são criadas, mas apenas a primeira
aponta para um objeto efetivamente do tipo Animal. As demais apontam
para objetos das subclasses Cachorro e Gato. Essa estratégia evidencia o
princípio do polimorfismo: mesmo utilizando referências do tipo genérico
(Animal), a JVM identifica, em tempo de execução, qual método deve ser
invocado com base no tipo real do objeto, e não no tipo da referência. Bigonha
(2021) destaca que essa capacidade de alteração dinâmica do comportamento
é uma das características mais poderosas e flexíveis da orientação a objetos.
O resultado confirma o funcionamento da sobrescrita: embora as refe-
rências sejam todas do tipo Animal, os métodos executados são aqueles
definidos nas subclasses. Esse comportamento demonstrado na Figura 2
exemplifica perfeitamente o conceito de despacho dinâmico, apresentado por
Horstmann (2021), que descreve como a JVM seleciona o método apropriado
com base no tipo do objeto instanciado. Dessa forma, o exemplo reforça a
importância da combinação entre herança e sobrescrita para a construção
de sistemas flexíveis e capazes de lidar com múltiplas especializações sem
necessidade de condicionais extensas ou duplicação de código.
Figura 2. Diagrama UML representando a hierarquia Animal → Cachorro/Gato e a
sobrescrita de métodos.
Fonte: próprio autor.
Sobrescrita10
Com este exemplo prático, fica evidente como a herança e a sobrescrita
se articulam para promover a reutilização de código, a especialização de
comportamentos e a implementação do polimorfismo em Java. A clareza na
definição das classes, a compatibilidade das assinaturas e o uso consciente
do despacho dinâmico tornam o desenvolvimento orientado a objetos mais
robusto e expressivo.
Neste capítulo, aprofundamos os fundamentos da POO, destacando a
herança como mecanismo essencial para o reuso e a organização modular
do código, e a sobrescrita de métodos como ferramenta central para es-
pecialização e polimorfismo. Exploramos desde os conceitos teóricos até
a implementação prática em Java, evidenciando como a correta aplicação
desses recursos permite construir sistemas flexíveis, extensíveis e alinhados
às necessidades reais do desenvolvimento de software. Ao dominar herança
e sobrescrita, o estudante está preparado para enfrentar desafios de mo-
delagem, manutenção e evolução de aplicações, consolidando uma base
sólida para avançar em temas mais complexos da engenharia de software
orientada a objetos.
Referências
ASCENCIO, A. F. G.; CAMPOS, E. A. V. Fundamentos da programação de computadores:
algoritmos, Pascal, C/C++ e Java. 3. ed. São Paulo: Pearson Education do Brasil, 2012.
BIGONHA, R. S. Programação modular: a linguagem Java (SE 14). Belo Horizonte: Ed.
do Autor, 2021.
DEITEL, P.; DEITEL, H. Java: como programar. 8. ed. São Paulo: Pearson Prentice Hall, 2010.
HORSTMANN, C. S. Core Java: fundamentals. 12. ed. Boston: Pearson Education, 2021. v. 1.
SIERRA, K.; BATES, B.; GEE, T. Use a cabeça Java: guia do aprendiz para programação no
mundo real. 3. ed. Rio de Janeiro: Alta Books, 2024. E-book.
Leituras recomendadas
BLOCH, J. Effective Java. 3. ed. Boston: Addison-Wesley, 2018.
FREEMAN, E.; ROBSON, E. Head first design patterns. 2. ed. Boston: O’Reilly Media, 2021.
Sobrescrita 11
Dica do Professor
A implementação da sobrescrita de método na POO exige a definição prévia de herança e classes,
incluindo a superclasse e suas subclasses. Com a sobrescrita é possível alterar o comportamento
das subclasses e criar novos códigos com base no código-base do programa.
Nesta Dica do Professor, é possível aprender a como implementar a sobrescrita de método em
Java, utilizando os recursos e componentes da linguagem para conduzir esse processo.
Compreender como realizar a sobrescrita é fundamental para a construção de programas mais
flexíveis e eficientes, que possam ser facilmente adaptados e estendidos de acordo com as
necessidades específicas de cada projeto. A sobrescrita de método é uma das principais técnicas
em POO e pode ser aplicada em diferentes linguagens de programação.
As imagens do vídeo a seguir possuem audiodescrição. Para acessar o recurso,
clique aqui
Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar.
https://creator-files.plataforma.grupoa.education/undefined/9113_Audiodescricao_Dica_Professor-2026-04-22T10:51:43-03:00.pdf
https://fast.player.liquidplatform.com/pApiv2/embed/cee29914fad5b594d8f5918df1e801fd/44220c08faa3d316b15a83e6f2e020fa
Exercícios
1) A sobrescrita permite aplicar a modelagem sobre diagramas de classes e suas definições.
Além disso, pode ser elaborada considerando a declaração de nome de uma classe com uma
ou mais subclasses atribuídas a si.
Um método pode ser sobrescrito apenas quando:
A) tem o modificador de acesso private.
B) tem o mesmo nome da classe à qual pertence.
C) é um construtor.
D) é acessível.
E) tem o mesmo tipo de retorno.
2) Em alguns casos, existe a necessidade de herdar habilidades em Java, porém é necessário
garantir a possibilidade e personalizá-las. A herança deve considerar a mudança de
comportamento entre as classes.
Nesse contexto, ao sobrescrever um método adotado pela linguagem de programação Java
e outras orientadas a objeto, é necessário considerar que o ato praticado será:
A) substituir a implementação do método da superclasse.
B) escrever um método herdado com o mesmo tipo de retorno, mas com nome diferente.
C) atribuir assinaturas diferentes; todavia, a implementação deve ser igual.
D) garantir que as assinaturas e as implementações sejam diferentes daquelas na superclasse.
E) escrever o método com mesmo nome, modificando apenas seus parâmetros.
3) Métodos representam uma parte essencial na POO, utilizados para que seja possível
consultar e alterar atributos elencados aos objetos.
Sobre as características de um método na sobrescrita, é correto afirmar que:
A) os métodos que sobrescrevem não têm especificadores de acesso.
B) uma subclasse não pode alterar o acesso aos métodos da superclasse.
C) um método declarado como protected na superclasse pode ser declarado public na subclasse.
D) um método declarado como protected na superclasse pode ser declarado private na subclasse.
E) o método que sobrescreve não pode ser final.
4) Em Java, implementar classes é possível por meio de palavras-chaves. Para definir classes
públicas, é necessário declarar a classe por meio do comando public class; já para modificar o
acesso do método utiliza-se public void.
Considerando as informações repassadas, analise o código a seguir:
public class Animal{
public void locomover(){
System.out.println("Se locomove");
}
}
public class Peixe extendas Animal {
public void locomover(){
System.out.println("Nada");
}
}
Ao analisar o código, está correto afirmar que:
A) a classe Animalé uma subclasse de Peixe.
B) a classe Peixe é uma classe genérica.
C) ao instanciar a classe Peixe e, por meio de uma variável de referência, chamar o método
locomover(), a saída que se tem é: Se locomove.
D) ao instanciar a classe Peixe e, por meio de uma variável de referência, chamar o método
locomover(), a saída que se tem é: Nada.
E) o método locomover(), herdado pela subclasse Animal, foi sobrescrito, pois sua assinatura e
seu comportamento foram alterados.
5) A sobrescrita utiliza um conjunto de modificadores para definir o conceito de herança.
Em relação à herança e à sobrescrita, é correto afirmar que:
A) a sobrescrita de métodos permite estender um código existente.
B) um método pode ser sobrescrito somente se for acessível.
C) o método da subclasse não sobrescreve o método private da superclasse.
D) invocações de métodos private sempre invocam a implementação do método declarado na
classe atual.
E) uma invocação externa do método da subclasse, acessível fora de sua classe, resulta na
invocação da implementação da superclasse.
Na prática
A partir da sobrescrita, é possível especializar os métodos e a forma como eles são herdados entre
as classes, alternando o comportamento dos elementos de um código. O método sobrescrito
basicamente fornece uma nova versão de determinada propriedade considerando as características
da classe-pai, praticando a herança, mantendo a assinatura e garantindo o vínculo entre elas.
Neste Na Prática, você vai ver um exemplo que ilustra como a sobrescrita é utilizada na POO para
resolver problemas e desenvolver soluções mais flexíveis e adaptáveis.
A imagem a seguir possui audiodescrição.
Aponte a câmera para o
código e acesse o link do
conteúdo ou clique no
código para acessar.
https://statics-marketplace.plataforma.grupoa.education/sagah/706caed0-5fc4-4f4c-8814-a0dc7ddbb058/03695d30-643f-410d-bd62-94064f86672d.png
Saiba mais
Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do professor:
Sobrecarga e sobreposição de métodos em orientação a objetos
Veja, neste vídeo, como funcionam a sobrecarga e a sobreposição de métodos em orientação a
objetos e como esses dois conceitos podem ajudar você na hora de programar.
Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar.
Definições e termos de Java e orientação a objetos
Neste artigo, você pode revisar os principais contextos e termos utilizados na POO e na linguagem
Java. Você vai ver conceitos sobre sobrescrita, assinatura, classes e métodos, além de códigos que
aplicam os conceitos na prática.
Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar.
Polimorfismo com sobrescrita
Acompanhe no Capítulo 8, Polimorfismo e coerções (p. 302), da obra a seguir. Você pode
aprofundar seus conhecimentos sobre o uso do polimorfismo, incluindo a sobrescrita e tipo objeto
versus tipo referência.
Conteúdo interativo disponível na plataforma de ensino!
https://www.youtube.com/embed/BIB3lbzHWcQ
https://guilherme-manzano.medium.com/defini%C3%A7%C3%B5es-e-termos-de-java-e-orienta%C3%A7%C3%A3o-a-objetos-2d14832acce5