NEW
Font size
WorksheetsProgramação Orientada a Objetos
Total questions: 50
Worksheet time: 25mins
Leia o texto: "A Máquina Virtual Java (JVM) é o ambiente de execução para programas Java; ela interpreta ou compila just-in-time os bytecodes gerados pelo compilador javac. Os bytecodes são uma representação intermediária e portátil do programa Java, permitindo a execução em diferentes plataformas. O paradigma de orientação a objetos (POO) é um modelo de programação baseado em objetos que encapsulam estado e comportamento. Em Java, classes definem o formato dos objetos e métodos definem comportamentos. A JVM gerencia a memória, incluindo heap e garbage collection, para objetos criados em tempo de execução. A portabilidade do bytecode é um princípio-chave que diferencia Java de linguagens compiladas diretamente para código nativo. Programadores iniciantes precisam compreender a separação entre tempo de compilação (bytecode) e tempo de execução (JVM). Entender essa distinção auxilia no diagnóstico de problemas de compatibilidade entre versões." Com base no texto, assinale a alternativa correta quanto à portabilidade e execução de programas Java.
O bytecode é específico de cada arquitetura de hardware e precisa ser recompilado para cada plataforma.
A JVM permite executar o mesmo bytecode em diferentes plataformas, garantindo portabilidade.
A compilação em Java gera diretamente código nativo, dispensando a JVM.
O garbage collector da JVM transforma bytecode em código nativo.
O POO impede a utilização de bytecodes na JVM.
Considere o resumo: "Em Java, os tipos primitivos incluem byte, short, int, long, float, double, char e boolean. Cada tipo possui um tamanho e faixa de valores bem definidos na especificação Java. Operadores aritméticos aplicam-se a tipos numéricos; operadores relacionais (==, !=, <, >, <=, >=) servem para comparações; operadores lógicos (&&, ||, !) combinam expressões booleanas. Conversões entre tipos primitivos podem ocorrer implicitamente (widening) ou explicitamente (casting). Operações entre tipos diferentes geralmente promovem o menor para o tipo de maior capacidade. Erros de overflow não geram exceção em tipos inteiros e o valor simplesmente transborda. É preciso atenção à precisão com float/double e ao uso de operadores em expressões que envolvem conversões." Analise as proposições: I. O tipo int em Java tem tamanho fixo de 32 bits. II. A operação 1 / 2, quando ambos os operandos são int, resulta em 0. III. Uma conversão explícita pode causar perda de informação ao se converter double para int. IV. Em Java, boolean pode ser implicitamente convertido em int. Assinale a alternativa correta.
I e II apenas.
II e III apenas.
I, II e III apenas.
III e IV apenas.
I, II, III e IV.
Segundo o texto, qual afirmação está correta sobre o switch no Java moderno?
O switch não aceita String em nenhuma versão do Java.
O switch pode aceitar String desde o Java 7.
O switch não precisa de break porque sempre encerra cada case automaticamente.
O switch aceita qualquer tipo de objeto como expressão de seleção.
O switch substitui completamente a necessidade de if-else.
Considere as afirmações sobre laços em Java:
I. Um do-while sempre executa seu corpo pelo menos uma vez.
II. O comando continue em um for pula diretamente para a execução do incremento e reavaliação da condição.
III. O comando break com rótulo pode interromper um laço externo.
IV. O comando return dentro de um laço encerra apenas a iteração atual do laço, continuando o método.
Assinale a alternativa correta.
I e II apenas.
II e III apenas.
I, II e III apenas.
III e IV apenas.
I, II, III e IV.
Sobre classes e objetos em Java: atributos static pertencem à classe e são compartilhados por todas as instâncias; construtores inicializam objetos e, se nenhum for definido, o compilador fornece um construtor padrão sem argumentos; o encapsulamento combina atributos privados com métodos públicos de acesso; e métodos podem ser sobrecarregados. Assinale a alternativa correta.
Atributos static são únicos por classe e compartilhados entre todas as instâncias.
Construtores nunca podem ser sobrecarregados em Java.
Getters e setters sempre quebram o princípio de encapsulamento.
O compilador nunca cria um construtor padrão automaticamente.
Métodos static podem acessar diretamente atributos de instância sem referência a um objeto.
O encapsulamento em Java utiliza modificadores de acesso (private, protected, public e acesso de pacote/default). O modificador private restringe o acesso à própria classe; protected permite acesso à mesma classe, subclasses e classes do mesmo pacote; public permite acesso por qualquer código; e o acesso default permite acesso dentro do mesmo pacote. Considere as afirmações: I. private impede o acesso direto ao membro por classes fora da mesma classe, mesmo que sejam subclasses. II. protected permite acesso em subclasses localizadas em pacotes diferentes. III. O modificador public permite acesso de qualquer classe, independentemente do pacote. IV. O acesso default (sem modificador) permite acesso apenas por classes no mesmo pacote. Assinale a alternativa correta: A) I e II, apenas. B) II e III, apenas. C) I, II e IV, apenas. D) III e IV, apenas. E) I, II, III e IV.
I e II, apenas.
II e III, apenas.
I, II e IV, apenas.
III e IV, apenas.
I, II, III e IV.
Construtores em Java têm o mesmo nome da classe e podem ser sobrecarregados. Um construtor pode chamar outro da mesma classe usando this(...) como primeira instrução. Se nenhuma declaração de construtor existir, o compilador fornece um construtor padrão sem argumentos. Considerando o texto, assinale a alternativa correta:
Um construtor pode chamar outro construtor da mesma classe usando this(...) em qualquer posição do corpo.
Se nenhum construtor for declarado, o compilador fornece automaticamente um construtor padrão.
Construtores não podem ser sobrecarregados em Java.
private é um modificador inválido para construtores.
this não pode ser usado em construtores para diferenciar parâmetros de atributos.
Conversões entre tipos primitivos podem ser implícitas (widening) ou explícitas (casting). Entre objetos, conversões exigem compatibilidade de herança ou interfaces e podem lançar ClassCastException se incorretas. Para comparar objetos, == verifica identidade (referência), enquanto equals() deve verificar igualdade de conteúdo quando sobrescrito adequadamente. Considere a afirmação: "== compara referências quando usado entre objetos". Classifique-a.
Verdadeira.
Falsa.
Considere as afirmações sobre Java:
II. O método equals(), por padrão na classe Object, compara o conteúdo das instâncias.
III. Converter um objeto para um tipo incompatível pode lançar ClassCastException.
IV. Sempre que equals() é sobrescrito, deve-se também sobrescrever hashCode().
Assinale a alternativa correta.
I e III, apenas.
II e IV, apenas.
I, III e IV, apenas.
III e IV, apenas.
I, II, III e IV
Leia o texto: "Herança em Java permite que uma classe (subclasse) herde atributos e métodos de outra (superclasse). A palavra-chave extends define herança entre classes; implements define que uma classe fornece implementações para métodos de uma interface. Sobrescrever (override) métodos da superclasse permite comportamento especializado na subclasse. Métodos final não podem ser sobrescritos; classes final não podem ter subclasses. A chamada a super() em um construtor invoca o construtor da superclasse; se omitida explicitamente, o compilador insere uma chamada ao construtor padrão sem argumentos da superclasse. A herança deve ser usada quando há relação de tipo "é-um" (is-a) para modelar corretamente hierarquias." Segundo o texto, marque a afirmativa correta.
Um método final pode ser sobrescrito pela subclasse.
A chamada a super() em construtores é opcional apenas quando a superclasse possui um construtor padrão sem argumentos.
extends é usado para declarar que uma classe implementa uma interface.
Classes final podem servir como superclasses para outras classes.
Herança é utilizada para modelar relações "tem-um" (has-a).
Considere o texto: "Classes abstratas podem declarar métodos abstratos (sem implementação) e métodos concretos; não podem ser instanciadas. Interfaces declaram métodos (antes do Java 8 eram todos abstratos), mas desde o Java 8 podem ter métodos default com implementação e métodos static. Uma classe que implementa uma interface deve fornecer implementações para seus métodos abstratos, a menos que seja abstract. Interfaces permitem múltipla 'herança' de tipo, enquanto Java não permite múltiplas heranças de classes concretas. Projetar APIs limpas muitas vezes envolve usar interfaces para separar contrato de implementação." Analise as alternativas: I. Uma classe abstrata pode ter métodos com implementação. II. Interfaces Java nunca puderam conter métodos com implementação. III. Uma classe pode implementar várias interfaces. IV. Uma interface pode ser instanciada diretamente com new. Assinale a alternativa correta.
I e III apenas.
II e IV apenas.
I, II e III apenas.
III e IV apenas.
I, II, III e IV
Texto: pode propagar certas exceções. Projetar o tratamento correto de exceções evita o vazamento de recursos e torna o comportamento do sistema previsível. É prática comum fechar recursos em finally ou usar try-with-resources (desde Java 7) para automatizar o fechamento.
Com base no texto, assinale a alternativa correta.
finally é executado apenas se nenhuma exceção for lançada.
throw é usado para declarar que um método pode lançar uma exceção.
Exceções verificadas devem ser tratadas ou declaradas com throws.
try-with-resources foi introduzido em Java 5.
RuntimeException é uma exceção verificada.
Respostas Múltiplas (Tópicos: 5 — throw vs throws, diferenciação)
Texto: A instrução throw é usada dentro do corpo de um método para lançar (instanciar e propagar) uma exceção. O uso de throws aparece na assinatura do método para indicar que o método pode repassar determinadas exceções verificadas para o chamador. Exceções verificadas (por exemplo, IOException) obrigam o programador a tratar ou declarar throws; RuntimeException e suas subclasses são não verificadas. Lançar exceções apropriadas ajuda a tornar o comportamento de erro explícito e legível. Entender a diferença entre propagar e lançar é importante para a correta documentação e tratamento de erros.
Analise as alternativas:
I. throw efetivamente lança uma instância de Throwable.
II. throws na assinatura do método impede que o método lance exceções.
III. throws declara que o método pode propagar exceções para o chamador.
IV. throw e throws são intercambiáveis.
Assinale a alternativa correta:
I e III, apenas.
II e IV, apenas.
I, II e III, apenas.
III e IV, apenas.
I, II, III e IV.
Interpretação (Tópicos: 6 — Coleções e estruturas de dados)
Texto: O framework de coleções em Java oferece várias implementações, como ArrayList, LinkedList, HashSet, TreeSet, HashMap e TreeMap. Cada estrutura possui características distintas de complexidade e comportamento: ArrayList é baseada em array dinâmico, com acesso O(1) por índice; LinkedList é eficiente em inserções/exclusões nas extremidades; HashSet e HashMap utilizam hashing para acesso amortizado O(1); TreeSet e TreeMap mantêm ordem e têm operações O(log n). A escolha da coleção correta depende dos requisitos de ordenação, duplicidade e complexidade. Iteradores e a API Collections fornecem utilitários para manipulação. A conformidade de chave/valor requer implementação adequada de equals() e hashCode() para coleções baseadas em hashing.
De acordo com o texto, marque a alternativa correta.
ArrayList fornece acesso por índice em tempo O(1) amortizado.
TreeMap usa hashing para obter acesso O(1).
HashSet mantém elementos em ordem crescente natural.
LinkedList e ArrayList têm desempenho idêntico para acesso por índice.
HashMap garante ordem de inserção dos pares chave-valor.
No desenvolvimento Java, recomenda-se separar responsabilidades em camadas por meio de interfaces. Camadas claras evitam acoplamento excessivo e promovem reutilização. Frameworks e padrões (DAO, Service) ajudam a organizar responsabilidades, e a comunicação entre camadas pode ocorrer por DTOs para evitar a exposição direta de entidades de persistência. Analise as alternativas:
I. Separar em camadas melhora a testabilidade e manutenção.
II. DTOs são usados para evitar acoplamento entre camadas.
III. Implementação progressiva incentiva construir todas as camadas simultaneamente para rapidez.
IV. Padrões como DAO ajudam a isolar a lógica de persistência.
Assinale a alternativa correta:
I e II, apenas.
II e III, apenas.
I, II e IV, apenas.
III e IV, apenas.
I, II, III e IV.
Interpretação (Tópicos: 7 — Programação visual e eventos). A programação de interfaces gráficas em Java tradicionalmente utiliza Swing/AWT para componentes como frames, menus, botões e modelos de eventos. O modelo de eventos segue o padrão de listeners, onde objetos se registram para receber notificações (por exemplo, ActionListener para botões). Applets foram uma tecnologia histórica para embutir aplicações Java em navegadores, mas estão obsoletas em contextos modernos. Ferramentas como Eclipse fornecem editores visuais que agilizam a montagem de interfaces, embora o entendimento do ciclo de eventos e da thread de UI (Event Dispatch Thread) seja crucial para evitar o congelamento da interface. Navegar entre frames e gerenciar estados requer controle cuidadoso de visibilidade e recursos. Segundo o texto, assinale a alternativa correta:
Applets continuam sendo a forma recomendada para aplicações web modernas.
O modelo de eventos utiliza listeners para notificação de ações do usuário.
O Event Dispatch Thread pode ser ignorado sem risco de congelamento da GUI.
O Eclipse não fornece recursos para desenvolvimento visual de interfaces.
Navegar entre frames em Java é impossível sem bibliotecas externas.
Respostas Múltiplas (Tópicos: 7 — Frames, menus e navegação). Em aplicações Java desktop, JFrame é a janela básica em Swing; menus são criados com JMenuBar, JMenu e JMenuItem. Para navegar entre telas, desenvolvedores podem trocar JPanels em um JFrame usando CardLayout ou criar múltiplos frames e controlar a visibilidade. A seleção do layout manager (BorderLayout, FlowLayout, GridLayout, etc.) influencia o posicionamento e o redimensionamento dos componentes. É importante manipular a interface na Event Dispatch Thread usando SwingUtilities.invokeLater quando necessário. O tratamento de eventos de menu segue o mesmo padrão de listeners que botões. Analise as alternativas: I. JFrame é comumente usado como janela principal em aplicações Swing. II. CardLayout facilita a alternância entre diferentes painéis em um mesmo frame. III. JMenuBar é usado para criar menus; JMenuItem representa um item no menu. IV. Layout managers não influenciam o comportamento de redimensionamento dos componentes. Assinale a alternativa correta:
I e II apenas.
II e III apenas.
I, II e III apenas.
Interpretação (Tópicos: 8 — Java e Banco de Dados, JDBC)
Java acessa bancos de dados relacionais tipicamente via JDBC (Java Database Connectivity), uma API que permite conectar-se, enviar consultas SQL e manipular resultados. É preciso configurar drivers JDBC específicos para cada SGBD e fornecer URL de conexão, usuário e senha. Operações de persistência envolvem Connection, Statement/PreparedStatement e ResultSet. PreparedStatement ajuda a prevenir SQL injection e melhora a performance em consultas repetidas. O gerenciamento de conexões (por exemplo, pools) é crucial para escalabilidade; abrir e fechar recursos corretamente evita vazamentos. Mapeadores objeto-relacional (ORM) facilitam a tradução entre objetos Java e tabelas do banco, reduzindo o boilerplate.
Pelo texto, assinale a alternativa correta.
JDBC não requer drivers específicos para cada SGBD.
PreparedStatement ajuda a prevenir injeção de SQL e pode melhorar a performance.
ResultSet representa a conexão com o banco de dados.
Pools de conexão prejudicam a escalabilidade de aplicações.
ORM é incompatível com Java.
Analise as alternativas:
I. Um JavaBean deve ter um construtor público sem argumentos para ser manipulado por ferramentas visuais.
II. Getters e setters são convenções obrigatórias para propriedades de JavaBean.
III. JavaBeans nunca podem ser serializados.
IV. A introspecção de beans permite que ferramentas listem propriedades e eventos.
Assinale a alternativa correta:
I e II, apenas.
II e III, apenas.
I, II e IV, apenas.
III e IV, apenas.
I, II, III e IV.
Interpretação (Tópicos: 1 e 3 — Bytecode, classes e objetos)
O compilador Java traduz o código-fonte .java em bytecode .class. Cada classe compilada resulta em um arquivo .class contendo bytecodes que descrevem membros (atributos e métodos). Em tempo de execução, a JVM carrega classes sob demanda por meio de carregadores de classe (class loaders). Objetos são instâncias dessas classes alocadas no heap, e métodos são invocados conforme a tabela de métodos da classe. A reflexão (Reflection API) permite inspeção dinâmica de classes e objetos em tempo de execução, possibilitando invocar métodos e acessar campos mesmo sem conhecimento em tempo de compilação. Entender o pipeline fonte → bytecode → execução ajuda a depurar problemas como NoClassDefFoundError.
Com base no texto, assinale a alternativa correta.
Cada arquivo .class contém bytecode para exatamente uma classe compilada.
O carregador de classes (class loader) tem papel irrelevante na execução Java.
Reflection em Java permite invocar métodos sem conhecimento estático das assinaturas.
Objetos não são alocados no heap pela JVM.
.java é o formato binário gerado pela JVM.
Respostas Múltiplas (Tópicos: 2 e 3 — Operadores, retorno e parâmetros)
Em Java, métodos definem assinaturas com tipos de retorno e parâmetros. O uso de void indica ausência de retorno; retornos incompatíveis com a assinatura causam erro de compilação. Parâmetros em Java são passados por valor; para tipos primitivos copia-se o valor, para referências copia-se a referência (o objeto referenciado não é clonado). Operadores unários e binários alteram o valor de expressões, e o posicionamento de operadores de incremento (++i vs i++) modifica o valor retornado em expressões. Programadores precisam conhecer a semântica de passagem por valor para evitar erros ao manipular objetos em métodos.
Analise as alternativas:
I. Em Java, argumentos são passados por valor — referências também são passadas por valor.
II. Usar void em uma assinatura indica que o método não retorna nenhum valor.
III. i++ retorna o valor atual e depois incrementa a variável.
IV. Um método declarado com tipo de retorno int pode não conter uma instrução return em todos os caminhos de execução sem erro.
Assinale a alternativa correta:
I e III, apenas.
II e IV, apenas.
I, II e III, apenas.
III e IV, apenas.
I, II, III e IV.
Asserção-Razão (Tópicos: 1 — JVM e bytecodes)
A linguagem Java foi projetada com o princípio da portabilidade: um mesmo programa pode ser executado em diferentes plataformas sem recompilação. Isso é possível graças ao uso de bytecodes, que são instruções intermediárias interpretadas pela Máquina Virtual Java (JVM). O compilador javac gera bytecodes a partir do código-fonte, e a JVM traduz esses bytecodes em instruções específicas da máquina hospedeira em tempo de execução. Essa abordagem difere das linguagens compiladas diretamente para código nativo, como C ou C++. Além da portabilidade, o uso da JVM traz vantagens como segurança, isolamento de execução e gerenciamento automático de memória, mas também introduz certa sobrecarga de desempenho.
Considerando as informações apresentadas, avalie as asserções a seguir e a relação proposta entre elas:
I. A JVM é responsável por garantir a portabilidade do código Java entre diferentes plataformas.
PORQUE
II. O compilador Java gera código nativo específico para cada processador, o que elimina a necessidade de uma máquina virtual.
A respeito dessas asserções, assinale a opção correta:
As asserções I e II são proposições verdadeiras, e a II é uma justificativa correta da I.
As asserções I e II são proposições verdadeiras, mas a II não é uma justificativa correta da I.
A asserção I é uma proposição verdadeira, e a II é uma proposição falsa.
A asserção I é uma proposição falsa, e a II é uma proposição verdadeira.
As asserções I e II são proposições falsas.
Interpretação (Tópicos: 1 — Paradigma de Orientação a Objetos)
O paradigma de orientação a objetos (OO) introduziu uma nova forma de estruturar programas, centrada em entidades chamadas objetos. Esses objetos combinam dados (atributos) e comportamentos (métodos), encapsulando-os em uma unidade coerente. A principal motivação da POO é promover reutilização, modularidade e facilidade de manutenção. Em Java, a programação orientada a objetos é obrigatória, uma vez que toda aplicação é estruturada em classes. Conceitos como herança, polimorfismo e encapsulamento permitem criar hierarquias de classes e definir contratos entre componentes. Essa abordagem difere do paradigma procedural, no qual o foco está em funções e sequências de instruções, e não nas entidades que manipulam os dados.
De acordo com o texto, qual das alternativas expressa corretamente a essência da POO?
A POO busca centralizar o controle do programa em uma função principal.
A POO separa dados e comportamentos em estruturas distintas.
A POO une dados e comportamentos em unidades chamadas objetos.
A POO não permite reutilização de código.
A POO é incompatível com linguagens de tipagem estática, como Java.
Considerando as informações apresentadas, avalie as asserções a seguir e a relação proposta entre elas:
I. Estruturas como if e switch são utilizadas para definir o fluxo condicional de execução de um programa Java.
PORQUE
II. O uso de estruturas condicionais permite que diferentes caminhos de execução sejam escolhidos com base em valores booleanos ou literais.
A respeito dessas asserções, assinale a opção correta:
As asserções I e II são proposições verdadeiras, e a II é uma justificativa correta da I.
As asserções I e II são proposições verdadeiras, mas a II não é uma justificativa correta da I.
A asserção I é uma proposição verdadeira, e a II é uma proposição falsa.
A asserção I é uma proposição falsa, e a II é uma proposição verdadeira.
As asserções I e II são proposições falsas.
Interpretação (Tópicos: 2 — Estruturas de repetição)
Os laços de repetição são essenciais para a execução de tarefas iterativas. Em Java, o for é útil quando o número de repetições é conhecido; o while é usado quando a condição deve ser testada antes da execução; e o do-while garante que o corpo do laço seja executado pelo menos uma vez. Um erro comum é esquecer de atualizar variáveis de controle, o que resulta em loops infinitos. Outro erro é confundir o comportamento de continue e break. A leitura correta das condições e o uso criterioso dessas estruturas são fundamentais para evitar erros lógicos e melhorar a performance do código.
De acordo com o texto, o laço do-while se diferencia dos demais porque:
Executa o corpo zero vezes, se a condição for falsa.
Avalia a condição antes da primeira execução.
Executa o corpo pelo menos uma vez antes de avaliar a condição.
Não permite a utilização de instruções break.
Requer variáveis de controle explícitas obrigatoriamente.
Asserção-Razão (Tópicos: 3 — Classes e objetos)
Classes e objetos constituem o núcleo da programação orientada a objetos em Java. Uma classe é um molde que define atributos e métodos; o objeto é uma instância concreta dessa classe. É possível criar múltiplos objetos a partir de uma mesma classe, cada um com seu próprio estado. O operador new aloca memória e invoca o construtor apropriado. O uso correto de encapsulamento e construtores é essencial para proteger o estado interno e garantir a inicialização consistente dos objetos.
Considerando as informações apresentadas, avalie as asserções a seguir e a relação proposta entre elas:
I. O operador new é utilizado em Java para criar instâncias de classes.
PORQUE
II. O operador new executa automaticamente o método main() de uma classe ao instanciá-la.
A respeito dessas asserções, assinale a opção correta:
As asserções I e II são proposições verdadeiras, e a II é uma justificativa correta da I.
As asserções I e II são proposições verdadeiras, mas a II não é uma justificativa correta da I.
A asserção I é uma proposição verdadeira, e a II é uma proposição falsa.
A asserção I é uma proposição falsa, e a II é uma proposição verdadeira.
As asserções I e II são proposições falsas.
Interpretação (Tópicos: 3 — Encapsulamento e modificadores de acesso)
Encapsulamento é um dos pilares da programação orientada a objetos. Consiste em ocultar os detalhes internos de uma classe e expor apenas o que é necessário para o uso externo, por meio de métodos de acesso (getters e setters). Os modificadores private, protected, public e o acesso de pacote (sem modificador) determinam o nível de visibilidade dos membros. Essa técnica permite controlar o estado interno do objeto e garantir sua integridade. O encapsulamento também favorece a manutenção e o reuso, pois mudanças internas na classe não impactam diretamente outras partes do sistema. Entretanto, o uso excessivo de getters e setters sem critérios pode expor atributos desnecessariamente, enfraquecendo a abstração.
De acordo com o texto, o encapsulamento visa principalmente:
A) Expor todos os detalhes internos da classe para facilitar o acesso.
B) Ocultar detalhes internos e controlar o acesso ao estado do objeto.
C) Eliminar completamente o uso de métodos públicos em uma classe.
D) Impedir a criação de instâncias de objetos.
E) Substituir a herança no modelo orientado a objetos.
Expor todos os detalhes internos da classe para facilitar o acesso.
Ocultar detalhes internos e controlar o acesso ao estado do objeto.
Eliminar completamente o uso de métodos públicos em uma classe.
Impedir a criação de instâncias de objetos.
Substituir a herança no modelo orientado a objetos.
Asserção-Razão (Tópicos: 3 — Construtores e sobrecarga)
Construtores são métodos especiais usados para inicializar objetos em Java. Eles não têm tipo de retorno e seu nome é igual ao da classe. É possível sobrecarregar construtores para permitir diferentes formas de inicialização. Se nenhum construtor for declarado, o compilador gera um construtor padrão sem argumentos. Construtores podem chamar outros da mesma classe usando this() ou de sua superclasse usando super(). A primeira instrução dentro de um construtor deve ser sempre uma dessas chamadas, se utilizadas.
Avalie:
I. A sobrecarga de construtores permite criar múltiplas formas de inicializar um objeto.
Verdadeiro
Falso
Segundo o texto (Tópicos: 4 — Herança): A herança é o mecanismo que permite a criação de novas classes a partir de classes existentes, promovendo reutilização de código e extensibilidade. A classe que herda é chamada subclasse e a classe herdada é chamada superclasse. Métodos e atributos podem ser reaproveitados e estendidos. O uso de super permite acessar elementos da superclasse. Embora poderosa, a herança deve ser usada com cuidado, pois acoplamentos indevidos podem comprometer a manutenção. É importante distinguir herança de composição: a primeira representa uma relação “é-um” (is-a), enquanto a segunda representa uma relação “tem-um” (has-a). De acordo com o texto, a herança deve ser utilizada quando há:
Relação “tem-um” entre duas classes.
Necessidade de compartilhar métodos privados.
Relação “é-um” entre classes, visando à reutilização de código.
Desejo de substituir composição por associação.
Criação de métodos estáticos entre classes distintas.
Avalie asserção–razão (Tópicos: 4 — Polimorfismo): O polimorfismo é a capacidade de um objeto assumir diferentes formas, permitindo que um mesmo método tenha comportamentos distintos dependendo do tipo real do objeto em tempo de execução. Em Java, isso ocorre principalmente quando uma referência de superclasse aponta para um objeto de subclasse. Essa flexibilidade facilita a extensibilidade e a substituição de componentes sem modificar o código que os utiliza. Avalie: I. O polimorfismo em Java permite que uma referência de tipo superclasse invoque métodos sobrescritos em subclasses. Porque II. A ligação dinâmica determina, em tempo de execução, qual implementação de método será executada. A respeito dessas asserções, assinale a opção correta:
As asserções I e II são proposições verdadeiras, e a II é uma justificativa correta da I.
As asserções I e II são proposições verdadeiras, mas a II não é uma justificativa correta da I.
A asserção I é verdadeira, e a II é falsa.
A asserção I é falsa, e a II é verdadeira.
As asserções I e II são falsas.
De acordo com o texto (Tópicos: 4 — Classes abstratas e interfaces): Classes abstratas em Java não podem ser instanciadas, servindo como base para outras classes. Elas podem conter tanto métodos concretos quanto métodos abstratos. Interfaces, por outro lado, definem apenas contratos, especificando o que uma classe deve fazer, sem dizer como. Desde o Java 8, interfaces podem incluir métodos default e static, oferecendo implementações reutilizáveis. Enquanto uma classe só pode estender outra, pode implementar várias interfaces, o que facilita a modelagem de múltiplos comportamentos. De acordo com o texto, o papel principal de uma interface em Java é:
Definir uma hierarquia rígida entre classes concretas.
Fornecer múltiplas implementações automáticas para classes.
Estabelecer contratos de comportamento a serem implementados por classes.
Impedir o uso de herança múltipla.
Substituir completamente o uso de classes abstratas.
Avalie asserção–razão (Tópicos: 4 — Métodos final e classes final): A palavra‑chave final em Java serve para impedir modificações. Quando aplicada a variáveis, torna seu valor constante; a métodos, impede sobrescrita; e a classes, impede herança. Essa restrição é útil para preservar comportamentos e evitar alterações acidentais em componentes críticos, embora seu uso excessivo possa reduzir a flexibilidade de extensões em frameworks e bibliotecas. Avalie: I. O modificador final em um método impede que ele seja sobrescrito por subclasses. Porque II. O modificador final aplicado a uma classe evita que novas subclasses sejam criadas. A respeito dessas asserções, assinale a opção correta:
As asserções I e II são proposições verdadeiras, e a II é uma justificativa correta da I.
As asserções I e II são proposições verdadeiras, mas a II não é uma justificativa correta da I.
A asserção I é verdadeira, e a II é falsa.
A asserção I é falsa, e a II é verdadeira.
As asserções I e II são falsas.
De acordo com o texto (Tópicos: 5 — Tratamento de exceções): O tratamento de exceções em Java permite gerenciar erros de forma estruturada. O bloco try envolve o código que pode gerar exceções; o catch captura exceções específicas; e o finally executa código independentemente de exceção ocorrer ou não. O tratamento adequado evita interrupções inesperadas e melhora a confiabilidade do software. Exceções podem ser hierarquizadas: Exception é a superclasse de todas as exceções verificadas, enquanto RuntimeException cobre exceções não verificadas. Saber distinguir essas categorias ajuda o desenvolvedor a decidir quando tratar e quando propagar exceções. De acordo com o texto, qual é a principal função do bloco finally?
Reexecutar o bloco try em caso de falha.
Garantir a execução de código, ocorra ou não uma exceção.
Substituir o uso de catch na captura de erros.
Interromper o programa quando uma exceção não for tratada.
Declarar exceções verificadas no método.
Avalie asserção–razão (Tópicos: 5 — throw e throws): Em Java, throw e throws têm papéis distintos. A palavra-chave throw é usada para lançar uma exceção dentro de um método. Já throws aparece na assinatura do método, declarando que ele pode propagar uma exceção para o método chamador. Essa distinção é essencial para compreender o fluxo de tratamento de erros, especialmente em métodos que acessam recursos externos. Avalie:
I. O comando throw cria e lança uma exceção durante a execução.
Porque
II. O uso de throws na assinatura de um método indica que ele pode propagar exceções para o chamador.
A respeito dessas asserções, assinale a opção correta:
As asserções I e II são proposições verdadeiras, e a II é uma justificativa correta da I.
As asserções I e II são proposições verdadeiras, mas a II não é uma justificativa correta da I.
A asserção I é verdadeira, e a II é falsa.
A asserção I é falsa, e a II é verdadeira.
As asserções I e II são falsas.
Segundo o texto, qual é a principal vantagem do uso de generics nas coleções Java?
Aumentar o uso de casting em tempo de execução.
Permitir maior segurança de tipos em tempo de compilação.
Reduzir o desempenho de acesso às estruturas.
Impedir o uso de herança em coleções.
Tornar as classes das coleções abstratas.
Asserção-Razão (Tópicos: 6 — Estruturação em camadas)
A arquitetura em camadas separa responsabilidades e facilita a manutenção de sistemas complexos. Em Java, é comum dividir aplicações em camadas de apresentação, negócio e persistência. Essa divisão favorece o reuso e a testabilidade. O uso de interfaces e padrões de projeto, como DAO e Service, contribui para reduzir o acoplamento e permitir a substituição de implementações sem alterar o restante do sistema.
Avalie:
I. A arquitetura em camadas promove a separação de responsabilidades entre as partes do sistema.
PORQUE
II. Cada camada é responsável por uma função específica e comunica-se com as demais por meio de interfaces bem definidas.
A respeito dessas asserções, assinale a opção correta:
As asserções I e II são proposições verdadeiras, e a II é uma justificativa correta da I.
As asserções I e II são proposições verdadeiras, mas a II não é uma justificativa correta da I.
A asserção I é verdadeira, e a II é falsa.
A asserção I é falsa, e a II é verdadeira.
As asserções I e II são falsas.
Interpretação (Tópicos: 6 — Implementação progressiva)
O desenvolvimento progressivo de software orientado a objetos enfatiza a construção incremental de funcionalidades. Em Java, essa abordagem é facilitada pela modularidade das classes e pela independência entre camadas. O programador pode implementar um módulo, testá-lo e integrá-lo gradualmente ao sistema. Isso reduz riscos e facilita o controle de qualidade. A prática é amplamente utilizada em metodologias ágeis, como Scrum, nas quais o produto é entregue em iterações curtas, com versões incrementais e testáveis.
Segundo o texto, o desenvolvimento progressivo em Java tem como principal vantagem:
Permite a entrega de sistemas completos apenas ao final do projeto.
Favorece a modularidade e a integração gradual das partes do sistema.
Impede que partes do sistema sejam testadas isoladamente.
Substitui a análise de requisitos pela implementação direta.
Evita a reutilização de componentes e bibliotecas.
Asserção-Razão (Tópicos: 7 — Interface gráfica e modelo de eventos)
A biblioteca Swing do Java oferece componentes para a criação de interfaces gráficas. O modelo de eventos é o núcleo da interação com o usuário, baseado na associação de ouvintes (listeners) a componentes gráficos. Quando o usuário realiza uma ação — como clicar em um botão — um evento é gerado e entregue ao ouvinte associado. Essa separação entre interface e lógica de controle torna o código mais modular e de fácil manutenção.
Avalie:
I. O modelo de eventos do Java permite associar comportamentos específicos a ações do usuário.
PORQUE
II. O uso de listeners desacopla a lógica de controle da interface gráfica, facilitando a manutenção e os testes.
A respeito dessas asserções, assinale a opção correta:
As asserções I e II são proposições verdadeiras, e a II é uma justificativa correta da I.
As asserções I e II são proposições verdadeiras, mas a II não é uma justificativa correta da I.
A asserção I é verdadeira, e a II é falsa.
A asserção I é falsa, e a II é verdadeira.
As asserções I e II são falsas.
Interpretação (Tópicos: 7 — Frames e menus)
Em Java, as janelas gráficas são representadas por classes que herdam de JFrame. A interface gráfica é montada por meio da adição de componentes como botões, rótulos e campos de texto. Os menus (JMenuBar, JMenu e JMenuItem) permitem estruturar comandos em categorias. A navegação entre frames pode ser feita criando novas instâncias de janelas ou alternando visibilidades. Embora simples, é importante evitar abrir múltiplas janelas simultaneamente sem controle, pois isso consome recursos e confunde o usuário.
De acordo com o texto, qual prática não é recomendada no uso de JFrame em interfaces gráficas Java?
Criar menus com JMenu e JMenuItem.
Controlar a visibilidade de frames existentes.
Abrir várias janelas simultâneas sem controle.
Utilizar layouts para organizar os componentes.
Encerrar a aplicação com setDefaultCloseOperation.
Asserção-Razão (Tópicos: 7 — Programação visual com Eclipse)
O Eclipse é uma IDE amplamente utilizada para o desenvolvimento em Java. Ele fornece ferramentas para edição, depuração e design de interfaces gráficas por meio de plug-ins. O uso de editores visuais permite arrastar e soltar componentes (drag-and-drop), facilitando o desenvolvimento de GUIs. Apesar disso, é essencial compreender o código gerado automaticamente para evitar dependência excessiva da ferramenta.
Avalie:
I. O Eclipse oferece recursos visuais para a criação de interfaces gráficas em Java.
PORQUE
II. O uso do Eclipse elimina a necessidade de compreender o código-fonte gerado.
A respeito dessas asserções, assinale a opção correta:
As asserções I e II são proposições verdadeiras, e a II é uma justificativa correta da I.
As asserções I e II são proposições verdadeiras, mas a II não é uma justificativa correta da I.
A asserção I é verdadeira, e a II é falsa.
A asserção I é falsa, e a II é verdadeira.
As asserções I e II são falsas.
Interpretação (Tópicos: 8 — Java e Banco de Dados Relacionais)
A integração do Java com bancos de dados relacionais é realizada por meio da API JDBC (Java Database Connectivity). Essa API define classes e interfaces para conexão, execução de comandos SQL e manipulação de resultados. O uso de DriverManager e Connection permite estabelecer conexões, enquanto PreparedStatement previne injeções de SQL ao parametrizar consultas. Essa camada de abstração garante que aplicações Java possam trabalhar com diferentes bancos de dados de forma padronizada.
Segundo o texto, o uso de PreparedStatement no JDBC é importante porque:
Melhora a segurança, evitando injeções de SQL.
Aumenta a complexidade do código e reduz o desempenho.
Substitui completamente o uso de comandos SQL.
Exige o uso obrigatório de frameworks ORM.
Dispensa a conexão via DriverManager.
Asserção-Razão (Tópicos: 8 — JDBC e conexões)
Ao trabalhar com JDBC, é essencial gerenciar corretamente os recursos de conexão, pois conexões abertas consomem memória e podem causar falhas de desempenho. O fechamento adequado deve ocorrer em blocos finally, garantindo a liberação mesmo em caso de exceções. O uso de try-with-resources a partir do Java 7 simplificou esse processo, pois fecha automaticamente os recursos que implementam a interface AutoCloseable.
Avalie:
I. O uso do bloco try-with-resources facilita o gerenciamento de conexões JDBC.
PORQUE
II. Recursos declarados dentro do try são fechados automaticamente ao final do bloco.
A respeito dessas asserções, assinale a opção correta:
As asserções I e II são proposições verdadeiras, e a II é uma justificativa correta da I.
As asserções I e II são proposições verdadeiras, mas a II não é uma justificativa correta da I.
A asserção I é verdadeira, e a II é falsa.
A asserção I é falsa, e a II é verdadeira.
As asserções I e II são falsas.
Em Java, quando é mais apropriado utilizar composição ao invés de herança?
Quando a subclasse deve acessar diretamente os atributos privados da superclasse.
Quando existe uma relação "é-um" entre as classes.
Quando se deseja compartilhar métodos privados entre classes.
Quando uma classe precisa reutilizar funcionalidades de outra sem estabelecer uma hierarquia rígida.
Quando se pretende sobrescrever métodos estáticos.
Sobre o uso do modificador super em Java, assinale a alternativa correta:
É obrigatório em toda chamada de construtor.
Impede a sobrescrita de métodos na subclasse.
Serve para criar instâncias de interfaces.
É utilizado para acessar membros da superclasse a partir da subclasse.
Permite acessar métodos e atributos da subclasse.
Qual das alternativas representa corretamente a diferença entre herança e composição em Java?
Composição impede o uso de interfaces.
Herança estabelece uma relação "é-um" e composição uma relação "tem-um".
Composição permite múltiplas heranças diretas, enquanto herança não.
Herança representa uma relação "tem-um" e composição uma relação "é-um".
Herança não permite reutilização de código.
Em Java, qual das alternativas representa corretamente o conceito de encapsulamento?
Ocultar os detalhes internos de uma classe, expondo apenas métodos públicos para interação.
Evitar o uso de construtores em classes.
Permitir acesso irrestrito a todos os atributos de uma classe.
Declarar todos os atributos como públicos.
Utilizar apenas métodos estáticos em todas as classes.
Sobre o uso de interfaces em Java, assinale a alternativa correta:
Interfaces só podem declarar métodos abstratos, mesmo após o Java 8.
Interfaces não podem conter métodos estáticos.
Interfaces podem ser instanciadas diretamente.
Uma classe pode implementar múltiplas interfaces simultaneamente.
Interfaces podem conter atributos privados.
Qual das opções abaixo descreve corretamente o conceito de polimorfismo em programação orientada a objetos?
Permitir apenas herança simples entre classes.
Exigir que todas as classes tenham apenas um método principal.
Impedir que métodos sejam sobrescritos em subclasses.
Forçar a implementação de todos os métodos de uma interface em classes abstratas.
Permitir que diferentes classes tenham métodos com o mesmo nome, mas comportamentos distintos.
Em Java, qual é o principal benefício de utilizar o operador instanceof ao trabalhar com polimorfismo?
Impede a propagação de exceções em métodos polimórficos.
Garante que todos os métodos sejam sobrescritos.
Verifica em tempo de execução se um objeto pertence a um tipo específico.
Permite criar novas instâncias de objetos dinamicamente.
Força a conversão automática entre tipos incompatíveis.
Sobre o uso de PreparedStatement em JDBC, assinale a alternativa incorreta:
PreparedStatement ajuda a evitar ataques de injeção de SQL.
PreparedStatement executa apenas comandos de atualização, não consultas de seleção.
PreparedStatement pode ser reutilizado para executar múltiplas consultas com parâmetros diferentes.
PreparedStatement pode melhorar a performance em consultas repetidas.
PreparedStatement permite definir parâmetros dinamicamente nas consultas SQL.
