0% acharam este documento útil (0 voto)
15 visualizações332 páginas

Aula 06 - Java SE

Enviado por

nathanadriel12
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
15 visualizações332 páginas

Aula 06 - Java SE

Enviado por

nathanadriel12
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd

Aula 06

Perito Criminal - Curso Regular (Área TI)


Desenvolvimento de Software

Autor:
Paolla Ramos

03 de Abril de 2024

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Índice
1) Java SE - Teoria
..............................................................................................................................................................................................3

..............................................................................................................................................................................................
2) Java SE - Questões Comentadas - Cebraspe 126

3) Java SE - Questões Comentadas - FGV 151


..............................................................................................................................................................................................

..............................................................................................................................................................................................
4) Java SE - Questões Comentadas - FCC 163

..............................................................................................................................................................................................
5) Java SE - Questões Comentadas - Multibancas 182

..............................................................................................................................................................................................
6) Java SE - Questões Comentadas - Cesgranrio 185

..............................................................................................................................................................................................
7) Java SE - Lista de Questões - Cebraspe 238

..............................................................................................................................................................................................
8) Java SE - Lista de Questões - FGV 241

9) Java SE - Lista de Questões - FCC 247


..............................................................................................................................................................................................

..............................................................................................................................................................................................
10) Java SE - Lista de Questões - Cesgranrio 259

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 2


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

APRESENTAÇÃO DA AULA

Pessoal, o tema da nossa aula é Java – Parte I. Pessoal, o que eu como professor posso dizer a
vocês? Infelizmente a banca não define especificamente o que vai solicitar em prova, e dizem “por
aí” que TI é um “MUNDO” ... talvez TI seja um OCEANO... Devemos ter noção do básico e fazer
o máximo possível de questões para conhecer o perfil da banca. Estar preparado para questões
mais elaboradas ou novidades nunca cobradas! Como professor, tenho a obrigação de passar os
conceitos a cada questão. Então vamos lá!

Java é a linguagem das possibilidades! Java está impulsionando a inovação por trás do nosso
mundo digital. Há muitos anos dizia-se que Java era uma linguagem lenta, porém isso já mudou
MUITO! Vamos ver isso e muito mais em nossa aula!

Bora, bora, pessoal, porque quem já chegou até aqui está com garra e vontade de ser aprovado!

O pensamento do estudante (concurseiro) que quer ser aprovado deve ser sempre este: fazer o
melhor que puder nas condições que possui! No contexto da nossa aula, o ponto mais importante
não é tornar você um programador, e sim, fazer você acertar questões em prova! Portanto, foque
nisso!

Para ajudá-los a realizar o sonho de ser aprovado, o time de TI do ESTRATÉGIA criou jogos bem
legais para vocês fixarem o conteúdo das aulas! Aaaahhhh, o Estratégia é o melhorrr! também
acho!

Link para os GAMES : [Link]

Brincadeiras à parte, pessoal, durante minha preparação, eu sempre busquei estudar o máximo
possível, pois eu pensava assim: Poxa, o professor já teve um trabalhão de criar a aula, escrever o
PDF, gravar os vídeos, comentar questões. Eu só preciso ESTUDAR! Só isso! É o mínimo que eu
tenho que fazer. Portanto, deem o máximo que vocês podem dar, lembrem-se é por VOCÊ, é
pelos seus SONHOS!

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 3


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 4


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

JAVA
Introdução

Vamos falar agora sobre uma das linguagens mais famosas do mundo! O Java é a principal
linguagem de programação e plataforma de desenvolvimento. Reduz custos e prazos de
desenvolvimento, impulsiona a inovação e aprimora os serviços de aplicativos. Com milhões de
desenvolvedores executando mais de 51 bilhões de Java Virtual Machines em todo o mundo, o
Java continua sendo a plataforma de desenvolvimento preferida de empresas e desenvolvedores.

É isso ai galera! Java 17, a versão mais recente da plataforma de desenvolvimento e linguagem de
programação que é número um do mundo! Java é uma linguagem de programação orientada a
objetos, multiplataforma, robusta, portável, segura, extensível, concorrente e distribuída

Java é uma linguagem de programação portável, tendo em vista que basta compilar a aplicação
apenas uma vez para que esta possa ser executada em qualquer plataforma que possua máquina
virtual Java.

O Java só suporta herança única, na qual cada classe é derivada exatamente de uma superclasse
direta. Ao contrário de C++, o Java não suporta herança múltipla, que ocorre quando uma classe
é derivada de mais de uma superclasse direta.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 5


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

A linguagem Java foi projetada tendo em vista os seguintes objetivos:

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 6


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Orientação a
objetos - Baseado
no modelo de
Smalltalk e
Simula67;

Segurança - Pode Portabilidade -


Independência de
executar
programas via Objetivos do plataforma -
rede com
restrições de JAVA "escreva uma vez,
execute em
execução. qualquer lugar"
("write once, run

Recursos de Rede -
Possui extensa
biblioteca de rotinas
que facilitam a
cooperação com
protocolos TCP/IP,
como HTTP e FTP;

Além disso, podem-se destacar outras vantagens da linguagem JAVA

Sintaxe similar a C/C++

● Facilidades de Internacionalização - Suporta nativamente caracteres Unicode;


● Simplicidade na especificação, tanto da linguagem como do "ambiente" de execução
(JVM);
● É distribuída com um vasto conjunto de bibliotecas (ou APIs);

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 7


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

● Possui facilidades para criação de programas distribuídos e multitarefa (múltiplas linhas de


execução num mesmo programa);
● Desalocação de memória automática por processo de coletor de lixo;
● Carga Dinâmica de Código - Programas em Java são formados por uma coleção de classes
armazenadas independentemente e que podem ser carregadas no momento de utilização.

Um resumo das características do Java:

Característica Descrição
Não contém redundâncias e é fácil de entender, implementar e usar.
Parecida com C++ para facilitar compreensão por grande parte de
Concisa e simples
programadores. É uma evolução de C++: não suporta aritmética de
ponteiros, registros, coercions, etc.
Suporta os principais conceitos de orientação a objetos. Favorece
Orientada a objetos
reusabilidade.
Altamente tipada. Programas são confiáveis. Reduz imprevistos em tempo
Robusta de execução: variáveis são automaticamente inicializadas, uso disciplinado
de ponteiros, rotinas devem ser chamadas corretamente, etc.
Completamente especificada. Não contém aspectos dependentes da
Portável implementação: o tamanho dos tipos é fixo para qualquer implementação,
etc.
Restrições de acesso a arquivos, manipulação de ponteiros, etc. Implica que
Segura
não é útil para desenvolver certas aplicaçoes como `device drivers'.
Suporta aplicações concorrentes: multithreads, monitores, execução
Concorrente
atômica.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 8


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Independente de Geração de bytecode que pode ser interpretado para qualquer arquitetura e
plataforma sistema operacional tendo o sistema Java. Facilita distribuição de software.
Interpretada Facilita desenvolvimento exploratório.
Utilizando compiladores, bytecodes podem ser traduzidos em tempo de
Compilada
execução para código de máquina.

linguagem de programação orientada a objetos


multiplataforma
robusta
portável
JAVA

segura
extensível
concorrente
distribuída
híbrida: compilada e interpretada

Em 1991, na Sun Microsystems, foi iniciado o Green Project, o berço do Java. Em 2008 a Oracle
Corporation adquire a empresa responsável pela linguagem Java, a Sun Microsystems, por US$
7,4 bilhões, com o objetivo de levar o Java e outros produtos da Sun ao dispor dos consumidores.

Há anos falava-se que Java era lento, porém houve melhorias na JVM incluindo o compilador Just-
In-Time (JIT) que é um componente do Javaf Runtime Environment que melhora o desempenho
de aplicativos Java no tempo de execução. Dessa forma temos que o limite de compilação JIT
ajuda a JVM a ser iniciada rapidamente e ainda assim ter desempenho melhorado.

Java é uma linguagem WORA, que significa Write once, run anywhere ou "Escreva uma vez,
execute em qualquer lugar", é o slogan da Sun MicroSystems para exemplificar os benefícios
multiplataforma da linguagem Java. Idealmente, isso significa que Java pode ser desenvolvido em
qualquer dispositivo, compilado em um bytecode padrão e espera-se que seja executado em
qualquer dispositivo equipado com uma máquina virtual Java (JVM).

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 9


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Java utiliza o compilador Java para converter o código-fonte Java em bytecodes que representam
as tarefas a serem executadas na fase de execução. Diferentemente das instruções em linguagem
de máquina, que são dependentes de plataforma (isto é, de hardware específico de computador),
instruções bytecode são independentes de plataforma. Portanto, os bytecodes do Java são
portáveis — sem recompilar o código-fonte, as mesmas instruções em bytecodes podem ser
executadas em qualquer plataforma contendo uma JVM que entende a versão do Java na qual os
bytecodes foram compilados. A JVM é invocada pelo comando java. Exemplo: java Welcome.

Atualmente, a plataforma de desenvolvimento moderna mais conhecida do mundo, o Java SE, é


a plataforma de desenvolvimento moderna mais popular do mundo, reduz custos, reduz o tempo
de desenvolvimento, impulsiona a inovação e melhora os serviços de aplicativos como a linguagem
de programação preferida para aplicativos corporativos.

Mais popular do
mundo

Melhora os
serviços de Reduz Custos
aplicativos

Impulsona a Reduz tempo de


inovação desenvolvimento

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 10


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Quando estudarmos o ambiente de desenvolvimento Java típico vocês vão ver que a JVM analisa
os bytecodes à medida que eles são interpretados, procurando hot spots (pontos ativos) — partes
dos bytecodes que executam com frequência. Para essas partes, um compilador just in time (JIT),
como o compilador Java HotSpotf da Oracle, traduz os bytecodes para a linguagem de máquina
do computador subjacente.

Quando a JVM encontra de novo essas partes compiladas, o código de linguagem de máquina
mais rápido é executado. Portanto, os programas Java realmente passam por duas fases de
compilação: uma em que o código-fonte é traduzido em bytecodes (para a portabilidade entre
JVMs em diferentes plataformas de computador) e outra em que, durante a execução, os
bytecodes são traduzidos em linguagem de máquina para o computador real no qual o programa
é executado.

Quando dizemos que duas tarefas operam concorrentemente, queremos dizer que ambas
progridem ao mesmo tempo. Desde sua criação, o Java suporta a concorrência. Quando dizemos
que duas tarefas operam em paralelo, queremos dizer que elas são executadas simultaneamente.

Nesse sentido, o paralelismo é um subconjunto da concorrência. O corpo humano realiza uma


grande variedade de operações paralelas. Respiração, circulação sanguínea, digestão, pensar e
caminhar, por exemplo, podem ocorrer em paralelo, assim como todos os sentidos — visão,
audição, tato, olfato e paladar. Acredita-se que esse paralelismo é possível porque se acredita que
o cérebro humano contém bilhões de “processadores”. Computadores multiprocessados de hoje
em dia têm múltiplos processadores que podem realizar tarefas em paralelo.

Entre os atrativos de Java está a facilidade que essa linguagem oferece para desenvolver
aplicações para execução em sistemas distribuídos. Já em sua primeira versão, Java oferecia
facilidades para o desenvolvimento de aplicações cliente-servidor usando os mecanismos da
Internet, tais como os protocolos TCP/IP e UDP.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 11


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Além disso, Java realiza o encapsulamento e ocultamento de informações para melhoria da


segurança. Classes (e seus objetos) encapsulam, isto é, contêm seus atributos e métodos. Os
atributos e métodos de uma classe (e de seu objeto) estão intimamente relacionados. Os objetos
podem se comunicar entre si, mas eles em geral não sabem como outros objetos são
implementados — os detalhes de implementação permanecem ocultos dentro dos próprios
objetos. Esse ocultamento de informações, como veremos, é crucial à boa engenharia de software.

Para fins de segurança, um compilador Java compila programas fonte em bytecodes e um


compilador confiável assegura que o código fonte não viola as regras de segurança. Um fragmento
de código pode ser obtido da rede. Em tempo de execução, Java não confia no código recebido
e o sujeita a uma série de testes por meio de um verificador de bytecode. O verificador de
bytecode possui um mini provador de teoremas que verifica o respeito às regras básicas da
linguagem para que o código garanta:

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 12


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Não fraudar ponteiros

Não violar as restrições de

Garantias acesso

Ter acesso a objetos no


estado que eles estejam

Chamar os métodos com


os argumentos apropriados
e com os tipos apropriados

Não causar o
trasbordamento de pilhas

O bytecode Java contém mais informações de tipos do que seria estritamente necessário para o
interpretador. A pilha de operandos armazena informações sobre tipos. Cada tipo primitivo de
dados possui operações especializadas feitas para operar sobre operandos do tipo apropriado. A
coleção de tipos de informações, isto é, todos os registros da pilha de operandos e todas as
variáveis locais constituem o chamado estado de tipos do quadro de execução.

Por fim, devido ao fato de integrar várias bibliotecas, integrar vários pacotes e possibilitar a criação
de novos tipos de classe conforme necessário; o Java é conhecido como uma linguagem
extensível.

Java é uma linguagem de programação amplamente usada para codificar aplicações Web. Ela tem
sido uma escolha popular entre os desenvolvedores há mais de duas décadas, com milhões de
aplicações Java em uso hoje. Java é uma linguagem multiplataforma, orientada a objetos e
centrada em rede que pode ser usada como uma plataforma em si. É uma linguagem de
programação rápida, segura e confiável para codificar tudo, desde aplicações móveis e software
empresarial até aplicações de big data e tecnologias do servidor.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 13


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

O usuário final da plataforma Java usa JRE para rodar aplicações Java. A Plataforma Java Standard
Edition Runtime Environment (JRE) destina-se a desenvolvedores e fornecedores de software para
uso com seus aplicativos.

O Java SE Runtime Environment contém a máquina virtual Java, bibliotecas de classes de tempo
de execução e o ativador de aplicativos Java que são necessários para executar programas escritos
na linguagem de programação Java. Não é um ambiente de desenvolvimento e não contém
ferramentas de desenvolvimento como compiladores ou depuradores.

Fica a informação que o JDK inclui ferramentas para desenvolver e testar programas escritos na
linguagem de programação Java e executados na plataforma Java. Já, o JRE é usado pelo usuário
final da plataforma Java para rodar aplicações.

JDK: desenvolver,
testar e executar
programas na JRE: usado pelo usuário
plataforma Java final da plataforma Java
para rodar aplicações.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 14


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

(CESPE / PGDF – 2021) A extensão das classes Java compiladas é *.java.

Comentários: Pessoal, na verdade, a extensão é .jdk

Gabarito: Errado

__________________________________________________________________________________

(CESPE / TCE-PA – 2016) Diferentemente do que ocorre com o JavaScript, as aplicações Java
são executadas em uma máquina virtual ou em um browser.

Comentários: É exatamente isso pessoal! As aplicações Java são executadas em uma


máquina virtual! Gabarito: Correto.

Compilação e Interpretação

Vejamos os passos para criar e executar um aplicativo Java. Normalmente, existem cinco fases:
editar, compilar, carregar, verificar e executar.

Vamos falar sobre Compilação e Interpretação. Compilar é uma fase mais elaborada. Consiste em
converter os programas de linguagem de alto nível em linguagem de máquina. Linguagens de alto
nível permitem aos programadores escrever instruções que se pareçam com o inglês cotidiano e
contenham notações matemáticas comumente utilizadas. Do ponto de vista do programador, as
linguagens de alto nível são preferíveis às de máquina. Java é uma das linguagens de programação
de alto nível mais amplamente usadas.

Compilar um programa grande de linguagem de alto nível em linguagem de máquina pode levar
tempo considerável de computador. Os programas interpretadores, desenvolvidos para executar
diretamente programas de linguagem de alto nível, evitam o tempo de espera da compilação,
embora sejam mais lentos do que programas compilados.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 15


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Com os interpretadores, cada instrução de código de alto nível é interpretada em código de


máquina em tempo real. As instruções escritas são executadas imediatamente pelo hardware
antes de considerar a próxima instrução.

Já utilizando compiladores, o programa completo é escrito em sintaxe natural semelhante ao


inglês com compiladores, e a linguagem compila (ou converte) todo o código em código de
máquina. O código compilado é então executado no hardware.

O programa Java foi a primeira linguagem a combinar os dois métodos acima (Compilação e
Interpretação) usando uma máquina virtual Java (JVM). O compilador de código Java é chamado
máquina virtual Java. Qualquer arquivo Java é compilado primeiro em bytecode. O bytecode Java
só pode ser executado na JVM. A JVM então interpreta o bytecode para executá-lo na plataforma
de hardware subjacente. Portanto, se a aplicação estiver sendo executada em uma máquina
Windows, a JVM a interpretará para o Windows. Mas se estiver sendo executada em uma
plataforma de código aberto como Linux, a JVM vai interpretá-la para o Linux.

Ta-dah!!! Essa é a mágica do Java! Compilar e interpretar códigos.

Então quando Java compila (ou converte) todo o código .java transforma-o em um arquivo .class.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 16


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

.java Compila .class

public class JavaHelloWorldProgram {

public static void main(String args[]){

[Link]("Hello World");

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 17


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Código Java
(.java)

JavaC
Compilador

Bytecode (.class)

JVM JVM JVM

Windows Linux Mac

(FCC / PGE MT – 2016) Considere a imagem abaixo, que mostra o esquema de


funcionamento da Java Virtual Machine – JVM.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 18


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

O produto resultante do processo de compilação de classes Java, que deve preencher a


lacuna I, é conhecido como,

a) hashcode.

b) bytecode.

c) CIL (Common Intermediate).

d) assembly.

e) classcode.

Comentários: Pessoal, JAVA utiliza uma JVM para “entender” bytecodes. Logo, se existe um
compilador que seja capaz de transformar o código-fonte em uma bytecode seguindo as
especificações corretamente, o bytecode poderá ser interpretado por uma JVM. A questão
pergunta qual o produto resultante do processo de compilação de classes Java que é
exatamente o bytecode

Gabarito: Letra B.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 19


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Ambiente típico de desenvolvimento Java — fase de edição.


Fase 1: criando um programa

A Fase 1 consiste em editar um arquivo com um programa editor, muitas vezes conhecido
simplesmente como um editor. Você digita um programa Java (em geral referido como código-
fonte) utilizando o editor, faz quaisquer correções necessárias e salva o programa em um
dispositivo de armazenamento secundário, como sua unidade de disco. Arquivos de código-fonte
Java recebem um nome que termina com a extensão .java, que indica um arquivo contendo
código-fonte Java.

Inicialmente, o programa é criado em um editor e armazenado em disco em um arquivo cujo nome


termina com .java.

Fase 2: compilando um programa Java em bytecodes

Na Fase 2, utilize o comando javac (o compilador Java) para compilar um programa. Por exemplo,
a fim de compilar um programa chamado [Link], você digitaria javac [Link]

O compilador cria bytecodes e os armazena em disco em um arquivo cujo nome termina com
.class.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 20


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Fase 3: carregando um programa na memória

Na Fase 3, a JVM armazena o programa na memória para executá-lo — isso é conhecido como
carregamento. O carregador de classe da JVM pega os arquivos .class que contêm os bytecodes
do programa e os transfere para a memória primária. Ele também carrega qualquer um dos
arquivos .class fornecidos pelo Java que seu programa usa. Os arquivos .class podem ser
carregados a partir de um disco em seu sistema ou em uma rede (por exemplo, sua faculdade local
ou rede corporativa ou a internet).

O carregador de classe lê os arquivos .class que contêm bytecodes a partir do disco e coloca esses
bytecodes na memória.

Fase 4: verificação de bytecode

Na Fase 4, enquanto as classes são carregadas, o verificador de bytecode examina seus bytecodes
para assegurar que eles são válidos e não violam restrições de segurança do Java. O Java impõe

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 21


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

uma forte segurança para certificar-se de que os programas Java que chegam pela rede não
danificam os arquivos ou o sistema (como vírus e worms de computador).

O verificador de bytecode confirma que todos os bytecodes são válidos e não violam restrições
de segurança do Java.

Fase 5: execução

Na Fase 5, a JVM executa os bytecodes do programa, realizando, assim, as ações especificadas


por ele (Figura 1.10). Nas primeiras versões do Java, a JVM era simplesmente um interpretador
para bytecodes. A maioria dos programas Java executava lentamente, porque a JVM interpretava
e executava um bytecode de cada vez. Algumas arquiteturas modernas de computador podem
executar várias instruções em paralelo.

Em geral, as JVMs atuais executam bytecodes utilizando uma combinação de interpretação e a


chamada compilação just in time (JIT). Nesse processo, a JVM analisa os bytecodes à medida que
eles são interpretados, procurando hot spots (pontos ativos) — partes dos bytecodes que
executam com frequência. Para essas partes, um compilador just in time (JIT), como o compilador
Java HotSpotf da Oracle, traduz os bytecodes para a linguagem de máquina do computador

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 22


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

subjacente. Quando a JVM encontra de novo essas partes compiladas, o código de linguagem de
máquina mais rápido é executado.

Portanto, os programas Java realmente passam por duas fases de compilação: uma em que o
código-fonte é traduzido em bytecodes (para a portabilidade entre JVMs em diferentes
plataformas de computador) e outra em que, durante a execução, os bytecodes são traduzidos
em linguagem de máquina para o computador real no qual o programa é executado

Para executar o programa, a JVM lê os bytecodes e os compila (isto é, traduz) no momento certo
(ou Just-In-Time — JIT) para uma linguagem que o computador possa entender. Como o programa
existe na memória ele pode armazenar valores de dados na memória principal.

(CESPE / SERPRO – 2021) A compilação de um programa JAVA para ambiente Windows


gera um programa com extensão EXE, o qual é executado pelo sistema operacional.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 23


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Comentários: Pessoal, na verdade, não há a extensão EXE no ambiente citado. Nas 5 fases
há.jdk, .class, java. Mas não há .exe

Gabarito: Errado.

Java Virtual Machine (JVM)

A máquina virtual Java atua como uma camada de abstração adicional entre a plataforma Java e
o hardware da máquina subjacente. O código-fonte Java pode ser executado apenas nas máquinas
que possuem a JVM instalada nelas.

Uma máquina virtual é um software que simula uma máquina física e consegue executar vários
programas, gerenciar processos, memória e arquivos. Resumindo, ele constitui de uma plataforma,
onde a memória, o processador e seus outros recursos, são totalmente virtuais, não dependendo
de hardwares.

A execução de um código Java não está diretamente relacionada com o Sistema Operacional, ele
conversa diretamente com a JVM (Java Virtual Machine), possibilitando assim a portabilidade de
seu código. O que for escrito em um sistema operacional Windows, irá rodar em um sistema
operacional Linux (salvo algumas exceções de códigos nativos).

Esse processo cria uma independência do Sistema Operacional (SO), dando ao desenvolvedor
uma liberdade de desenvolver para múltiplas plataformas sem aquela preocupação de se o código
irá funcionar corretamente.

A JVM é desenvolvida em código nativo, pois ela conversa diretamente com o sistema operacional
para que o programa Java funcione na máquina.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 24


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

código-fonte independe do
camada de
Java so
abstração depende do so
desenvolviment
adicional entre
conversa o para múltiplas
plataforma e
diretamente com a plataformas
JVM
máquina
virtual Java JVM

Passagem por Valor e por referência

Duas maneiras de passar argumentos em chamadas de método em muitas linguagens de


programação são passagem por valor e passagem por referência (às vezes denominadas chamada
por valor e chamada por referência). Quando um argumento for passado por valor, uma cópia do
valor do argumento é passada para o método chamado. O método chamado funciona
exclusivamente com a cópia. As alterações na cópia do método chamado não afetam o valor da
variável original no chamador.

Quando um argumento for passado por referência, o método chamado pode acessar o valor do
argumento no chamador diretamente e modificar esses dados, se necessário. Passar por referência
aprimora desempenho, eliminando a necessidade de copiar quantidades de dados possivelmente
grandes.

Ao contrário de algumas outras linguagens, o Java não permite escolher passagem por valor ou
passagem por referência — todos os argumentos são passados por valor. Uma chamada de

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 25


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

método pode passar dois tipos de valores para um método — cópias de valores primitivos (por
exemplo, valores de tipo int e double) e cópias de referências para objetos. Os objetos em si não
podem ser passados para os métodos. Quando um método modifica um parâmetro do tipo
primitivo, as alterações no parâmetro não têm nenhum efeito no valor original do argumento no
método chamador.

Se você modificar um parâmetro de tipo por referência para que ele se refira a outro objeto,
apenas o parâmetro refere-se ao novo objeto — a referência armazenada na variável do chamador
ainda se refere ao objeto original.

Embora uma referência do objeto seja passada por valor, um método ainda pode interagir com o
objeto referenciado chamando seus métodos public que utilizam a cópia da referência do objeto.
Visto que a referência armazenada no parâmetro é uma cópia da referência que foi passada como
um argumento, o parâmetro no método chamado e o argumento no método chamador
referenciam o mesmo objeto na memória.

Passagem de parâmetros por valor


cópia do valor do argumento é passada
para o método.

Apenas seu valor é passado para a variável


correspondente ao parâmetro

passagem de parâmetros por


referência
o método chamado pode acessar o
valor do argumento no chamador
diretamente e modificar esses dados,
se necessário

aprimora desempenho eliminando a

(SEFAZ-CE – 2007) Na passagem de parâmetros por valor, a expressão correspondente ao


parâmetro é avaliada e apenas seu valor é passado para a variável correspondente ao
parâmetro dentro da função.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 26


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Comentários: Quando um argumento for passado por valor, uma cópia do valor do
argumento é passada para o método chamado. Apenas seu valor é passado para a variável
correspondente ao parâmetro dentro da função.

Gabarito: Correto.

(AGE-PA – 2022) Em programação, existem duas maneiras de realizar a passagem de


parâmetros para uma função qualquer. Sobre o tema, analise as afirmativas a seguir. A
passagem de parâmetro pode ser feita por valor ou por referência.

Comentários: Certo, pessoal! Como vimos, duas maneiras de passar argumentos em


chamadas de método em muitas linguagens de programação são passagem por valor e
passagem por referência

Gabarito: Correto.

Empacotamento

O software de aplicativos é distribuído em unidades denominadas pacotes. Um pacote é um


conjunto de arquivos e diretórios necessários para um produto de software. Um pacote é
geralmente criado e construído por um desenvolvedor de aplicativos depois de terminar de
desenvolver o código do aplicativo. Um produto de software precisa ser construído em um ou
mais pacotes para que possa ser facilmente transferido para um meio de distribuição. Depois, o
produto de software pode ser produzido em massa e instalado por administradores. Um pacote é
um conjunto de arquivos e diretórios em um formato definido.

Os componentes de um pacote se dividem em duas categorias.

● Os objetos do pacote são arquivos de aplicativo que serão instalados.


● Os arquivos de controle controlam como, onde e se o pacote está instalado.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 27


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Os arquivos de controle também estão divididos em duas categorias: arquivos de informação e


scripts de instalação. Alguns arquivos de controle são obrigatórios. Alguns arquivos de controle
são opcionais.

Para empacotar seus aplicativos, você deve primeiro criar os componentes obrigatórios e os
componentes opcionais que farão parte do seu pacote. Você pode, então, construir o pacote
usando o comando pkgmk.

Para construir um pacote, você deve fornecer:

● Objetos de pacote (arquivos e diretórios do software de aplicativo)


● Dois arquivos de informação (os arquivos pkginfo e prototype)
● Arquivos de informação opcionais
● Scripts de instalação opcionais

A ilustração seguinte descreve o conteúdo de um pacote.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 28


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Você deve criar os objetos de pacote antes de construir o pacote. Os componentes abaixo fazem
parte do aplicativo. Podem ser os seguintes itens:

● Arquivos (arquivos executáveis ou arquivos de dados);


● Diretórios;
● Pipes nomeados;
● Links;
● Dispositivos;
● O arquivo pkginfo;

O pkginfo é um arquivo de informação do pacote necessário que define os valores de parâmetro.


Os valores de parâmetro são a abreviação, o nome completo e a arquitetura do pacote.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 29


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Raíz

O conceito de encapsular estrutura e comportamento em um tipo não é exclusivo da orientação


a objetos; particularmente, a programação por tipos abstratos de dados segue esse mesmo
conceito. O que torna a orientação a objetos única é o conceito de herança.

Herança é um mecanismo que permite que características comuns a diversas classes sejam
fatoradas em uma classe base, ou superclasse. A partir de uma classe base, outras classes podem
ser especificadas. Cada classe derivada ou subclasse apresenta as características (estrutura e
métodos) da classe base e acrescenta a elas o que for definido de particularidade para ela.

Sendo uma linguagem de programação orientada a objetos, Java oferece mecanismos para definir
classes derivadas a partir de classes existentes. É fundamental que se tenha uma boa compreensão
sobre como objetos de classes derivadas são criados e manipulados, assim como das restrições
de acesso que podem se aplicar a membros de classes derivadas. Também importante para uma
completa compreensão da utilização desse mecanismo em Java é a compreensão de como
relacionam-se interfaces e herança.

Herança é sempre utilizada em Java, mesmo que não explicitamente. Quando uma classe é criada
e não há nenhuma referência à sua superclasse, implicitamente a classe criada é derivada
diretamente da classe Object. É por esse motivo que todos os objetos podem invocar os métodos
da classe Object, tais como equals() e toString().

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 30


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Herança
mecanismo que permite que características Cada classe derivada ou subclasse apresenta
comuns a diversas classes sejam fatoradas as características da classe base
em uma classe base, ou superclasse

Sempre utilizada em Java, mesmo que não explicitamente

Java oferece mecanismos para definir classes derivadas a partir de classes existentes

Jobject

todos os objetos java


jstring jclass jarray jthrowable
[Link] [Link]<T>
[Link]
int arrays long arrays float arrays double arrays

array of objects boolean array byte array char array (...)

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 31


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Pessoal, java é composto por uma infinidade de pacotes e classes que podem ser acessados no
índice: [Link]

Applet

Uma applet é uma pequena aplicação executada em uma janela de uma aplicação
(browser/appletviewer). Tem por finalidade estender as funcionalidades de browsers, adicionando
som, animação, etc., provenientes de fontes (URLs) locais ou remotas, sendo que cada página web
(arquivo .html) pode conter uma ou mais applets.

Applet
pequena estende as necessita de um pode ser
aplicação funcionalidades navegador, por disponibilizada
executada em de browsers, outro para execução
uma janela adicionando via internet
som, animação

Applets sempre executam nos clientes web, nunca nos servidores. Por esta razão a carga das
classes pode levar algum tempo. Para definir programas Java que rodem no servidor, veja como
construir servlets.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 32


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Os 5 métodos que definem o ciclo de vida de uma applet são:

1. init( ) - inicialização; chamado quando a applet é inicialmente carregada;


2. start( ) - execução (animação); chamado após o init( );
3. stop( ) - interrupção; faz a applet parar a execução da animação, áudio ou vídeo;
4. paint() - para desenhar algo na applet;
5. destroy( ) - liberação de recursos; chamado quando o browser é fechado.

init ( )

destroy
start ( )
()
Ciclo
de vida
applet

paint ( ) stop ( )

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 33


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

(Aeronautica / EAOAp – 2016 - Adaptado) Applets são considerados programas em Java,


que são tipicamente incorporados a documentos XHTML, que também podem ser chamadas
páginas web. Acerca dos applets em Java, analise as afirmativas a seguir:

I. O método start é chamado uma vez pelo contêiner de applets para inicializar um applet
quando ele é carregado.

II. O método destroy é chamado pelo contêiner de applets quando o applet é removido da
memória.

III. Cinco métodos do ciclo de vida de um applet são chamados pelo contêiner de applets
entre o momento em que o applet é carregado no navegador e o momento em que ele é
fechado pelo navegador.

Estão corretas apenas as afirmativas

a) I e II.

b) I e III.

c) II e III.

d) III, apenas.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 34


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Comentários: Pessoal, Os 5 métodos que definem o ciclo de vida de uma applet são: init ,
start, stop e [Link]( ) - inicialização; chamado quando a applet é inicialmente
carregada; [Link]( ) - execução (animação); chamado após o init( );

3. stop( ) - interrupção; faz a applet parar a execução da animação, áudio ou vídeo;


[Link]() - para desenhar algo na applet; 5. destroy( ) - liberação de recursos; chamado
quando o browser é fechado. O item I está errado, o método init é chamado quando a applet
é inicialmente carregada. O item II está correto, destroy é chamado pelo contêiner de applets
quando o applet é removido da memória. E por fim, o item III está correto.

Gabarito: Letra C.

Toda applet é uma aplicação gráfica, não existindo, portanto, applets “modo texto”. A principal
diferença entre uma “Java application” e uma “applet” é o fato de que a janela base da aplicação
é derivada a partir da classe Applet (ou JApplet) e não a partir da classe Frame. Além disso, a
parte da aplicação que instancia a classe Applet e relaciona-a com o browser é padrão e, portanto,
não precisa ser descrita. Desta forma, applets não possuem a função “main( )”.

(CESPE / ANATEL – 2012) O Firefox 13, ou versão superior, disponibiliza suporte para o uso
de applets e aplicações Java, desde que esta ferramenta esteja devidamente instalada no
computador em uso e o plugin com suporte à Java esteja habilitado no navegador.

Comentários: Pessoal, de fato, applets têm por finalidade estender as funcionalidades de


browsers, adicionando som, animação, etc., provenientes de fontes (URLs) locais ou remotas.
No caso do Firefox, deve estar devidamente instalada no computador em uso e o plugin com
suporte à Java habilitado.

Gabarito: Correto.

(UFMT / UFMT – 2014) Applets Java são pequenos programas que podem ser embutidos
em uma página Web e executados quando um navegador carrega essa página.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 35


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Comentários: Pessoal, perfeita questão!

Gabarito: Correto.

(AOCP / UNIR– 2018) O Applet é um programa especial escrito em Java e adaptado para
execução de uma atividade específica dentro de páginas HTML. Assim, essas páginas podem
ser visualizadas em um browser.

Comentários: Pessoal, applets sempre executam nos clientes web, são escritos em Java,
podem ser visualizadas em um browser.

Gabarito: Correto.

Sintaxe
Identificadores

O Java é case sensitive, ou seja, Java diferencia maiúsculas de minúsculas: "MyClass" e "myclass"
têm significados diferentes assim como Analista é diferente de analista.

Por convenção, os nomes de classes iniciam com uma letra maiúscula e apresentam a letra inicial
de cada palavra que eles incluem em maiúscula (por exemplo, SampleClassName). O nome de
uma classe é um identificador — uma série de caracteres que consiste em letras, dígitos,
sublinhados ( _ ) e sinais de cifrão ($) que não inicie com um dígito e não contenha espaços. Alguns
identificadores válidos são Welcome1, $valor, _valor, m_campoDeEntrada1 e botao7. O nome
7botao não é um identificador válido porque inicia com um dígito, e o nome campo de entrada
não é um identificador válido porque contém espaços. Normalmente, um identificador que não
inicia com uma letra maiúscula não é um nome de classe. O Java faz distinção entre maiúsculas e
minúsculas — letras maiúsculas e letras minúsculas são diferentes — assim, value e Value são
identificadores diferentes (mas ambos válidos).

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 36


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Utilizamos, em Java, as seguintes regras para criação do identificador:

● não pode ser uma palavra-reservada (palavra-chave);


● não pode ser true nem false - literais que representam os tipos lógicos (booleanos);
● não pode ser null - literal que representa o tipo nulo;
● não pode conter espaços em brancos ou outros caracteres de formatação;
● deve ser a combinação de uma ou mais letras e dígitos UNICODE-16. Por exemplo, no
alfabeto latino, teríamos:
o letras de A a Z (de \u0041 a \u005a);
o letras de a a z (de \u0061 a \u007a);
o sublinha _ (\u005f);
o cifrão $ (\u0024);
o dígitos de 0 a 9 (de \u0030 a \u0039).

não pode ser uma palavra-reservada (palavra-chave);


Regras para criação
do identificador

não pode ser true nem false;

não pode ser NULL;

não pode conter espaços em brancos ou outros caracteres de


formatação;
deve ser a combinação de uma ou mais letras e dígitos
UNICODE-16

Blocos e Comandos

Blocos de programação são aglomerados de instruções e declarações que têm escopo conjunto.
Ou seja, as variáveis definidas como locais dentro de um bloco somente serão presentes dentro
deste bloco assim como as instruções ali presentes. Os blocos de programação são delimitados
por chaves e podem ser aninhados - colocados um dentro dos outros. Por exemplo:

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 37


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

// este é um bloco de programação

int a=10;

// este é um bloco de programação

int a=10;

int b=1;

if (b==3) {

// este é um bloco que é executado se b for igual a 3

b=a*10;

} else {

// este é um bloco que é executado se b for diferente de 3

int a=100;

b=a*10;

[Link]("O valor de b é " + b);

Comentários

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 38


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Inserimos comentários para documentar programas e aprimorar sua legibilidade. O compilador


Java ignora os comentários, portanto, eles não fazem o computador realizar qualquer ação quando
o programa é executado. Por convenção, iniciamos cada programa com um comentário indicando
o número da figura e o nome do arquivo.

// [Link]

// Programa de impressão de texto.

O Java também tem comentários tradicionais, que podem ser distribuídos ao longo de várias
linhas, como em

/* Esse é um comentário tradicional.

Ele pode ser dividido em várias linhas */

Eles começam e terminam com delimitadores, /* e */. O compilador ignora todo o texto entre os
delimitadores. O Java incorporou comentários tradicionais e comentários de fim de linha das
linguagens de programação C e C++, respectivamente. Preferimos usar comentários //.

O Java fornece comentários de um terceiro tipo: comentários Javadoc. Esses são delimitados por
//** e */. O compilador ignora todo o texto entre os delimitadores. Os comentários no estilo
Javadoc permitem-lhe incorporar a documentação do programa diretamente aos seus programas.
Esses comentários são o formato de documentação Java preferido na indústria. O programa
utilitário javadoc (parte do JDK) lê comentários Javadoc e os usa para preparar a documentação
do programa no formato HTML.

Palavras Reservadas

Em programação, palavras-chave, ou palavras reservadas, são as palavras que não podem ser
usadas como identificadores, ou seja, não podem ser usadas como nome de variáveis, nome de
classes, etc. Estas palavras são assim definidas ou porque já têm uso na sintaxe da linguagem ou

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 39


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

porque serão usadas em algum momento, seja para manter compatibilidade com versões
anteriores ou mesmo com outras linguagens. No caso do Java temos as seguintes palavras-chave:

Palavra Descrição
Um modificador sem acesso. Usado para classes e métodos: Uma classe
abstrata não pode ser usada para criar objetos (para acessá-la, ela deve ser
abstract herdada de outra classe). Um método abstrato só pode ser usado em uma
classe abstrata e não possui um corpo. O corpo é fornecido pela subclasse
(herdado de)
boolean Um tipo de dados que pode armazenar apenas valores verdadeiros e falsos
break Sai de um loop ou de um bloco de repetição
byte Um tipo de dados que pode armazenar números inteiros de -128 e 127
case Marca um bloco de código em instruções switch
catch Captura exceções geradas por instruções try
char Captura exceções geradas por instruções try
class Define uma classe
const Define uma constante. Não está em uso - use final.
continue Continua para a próxima iteração de um loop
default Especifica o bloco de código padrão em uma instrução switch
do Usado junto com while para criar um loop do-while.
Um tipo de dados que pode armazenar números inteiros de 1,7e−308 a
double
1,7e+308
else Usado em instruções condicionais
enum Declara um tipo enumerado (imutável)
extends Estende uma classe (indica que uma classe é herdada de outra classe)
Um modificador sem acesso usado para classes, atributos e métodos, o que
final
os torna inalteráveis (impossíveis de herdar ou substituir)
Usado com exceções, um bloco de código que será executado independente
finally
de haver uma exceção ou não
Um tipo de dados que pode armazenar números inteiros de 3.4e−038 a
float
3.4e+038
for Criar um loop for
goto Não está em uso
if Faz uma declaração condicional
implements Implementa uma interface
import Usado para importar um pacote, classe ou interface
Verifica se um objeto é uma instância de uma classe específica ou uma
instanceof
interface
Um tipo de dados que pode armazenar números inteiros de -2147483648 a
int
2147483647

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 40


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Usado para declarar um tipo especial de classe que contém apenas métodos
interface
abstratos
Um tipo de dados que pode armazenar números inteiros de -
long
9223372036854775808 a 9223372036854775808
módulo Declara um módulo. Novo no Java 9
Especifica que um método não é implementado no mesmo arquivo de
native
origem Java (mas em outra linguagem)
new Cria novos objetos
package Declara um pacote
Um modificador de acesso usado para atributos, métodos e construtores,
private
tornando-os acessíveis apenas dentro da classe declarada
Um modificador de acesso usado para atributos, métodos e construtores,
protected
tornando-os acessíveis no mesmo pacote e subclasses
Um modificador de acesso usado para classes, atributos, métodos e
public
construtores, tornando-os acessíveis por qualquer outra classe
requires Especifica as bibliotecas necessárias dentro de um módulo. Novo no Java 9
Finalizou a execução de um método e pode ser usado para retornar um valor
return
de um método
short Um tipo de dados que pode armazenar números inteiros de -32768 a 32767
Um modificador sem acesso usado para métodos e atributos.
static Métodos/atributos estáticos podem ser acessados sem criar um objeto de
uma classe
strictfp Restringir a precisão e o arredondamento dos cálculos de ponto flutuante
super Refere-se a objetos da superclasse (pai)
switch Seleciona um dos muitos blocos de código a serem executados
Um modificador sem acesso, que especifica que os métodos só podem ser
synchronized
acessados por um thread por vez
this Refere-se ao objeto atual em um método ou construtor
throw Cria um erro personalizado
throws Indica quais exceções podem ser lançadas por um método
Um modificador sem acesso, que especifica que um atributo não faz parte
transient
do estado persistente de um objeto
try Cria uma instrução try...catch
var Declara uma variável. Novo no Java 10
void Especifica que um método não deve ter um valor de retorno
Indica que um atributo não é armazenado em cache localmente e é sempre
volatile
lido da "memória principal"
while Cria um loop while

Pessoal, estes modificadores são MUITO importantes e caem MUITO nas provas! Portanto repeti
uma tabela com os modificadores de acesso!

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 41


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

modificadores Descrição
A classe e/ou seus membros são acessíveis somente por classes do mesmo
Default ou package pacote, na sua declaração não é definido nenhum tipo de modificador,
sendo este identificado pelo compilador. Permite que apenas classes do
mesmo pacote tenham acesso as propriedades que possuem este
modificador.
public O código é acessível para todas as classes
Membros da classe definidos como private não podem ser acessados ou
usados por nenhuma outra classe. Esse modificador não se aplica às classes,
somente para seus métodos e atributos. Esses atributos e métodos também
private
não podem ser visualizados pelas classes herdadas.

O modificador protected torna o membro acessível às classes do mesmo


pacote ou através de herança, seus membros herdados não são acessíveis a
protected outras classes fora do pacote em que foram declarados.

NOME CLASSE SUBCLASSE PACOTE GLOBAL


PRIVADO Sim Não Não Não
PROTEGIDO Sim Sim Não Não
PÚBLICO Sim Sim Sim Sim
PACOTE Sim Não Sim Não

Tipos Primitivos

Os tipos do Java são divididos em primitivos e por referência. Os tipos primitivos são int, boolean,
byte, char, short, long, float e double.

Java requer que todas as variáveis tenham um tipo. Por essa razão, o Java é referido como
linguagem fortemente tipada. Em C e C++, os programadores frequentemente têm de escrever
versões separadas dos programas a fim de que ele suporte diferentes plataformas de computador,
uma vez que não há garantia de que tipos primitivos sejam idênticos entre um computador e outro.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 42


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Por exemplo, um int em uma máquina pode ser representado por 16 bits (2 bytes) de memória,
em uma segunda máquina por 32 bits (4 bytes) e em outra máquina por 64 bits (8 bytes). No Java,
valores int são sempre de 32 bits (4 bytes).

Uma variável de tipo primitivo pode armazenar exatamente um valor de seu tipo declarado por
vez. Por exemplo, uma variável int pode armazenar um número inteiro de cada vez. Quando outro
valor é atribuído a essa variável, ele substitui o anterior — que é perdido. Lembre-se de que as
variáveis locais não são inicializadas por padrão. Já as variáveis de instância de tipo primitivo são
inicializadas por padrão — dos tipos byte, char, short, int, long, float e double como 0, e as do
tipo boolean como false.

Os programas utilizam as variáveis de tipo por referência (normalmente chamadas referências)


para armazenar as localizações de objetos na memória do computador. Dizemos que essa variável
referencia um objeto no programa. Objetos que são referenciados podem conter muitas variáveis
de instância.

Todo tipo primitivo tem uma classe empacotadora de tipo correspondente (no pacote [Link]).
Essas classes chamam-se Boolean, Byte, Character, Double, Float, Integer, Long e Short. Elas
permitem manipular valores de tipo primitivo como objetos.

Cada uma das classes empacotadoras de tipo numéricas — Byte, Short, Integer, Long, Float e
Double — estende a classe Number. Além disso, as classes empacotadoras de tipo são classes
final, então não é possível estendê-las. Os tipos primitivos não têm métodos, então os métodos
relacionados a um tipo primitivo estão localizados na classe empacotadora de tipo correspondente
(por exemplo, o método parseInt, que converte uma String em um valor int, está localizado na
classe Integer).

NOME TIPO TAMANHO MÍNIMO MÁXIMO DEFAULT


LÓGICO boolean - false true false
CARACTERE char 16 bits 0 216 – 1 ‘\u0000’
byte 8 bits -27 27 – 1 0
short 16 bits -215 215 – 1 0
INTEIRO
int 32 bits -231 231 – 1 0
long 64 bits -263 263 – 1 0

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 43


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

float 32 bits 7 Casas Decimais 0.0


DECIMAL double 64 bits 15 Casas Decimais 0.0

O Java fornece conversões boxing e unboxing que convertem automaticamente entre valores de
tipo primitivo e objetos empacotadores de tipo. Uma conversão boxing converte um valor de um
tipo primitivo em um objeto da classe empacotadora de tipo correspondente. Uma conversão
unboxing converte um objeto de uma classe empacotadora de tipo em um valor do tipo primitivo
correspondente. Essas conversões são executadas automaticamente — o que é chamado de
autoboxing e auto-unboxing. Considere as seguintes instruções:

Integer[] integerArray = new Integer[5]; // cria integerArray

integerArray[0] = 10; // atribui Integer 10 a integerArray[0]

int value = integerArray[0]; // obtém valor int de Integer

Nesse caso, o autoboxing ocorre ao atribuir-se um valor int (10) a Array[0] integer, porque Array
integer armazena referências a objetos Integer, não valores int. O auto-unboxing ocorre ao
atribuir-se integerArray[0] à variável int value, porque a variável value armazena um valor value,
não uma referência a um objeto Integer. As conversões boxing também ocorrem em condições
que podem ser avaliadas para valores boolean primitivos ou objetos Boolean

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 44


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

(FCC / TRF 3ª Região – 2019) Java possui um conjunto de tipos de dados conhecidos como
primitivos, dos quais NÃO faz parte o tipo

a) short.

b) long.

c) string.

d) byte.

e) float.

Comentários: Pessoal, vejamos os nomes e os tipos primitivos existentes: lógico: boolean;


caractere: char; inteiro: byte, short, int, long, float; decimal: double. Das opções
apresentadas, a única que não consta é a string.

Gabarito: Letra C.

Operadores

Operadores são símbolos que representam atribuições, cálculos e ordem dos dados. As operações
seguem uma ordem de prioridades, ou seja, alguns cálculos (ou outros) são processados antes de
outros. Por exemplo, na Álgebra podemos mostrar a seguinte ordem: primeiro divisão e
multiplicação e depois soma e subtração.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 45


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Operadores Aritméticos +, -, *, /, %.

Aritméticos Atribuição Relacionais Lógicos Bit A Bit


+ = > ! &
- += < && |
* -= >= || ^
/ *= <= <<
% /= != >>
%= == >>>
++ ?
-- instanceof

Assim, as operações de divisão e multiplicação, por serem de ordem 1, serão executadas antes
das operações de soma e subtração (ordem 2). Também, as operações de divisão e multiplicação
são de mesma ordem (1) e não importa, entre si, a ordem da operação (2 dividido por 4 vezes 9 é
igual a 2 vezes 9 dividido por 4).

Os operadores são divididos em 3 tipos em relação à quantidade de operandos no qual operam:


unário, binário e ternário.

int a = 5, b = 2, c = 0;

a--; // -- é um operador unário pois opera apenas em a;

c = a * b; // * é um operador binário pois opera em a e b.

c = c < 0 ? a : b; // ?: é O operador ternário. Opera em na expressão booleana (c < 0), e em a


ou b.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 46


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Operadores Relacionais >, <, >=, <=, ==, != , ? , instanceof

Operadores Lógicos: !, &&, ||.

Operadores Bit a Bit (ou Bitwise): &, |, ^, <<, >>, >>>.

Precedência indica a ordem na qual um operador opera em relação à avaliação de uma expressão.
A tabela seguinte elenca os operadores por precedência, do maior para o menor.

Tipo de Operador Lista de Operadores


Sufixais expr++ expr--
Prefixais ++expr --expr +expr -expr ~ !
Multiplicativos */%
Aditivos +-
Shift Binário << >> >>>
Comparativos < > <= >= instanceof
igualdade == !=
Bit-a-Bit E &
Bit-a-Bit XOU OR ^
Bit-a-Bit OU OR |
Lógico E &&
Lógico OU ||
Ternário ?:
Atribuição = += -= *= /= %= &= ^= |= <<= >>= >>>=

Precedência 0: atribuições

Os operadores de atribuição são os mais numerosos e os que tem uma prioridade menor de serem
interpretados. Ele armazena o valor que aparecer à direita na variável presente à esquerda. Caso
deseje-se que a variável da esquerda receba o valor dela mesma após passar por alguma operação

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 47


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

com um segundo valor, basta colocar o símbolo da operação antes do sinal "=" e colocar o
segundo valor à direita. Exemplos de uso:

int numero = 3; //numero recebe o valor 3

numero += 7; //numero recebe 3+7. Ou seja, 10.

numero -= 32; //numero recebe o seu valor menos 32. Ou seja, -22.

numero %= -3; //numero recebe o resto da divisão entre seu valor e -3. Ou seja, -1.

numero *= 6; //numero recebe o seu valor vezes 6. Ou seja, -6.

numero /= 2; //numero recebe o seu valor dividido por 2. Ou seja, -3.

Quando em uma mesma linha forem encontrados vários operadores diferentes, serão executados
primeiro aqueles que tiverem maior precedência. Se existirem operadores com o mesmo valor de
precedência, será realizado primeiro aquele cujo símbolo aparecer primeiro. É possível alterar a
ordem natural com que são feitas as operações através do uso de parênteses. As operações entre
parênteses sempre são realizadas antes.

Precedência 1: operadores ternários

O operador ternário ? : recebe ao todo três operandos. O primeiro operando deve possuir
necessariamente um valor do tipo boolean. Os outros dois operandos podem ser de qualquer
tipo. Caso o valor do primeiro operando seja "verdadeiro", o operador retorna um valor igual ao
do segundo operando. Caso o seu valor seja "falso", ele retorna um valor idêntico ao terceiro
operando. Exemplos de uso:

int numero1=245;

int numero2=123;

numero1=(numero1>numero2)?numero1:numero2; /* Faz com que a variavel numero 1 receba


sempreo maior valor entre ela mesma e a numero2. Neste caso, ela receberá o seu prório valor
por ele ser maior*/

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 48


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Precedência 3 e 2: operadores AND e OR

Os operadores AND e OR só podem ser usados em variáveis e literais do tipo boolean. O operador
AND (&&) retorna "verdadeiro" quando seus dois operandos também valem "verdadeiro" e
retorna "falso" caso contrário. O operador OR (||) retorna "falso" quando seus dois operandos são
falsos e retorna "verdadeiro" caso contrário. Exemplos de uso:

boolean variavel;

variavel=(2<45)&&(45<2) //variavel passa a valer "falso"

variavel=(2<45)||(45<2) //variavel passa a valer "verdadeiro"

Precedência 6, 5 e 4: operadores Bit-a-Bit

Os Operadores Bit-a-Bit são todos aqueles que realizam suas operações sobre os bits de um
número, e não sobre o seu valor. Existem ao todo três destes operadores e cada um deles tem
um valor de precedência diferente. O que tem precedência mais alta é o AND bit-a-bit (&). Ele
analisa dois bits e retorna 1 se ambos forem iguais à 1 e 0 caso contrário. Depois vem o OR
exclusivo bit-a-bit (^) que retorna 1 se os bits forem diferentes e 0 caso contrário. Por último, vem
o operador OR inclusivo (|), que retorna 0 caso ambos os bits valerem 0 e retorna 1 caso contrário.
Estes operadores podem ser usados em qualquer tipo de dados, desde que possuam o mesmo
tamanho em bits. Exemplos de uso:

int numero;

numero=34&435; //numero passa a valer 34

numero=34^46; //numero passa a valer 12

numero=436|547; //numero passa a valer 951

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 49


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Precedência 7: operadores de igualdade

São semelhantes aos Operadores Comparativos. Eles também recebem números como operandos
e retornam um valor boolean. A diferença é que estes operadores apenas verificam se as variáveis
são iguais ou não. Como exemplos de operadores assim, pode-se citar o Igual a (==) e Diferente
de (!=). Estes operadores podem ser usados em qualquer tipo de variável, desde que elas sejam
do mesmo tipo. Exemplos de uso:

boolean variavel;

variavel=(-5==5); //variavel recebe "falso"

variavel=(2!=45674); //variavel recebe "verdadeiro"

Ao utilizar operadores de igualdade com objetos, a comparação é feita entre suas referências.
Dessa forma, dois objetos cognitivamente iguais, podem ser avaliados como diferentes. Exemplo:

class Pessoa{

String nome;

public Pessoa(String nome){

[Link] = nome;

new Pessoa("miguel") == new Pessoa("miguel") // comparação avaliada como falsa

Precedência 8: operadores comparativos

São operadores que comparam dois números e retornam em seguido o valor booleano
"verdadeiro" ou "falso". Como exemplo, pode-se citar o Menor que(<), Maior que (>), Menor ou

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 50


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Igual que(<=), Maior ou Igual que (>=) e Exemplo de (instanceof). O significado dos quatro
primeiros operadores é evidente. Já a operação Exemplo de, retorna "verdadeiro" se o primeiro
operando for um Objeto pertencente à classe passada como segundo operando e "falso" caso
contrário. Exemplos de uso:

boolean variavel;

variavel=(4<4); //variavel recebe "falso"

variavel=(4<=4); //variavel recebe "verdadeiro"

variavel=(-1>-3); //variavel recebe "verdadeiro"

variavel=(-4>=0); //variavel recebe "falso"

Precedência 9: operadores de shift

São operadores que deslocam os bits de um número de modo a alternar o seu valor. Exemplos de
operadores deste tipo são o Shift para a Direita (>>), o Shift para a Direita Sem-Sinal(>>>) e o
Shift para a Esquerda (<<). O primeiro valor a ser recebido pelo operador é o número sobre o
qual será realizado um Shift e o segundo número é a quantidade de posições de bits a serem
deslocados. Exemplos de uso:

int numero=-3; //numero vale -3

numero=numero>>1; //numero vale -2

numero=numero<<1; //numero vale -4

numero=numero>>>1; //numero vale 2147483646

numero=numero<<1; //numero vale -4

Precedência 10: operadores aditivos

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 51


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

São operadores que realizam alguma operação igual ou equivalente à adição. Assim como os
Operadores Multiplicativos, os Aditivos podem ser usados tanto em variáveis como em literais
(quando fazem a concatenação de strings). Mas também não podem ser usados em variáveis char
e boolean. Eles também não alteram as variáveis passadas para eles. No lugar disso, eles retornam
um número que deve ser direcionado par uma variável por meio da operação de atribuição (veja
abaixo). Exemplos de uso:

int numero=5; //numero passa a valer 5

numero=numero+8; //numero passa a valer 13

numero=numero-numero; //numero passa a valer zero

String x="Alo"; // x é inicializado com a string "Alo"

String y="Mundo!"; // y é inicializado com a string "Mundo!"

x = x + ", " + y; // x passa a valer "Alo, Mundo!"

Precedência 11: operadores multiplicativos

São operadores que realizam uma operação igual ou semelhante à multiplicação. Exemplos de
operações do tipo são a Multiplicação (*), a Divisão (/) e o Resto (%). O primeiro pode realizar a
multiplicação entre dois valores que não sejam do tipo boolean e nem do tipo char. O segundo
pode dividir o primeiro número pelo segundo. Também não pode ser usado em valores booleans
ou char. O terceiro retorna o resto da divisão do primeiro pelo segundo. Exemplos de uso:

int numero=5; //numero passa a valer 5

numero=numero*4; //numero assume o valor 20

numero=200/numero; //numero assume o valor 10

numero=5%12; //numero assume o valor 5

Precedência 12: operadores prefixais

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 52


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

São operadores unários que alteram o valor de uma variável e seus sinais são posicionados antes
do identificador da variável. Como exemplo, pode-se citar o Incremento ++, Decremento --, Sinal
Positivo +, Sinal Negativo -, Inversão e Incremento ~ e Negação !. O incremento e decremento, já
vimos o que faz. Eles estão sendo citados aqui novamente porque seus sinais podem vir antes de
variáveis também e numa operação complexa (com outros operadores binários) alteram a
precedência da operação. O Sinal Positivo + retorna a variável que vem depois dele com o mesmo
sinal, o Sinal Negativo - inverte o sinal de variáveis transformando números positivos em negativo
e vice-versa. Ele não pode ser usado em variáveis dos tipos boolean e char. O Incremento e
Inversão ~ aumenta o número em uma unidade e inverte o seu sinal. Só pode ser usado em
inteiros. Já a operação de negação ! transforma "verdadeiro" em "falso" e vice-versa, só podendo
ser usado em variáveis do tipo boolean. Também só funcionam em variáveis, não em literais.
Exemplos de uso:
==1365fc==

int numero=5; //numero contém 5

boolean ligado=false; //ligado contém "falso"

++numero; //numero agora vale 6

--numero; //numero passa a valer 5

numero=+numero; //numero continua valendo 5

numero=-numero; //numero passa a valer -5

numero=~numero; //numero passa a valer 4

ligado=!ligado; //ligado passa a representar o valor "true"

Observação: uma diferença importante entre os operadores '++' e '--' prefixais e sufixais é o
tempo de avaliação da expressão comparado com a alteração da variável. A saber:

int x = 5; // x contém 5

int y, z; // y e z não foram definidos

y = x++; // primeiro faz y igual ao valor (anterior) de x, e depois modifica x

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 53


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

z = ++x; // primeiro modifica x, e depois atribui a z o novo valor de x

Neste exemplo, temos que, ao final x vale 7 (duas vezes incrementado), y vale 5 (o valor inicial de
x) e z vale 7 (o valor final de x). Deve-se evitar usar mais de um operador prefixal e sufixal na mesma
linha, porque isto torna o código incompreensível, por exemplo: x = (y++ + ++z - --x) + ++y.

Precedência 13: operadores sufixais

São operadores unários posicionados após o identificador da variável para incrementar ++ ou


decrementar -- uma variável de tipo numérico em 1. Não podem ser utilizados em variáveis do
tipo string, boolean ou de referência. Também não podem ser utilizados em valores de expressão
e em literais. Diferente dos operadores de pré incremento/decremento, esses operadores sufixais
retornam o valor original da variável para a expressão e depois realizam a operação sobre a
variável.

int numero = 5; //A variável número é inicializada com 5.

[Link](numero++); //É exibido 5, o valor original, e então a variável é atualizada


para 6.

[Link](numero); //É exibido 6, valor incrementado na instrução anterior.

Pessoal, para entender o que é abordado, é necessário ter conhecimento das operações lógicas.
Isso é abordado na aula de Informática Básica. 1

1
Sistemas Numéricos

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 54


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

(FGV / IMBEL – 2021) Com relação aos operadores bitwise do Java, considere os valores
binários

a = 00111100

b = 00001101

Os valores resultantes das operações a&b e a|b são, respectivamente,

a) 00011100 e 11111101

b) 00001100 e 00111101

c) 00001111 e 00111111

d) 11001110 e 00001100

e) 01101100 e 00100101

Comentários: Pessoal, vamos fazer essa operação! O ideal é fazer em uma folha/tablet – em
forma escrita à mão. Vamos lá, a = 00111100 & b = 00001101 = Do último dígito para o
primeiro (0&1) = 0, (0 & 0) = 0, (1 & 1) = 1, (1 & 1) = 1, (1 & 0) = 0, (1 & 0) = 0, (0 & 0) = 0, (0
& 0) = 0. O resultado de A&B é 00001100. Agora vamos ao segundo a|b, novamente do fim
para o início: (0|1) = 1, (0 | 0) = 0, (1 | 1) = 1, (1 | 1) = 1, (1 | 0) = 1, (1 | 0) = 1, (0 | 0) = 0, (0 | 0)
= 0. O resultado de A|B é 00111101.

Gabarito: Letra B.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 55


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Vetores

Um array ou vetor é um grupo de variáveis (chamados elementos ou componentes) que contém


valores todos do mesmo tipo. É uma estrutura de dados formada por um conjunto de dados ou
outros elementos de um mesmo tipo ou uma mesma estrutura. Pode ter uma dimensão ou mais.
Também chamado de matriz quando de duas dimensões, funciona de modo análogo às matrizes
matemáticas. O acesso aos dados é feito através de "coordenadas" (índices).

Como você logo verá, o que em geral consideramos um array é, na verdade, uma referência a um
objeto array na memória. Ou seja, os arrays são objetos; portanto, são considerados tipos por
referência. Os elementos de um array podem ser tipos primitivos ou tipos por referência.

Para referenciar um elemento particular em um array, especificamos o nome da referência para o


array e o número de posição do elemento no array. O número de posição do elemento é chamado
de índice.

A programação faz um grande uso de vetores. Cada item de um vetor é chamado de elemento.
Cada um dos elementos possui uma posição dentro do vetor, à qual referenciamos através do
índice do elemento. Cada um dos "domínios" (conjunto de posições, endereços de
armazenamentos) do vetor, nós chamamos de dimensão. Já o tipo de dado (ou de elemento)
corresponde ao "contradomínio" do vetor, ou seja, o conjunto de literais ou de outro tipo de
elemento que o vetor pode armazenar.

Veja um vetor de uma dimensão e dez elementos:

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 56


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Ele possui 10 elementos que são acessados (referenciados) pelos índices [0], [1], [2], [3], [4], [5], [6],
[7], [8], [9]. Os índices de cada elemento são escritos entre colchetes [ ]. Para declarar um vetor,
utiliza-se a seguinte sintaxe:

tipo[] identificador;

ou

tipo identificador[];

Onde:

tipo = tipo de dado ou de elemento;

identificador = nome do vetor.

Veja um vetor de duas dimensões e vinte e cinco elementos (5 x 5):

Ele possui 25 elementos que são acessados (referenciados) pelos índices:

[0][0], [1][0], [2][0], [3][0], [4][0],

[0][1], [1][1], [2][1], [3][1], [4][1],

[0][2], [1][2], [2][2], [3][2], [4][2],

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 57


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

[0][3], [1][3], [2][3], [3][3], [4][3],

[0][4], [1][4], [2][4], [3][4], [4][4].

Cada elemento é representado por dois índices (um para cada dimensão), entre colchetes e
adjacentes [ ][ ]. É como uma matriz.

grupo de variáveis que contém valores do mesmo tipo


vetor ou array

estrutura de dados com elementos de um mesmo tipo ou uma mesma


estrutura
Pode ter mais de uma dimensão

Índice inicia em zero [0], [1], [2], [3], [4], [5] ...

Os elementos dos vetores podem ser atribuídos da seguinte forma: separados por vírgulas e entre
chaves. Por exemplo, em um vetor unidimensional poderíamos indicar os dados de seus elementos
assim: {x0,x1,x2, ... ,xn}. Em que, cada um dos valores X é um valor do elemento de índice
correspondente no vetor. A numeração dos índices começa a partir do zero e pode ser somente
número natural, ou seja, inteiro maior ou igual a zero.

Vetores podem ser declarados e iniciados conforme o seguinte exemplo - cada dimensão é
delimitada por chaves e cada elemento é separado do outro através de vírgulas:

int[] vetor={34, 27, 3, 2};

Outro modo de uso é declarando, iniciando com o tamanho (quantidade de elementos) do vetor
e depois atribuindo os valores, como o equivalente a seguir:

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 58


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

int[] vetor= new int[4];

vetor={34, 27, 3, 2};

Ou então, atribuindo os elementos individualmente:

int[] vetor= new int[4];

vetor[0]=34;

vetor[1]=27;

vetor[2]=3;

vetor[3]=2;

Para descobrir quantos elementos um array possui, use a propriedade length():

String[] cars = {"Volvo", "BMW", "Ford", "Mazda"};

[Link] ([Link]);

Você pode percorrer os elementos do array com o loop for e usar a propriedade length para
especificar quantas vezes o loop deve ser executado. O exemplo a seguir gera todos os elementos
do array cars:

String[] cars = {"Volvo", "BMW", "Ford", "Mazda"};

for (int i = 0; i < [Link]; i++) {

[Link](cars[i]);

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 59


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Lembre-se que o acesso ao elemento do array se dá pelo índice. Neste exemplo foi utilizado o
índice i – uma variável criada dentro do for (int i = 0).

Outra possibilidade é utilizar o loop "for-each", que é usado exclusivamente para percorrer
elementos em arrays. A sintaxe é:

for (type variable : arrayname) {

...

String[] cars = {"Volvo", "BMW", "Ford", "Mazda"};

for (String i : cars) {

[Link](i);

Veja que a diferença é sutil. Está apenas no “for (String i : cars)”. O exemplo acima pode ser lido
assim: para cada elemento String (chamado i – como no índice) em cars , imprima o valor de i .

Se você comparar o loop for com o loop for-each , verá que o método for -each é mais fácil de
escrever, não requer um contador (usando a propriedade length) e é mais legível.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 60


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

(FGV / IMBEL – 2021) No contexto da linguagem Java, considere um array definido como
segue.

String[] nomes = new String[100];

Assinale a expressão cujo valor corresponde ao índice do último elemento do array nomes.

a) [Link]

b) [Link] - 1

c) [Link]

d) [Link] + 1

e) [Link]

Comentários: Pessoal, para retornar o comprimento de uma string especificada usamos o


método length(). No caso em questão, como foi solicitado o ultimo elemento do array, o
correto seria utilizar o length – 1.

Gabarito: Letra B.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 61


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Conversão de Tipos

A conversão de tipo é quando você atribui um valor de um tipo de dados primitivo a outro tipo.
Em Java, existem dois tipos de conversão:

Ampliação da transmissão (automaticamente) - convertendo um tipo menor em um tamanho de


tipo maior:

doubl
byte short char int long float
e

Estreitando Casting (manualmente) - convertendo um tipo maior para um tipo de tamanho menor
(caminho inverso)

double float long int char short byte

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 62


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

A conversão de ampliação é feita automaticamente ao passar um tipo de tamanho menor para um


tipo de tamanho maior:

public class Main {

public static void main(String[] args) {

int myInt = 9;

double myDouble = myInt; // Automatic casting: int to double

[Link](myInt); // Outputs 9

[Link](myDouble); // Outputs 9.0

A redução da conversão deve ser feita manualmente, colocando o tipo entre parênteses na frente
do valor:

public class Main {

public static void main(String[] args) {

double myDouble = 9.78d;

int myInt = (int) myDouble; // Manual casting: double to int

[Link](myDouble); // Outputs 9.78

[Link](myInt); // Outputs 9

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 63


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Controle de Fluxo

Como pode-se notar, o conhecimento adquirido até aqui não permite a criação de programas
interativos. Eles sempre executam da mesma forma, independente do que o usuário faz ou dos
valores que são recebidos. Mas agora iremos aprender a usar alguns comandos que permitem que
dependendo das circunstâncias, os programas executem instruções diferentes. A instrução de
seleção única if, também conhecida por if-then, possibilita a execução condicional de um bloco de
instruções.

if (expressaoBooleana) {

//instruções que serão executadas caso a expressaoBooleana resulte true.

A expressão Booleana pode ser uma das condições lógicas usuais da matemática:

● Menor que: a < b


● Menor ou igual a: a <= b
● Maior que: a > b
● Maior ou igual a: a >= b
● igual a a == b
● Diferente de: a != b

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 64


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Você pode usar essas condições para executar ações diferentes para decisões diferentes. Depois
da palavra-chave if é necessária uma expressão booleana entre parênteses. Caso a expressão
booleana resulte no valor true em tempo de execução então o bloco seguinte será executado,
caso resulte em false aquele será ignorado. O bloco de instruções pode conter 0 ou mais
instruções. As chaves que delimitam o bloco são opcionais caso se tenha apenas uma instrução a
ser executada.

int hora = 20;

boolean eManha = false;

// Exemplo 1: com bloco.

if (hora <= 12) {

eManha = true;

[Link](hora + " AM");

//Exemplo 2: sem bloco.

if (!eManha)

[Link](hora - 12 + " PM");

[Link](" é o mesmo que " + hora + " horas."); //Esta linha é incondicionalmente
exibida

A saída gera o resultado: 8 PM é o mesmo que 20 horas.

A instrução if...else, também conhecida como instrução if-then-else, a instrução de seleção dupla
if...else tem função complementar à de if: executa instruções no caso da expressão booleana de if
resultar em false.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 65


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

if (expressaoBooleana) {

//instruções que serão executadas caso a expressaoBooleana resulte true.

} else {

//instruções que serão executadas caso a expressaoBooleana resulte false.

A palavra-chave else deve estar logo após da(s) instrução if. Após a palavra-chave else deve ser
colocado o bloco de instruções a serem executadas no caso da expressão booleana de if resultar
em false. Assim como if, as chaves delimitadoras de bloco são opcionais caso haja apenas uma
instrução a executar.

int hora = 20;

if (hora <= 12)

[Link](hora + " AM");

else

[Link](hora - 12 + " PM");

[Link](" é o mesmo que " + hora + " horas."); //Esta linha é incondicionalmente
exibida

As instruções if ou if...else podem ser aninhadas dentro de outras instruções if ou if...else para
casos em que antes de determinadas instruções serem executadas sejam necessárias combinações
de resultados de expressões booleanas.

if (expressaoBooleana1) {

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 66


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

if (expressaoBooleana2) {

// Instruções a serem executadas caso as expressões booleanas 1 e 2 resultem em true.

} else {

// Instruções a serem executadas caso a expressão booleana 1 resulte em true, e a 2 em false.

} else {

if (expressaoBooleana3) {

// Instruções a serem executadas caso a expressão booleana 1 resulte em false, e a 2 em true.

} else {

// Instruções a serem executadas caso as expressões booleanas 1 e 3 resultem em false.

As instruções if e if...else aninhadas não apresentam nenhum comportamento diferente do


esperado caso não estivessem aninhadas. Estão sendo abordadas apenas com o intuito de
exemplificar a possibilidade de aumento das ramificações de decisões.

int hora = 20;

if (hora < 0 || hora >= 24)

if (hora < 0)

[Link]("Erro: A hora deve ser maior que 0.");

else

[Link]("Erro: A hora deve ser menor que 24.");

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 67


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

else {

if (hora <= 12)

[Link](hora + " AM");

else

[Link](hora - 12 + " PM");

[Link](" é o mesmo que " + hora + " horas."); //Esta linha é incondicionalmente
exibida

É possível verificar no exemplo acima que a primeira instrução if mesmo contendo mais de uma
linha de instruções consegue identificar que o if...else forma uma única ramificação e assim
executar a expressão booleana normalmente. Isso se deve ao fato que toda else está vinculada a
uma if. Já na else com o escopo mais externo, verifica-se chaves delimitadoras de bloco. Essas
chaves são necessárias por conta de uma segunda instrução, nomeadamente [Link](),
que é executada independentemente do resultado da expressão booleana da if...else.

int hora = 20;

if (hora < 0)

[Link]("Erro: A hora deve ser maior que 0.");

else if (hora >= 24)

[Link]("Erro: A hora deve ser menor que 24.");

else if (hora <= 12)

[Link](hora + " AM é o mesmo que " + hora + " horas.");

else

[Link](hora + " PM é o mesmo que " + hora + " horas.");

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 68


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

No exemplo acima há um recurso estilístico para indentar o código com a finalidade de aprimorar
a legibilidade. As palavras-chave if foram anexadas às palavras-chave else já que as else têm
somente uma instrução cada e por isso não necessitam de chaves para delimitar bloco de
instruções. O código abaixo tem exatamente a mesma funcionalidade apesar das quebras de linha.

int hora = 20;

if (hora < 0)

[Link]("Erro: A hora deve ser maior que 0.");

else

if (hora >= 24)

[Link]("Erro: A hora deve ser menor que 24.");

else

if (hora <= 12)

[Link](hora + " AM é o mesmo que " + hora + " horas.");

else

[Link](hora + " PM é o mesmo que " + hora + " horas.");

A instrução switch por vezes chamada de switch...case possibilita a execução condicional de


instruções de acordo com a correspondência entre a expressão avaliada e a constante em case.

switch (expressao) {

case constante1:

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 69


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

// Instruções

break;

case constante2:

// Instruções

break;

case default:

// Instruções

Dentro do parâmetro do switch pode ser utilizada expressão que resulte em: byte, short, char, int,
String e enum. As chaves que delimitam o bloco são necessárias ainda que só haja uma ramificação
do fluxo do código. A palavra-chave case indica as ramificações de código. Deve ser seguida de
uma expressão constante que corresponda ao tipo da expressão inserida no parâmetro do switch,
e essa expressão constante, por sua vez, deve ser seguida de: que é o carácter que delimita o
início do bloco de instruções relativo à case. Após: podem ser inseridas 0 ou mais instruções,
incluindo a palavra-chave break que será abordada mais adiante. Ao iniciar outra instrução case
ou inserir a chave de fechamento do bloco de switch o bloco anterior é encerrado.

int dia = 5;

final int segunda = 2;

final int sexta = 6;

switch (dia) {

case segunda:

[Link]("Segunda ");

case 3:

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 70


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

[Link]("Terça ");

case 4:

[Link]("Quarta ");

case 5:

[Link]("Quinta ");

case sexta:

[Link]("Sexta ");

case 7:

[Link]("Sábado ");

case 0:

case 1:

[Link]("Domingo ");

Em tempo de execução, a variável dia será comparada com as expressões constantes, definidas
em tempo de compilação, de cada case. O case contendo o valor 5 tem valor igual ao da variável
dia, então desse ponto em diante todas as instruções serão executadas até que chegue o término
do bloco de switch.

Caso seja necessário que apenas sejam executadas instruções vinculadas a determinadas case
então deve-se utilizar a instrução break. Após a instrução break o fluxo do programa sai do bloco
de switch. A instrução break também pode ser usada para sair de um loop. Por outro lado, a
instrução continue interrompe uma iteração (no loop), se ocorrer uma condição especificada, e
continua com a próxima iteração no loop.

int dia = 5;

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 71


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

final int segunda = 2;

final int sexta = 6;

switch (dia) {

case segunda:

[Link]("Segunda ");

case 3:

[Link]("Terça ");

case 4:

[Link]("Quarta ");

case 5:

[Link]("Quinta ");

case sexta:

[Link]("Sexta ");

break;

case 7:

[Link]("Sábado ");

case 0:

case 1:

[Link]("Domingo ");

[Link]("\n-> Fora do bloco de instruções de switch.");

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 72


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Com a instrução break inserida no bloco da case com valor sexta, o código será executado da case
com valor 5 até essa break referida.

A instrução default pode ser utilizada para o caso de a expressão no parâmetro de switch não
corresponder a nenhum dos valores das instruções case. default pode aparecer em qualquer
ordem e segue o mesmo funcionamento que case no que tange a bloco de instruções e uso de
break.

int dia = -5;

final int segunda = 2;

final int sexta = 6;

switch (dia) {

case segunda:

[Link]("Segunda ");

case 3:

[Link]("Terça ");

case 4:

[Link]("Quarta ");

default:

[Link]("erro: dia deve estar entre [0, 7]");

break;

case 5:

[Link]("Quinta ");

case sexta:

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 73


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

[Link]("Sexta ");

break;

case 7:

[Link]("Sábado ");

case 0:

case 1:

[Link]("Domingo ");

Resumindo, Java tem as seguintes declarações condicionais:

if: especifica um bloco de código a ser executado, se uma


condição especificada for verdadeira
condicionais

else: especifica um bloco de código a ser executado, se a


mesma condição for falsa
else if: especificar uma nova condição a ser testada, se a
primeira condição for falsa
switch: especifica muitos blocos alternativos de código a serem
executados

Vejamos agora os Loops! Os loops podem executar um bloco de código desde que uma condição
especificada seja alcançada. Os loops são úteis porque economizam tempo, reduzem erros e
tornam o código mais legível. O Loop While percorre um bloco de código desde que uma
condição especificada seja verdadeira (true):

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 74


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

while (condition) {

// bloco de codigo a ser executado caso a condição seja verdadeira

Não esqueça de aumentar a variável usada na condição, caso contrário o loop nunca terminará!

O loop do/while é uma variante do loop while. Este loop executará o bloco de código uma vez,
antes de verificar se a condição é verdadeira, então repetirá o loop enquanto a condição for
verdadeira.

do {

// code block to be executed

while (condition);

O exemplo abaixo usa um loop do/while. O loop sempre será executado pelo menos uma vez,
mesmo que a condição seja falsa, pois o bloco de código é executado antes que a condição seja
testada:

int i = 0;
do {

[Link](i);

i++;

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 75


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

while (i < 5);

(CESPE / SEED – PR – 2021) Em Java, a estrutura de repetição que permite que um conjunto
de instruções não seja executada nenhuma vez é representada por

a) while.

b) switch.

c) do...while.

d) case.

e) continue.

Comentários: Pessoal, o comando while é pré-testado, ou seja, antes de executar qualquer


comando, testa-se a condição oferecida, portanto, permite que um conjunto de instruções
não seja executada nenhuma vez.

Gabarito: Letra A.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 76


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Classes e Objetos

Vamos retomar os princípios da programação procedural e a programação orientada a objetos


para entender classes. A programação procedural consiste em escrever procedimentos ou
métodos que executam operações nos dados, enquanto a programação orientada a objetos trata
da criação de objetos que contêm dados e métodos.

A programação orientada a objetos tem várias vantagens sobre a programação procedural

● POO é mais rápido e fácil de executar


● POO fornece uma estrutura clara para os programas
● POO ajuda a manter o código Java DRY "Don't Repeat Yourself" e torna o código mais
fácil de manter, modificar e depurar
● POO possibilita a criação de aplicativos reutilizáveis, completos com menos código e menor
tempo de desenvolvimento

Agora, bora lá, o que são Classes e Objetos? Classes e objetos são os dois principais aspectos da
programação orientada a objetos. Uma classe nada mais é do que um projeto de um objeto. Ao
definirmos classes estamos modelando uma entidade que pode ser criada várias vezes com a
mesma definição. Sendo que ao necessitarmos utilizar essa entidade temos que criar um objeto
através do nosso modelo que é a classe.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 77


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Maçã
Classe

Objetos
FRUTA
Manga Banana

Tudo em Java está associado a classes e objetos, juntamente com seus atributos e métodos. Por
exemplo: na vida real, um carro é um objeto. O carro tem atributos, como peso e cor, e métodos,
como tração e freio. Uma classe é como um construtor de objetos, ou um "projeto" para criar
objetos.

Volvo
Classe

Objetos
Carro
Toyota Audi

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 78


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Pessoal, uma classe é uma “coisa” mais generalista, por


exemplo, fruta, carro... Já, o objeto consiste na
“especificação” daquela “coisa”. Como é o caso do carro
Toyota, por exemplo. Quando você pensa em uma classe
carro, o que vem a cabeça?

Quatro rodas, porta, volante... o que o carro geralmente tem,


certo?

Quando pensamos no objeto “Carro Toyota” há


uma visão mais elaborada, certo? Eu por exemplo
já imagino um Corolla Cross . Da mesma forma
que a classe Carro possui quatro rodas, uma cor,
uma marca, um modelo, o objeto especifica esses
atributos. Assim, uma classe é um modelo para
objetos e um objeto é uma instância de uma classe.
Quando os objetos individuais são criados, eles
herdam todas as variáveis e métodos da classe.

Assim como alguém tem de fabricar um carro a partir dos desenhos de engenharia antes que
possa realmente dirigi-lo, você deve construir um objeto de uma classe antes que um programa
possa executar as tarefas que os métodos da classe definem. O processo para fazer isso é chamado
instanciação. Um objeto é então referido como uma instância da sua classe.

Assim como os desenhos de engenharia de um carro podem ser reutilizados várias vezes para
fabricar muitos carros, você pode reutilizar uma classe muitas vezes para construir vários objetos.
A reutilização de classes existentes ao construir novas classes e programas economiza tempo e
esforço. Também ajuda a construir sistemas mais confiáveis e eficientes, porque classes e
componentes existentes costumam passar por extensos testes, depuração e ajuste de
desempenho. Assim como a noção das partes intercambiáveis foi crucial para a Revolução
Industrial, classes reutilizáveis são fundamentais para a revolução de software que foi estimulada
pela tecnologia de objetos.

Ao dirigir um carro, o ato de pressionar o acelerador envia uma mensagem para o veículo realizar
uma tarefa — isto é, ir mais rápido. Da mesma forma, você envia mensagens para um objeto. Cada
mensagem é implementada como uma chamada de método que informa a um método do objeto

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 79


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

a maneira de realizar sua tarefa. Por exemplo, um programa pode chamar o método depósito de
um objeto conta bancária para aumentar o saldo da conta.

E na prática? Como criar uma classe? Para criar uma classe chamada " Main" com uma variável x,
devemos seguir a seguinte sintaxe:

public class Main {

int x = 5;

Lembre-se que uma classe deve sempre começar com uma primeira letra maiúscula e que o nome
do arquivo java deve corresponder ao nome da classe.

Para criar um objeto a partir de uma classe, podemos usar a classe main para criar os objetos. Para
criar um objeto de Main, especifique o nome da classe, seguido pelo nome do objeto e use a
palavra-chave new. No exemplo, é criado um objeto chamado " myObj" e imprime o valor de x:

public class Main {

int x = 5;

public static void main(String[] args) {

Main myObj = new Main();

[Link](myObj.x);

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 80


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Atributos

Relembrando nosso exemplo, um carro, além de ter a capacidade de realizar tarefas, também tem
atributos, como cor, número de portas, quantidade de gasolina no tanque, velocidade atual e
registro das milhas totais dirigidas (isto é, a leitura do hodômetro). Assim como suas capacidades,
os atributos do carro são representados como parte do seu projeto nos diagramas de engenharia
(que, por exemplo, incluem um hodômetro e um medidor de combustível).

Ao dirigir um carro real, esses atributos são incorporados a ele. Cada carro mantém seus próprios
atributos. Cada carro sabe a quantidade de gasolina que há no seu tanque, mas desconhece
quanto há no tanque de outros carros. Um objeto, da mesma forma, tem atributos que ele
incorpora à medida que é usado em um programa. Esses atributos são especificados como parte
da classe do objeto. Por exemplo, um objeto conta bancária tem um atributo saldo que representa
a quantidade de dinheiro disponível. Cada objeto conta bancária sabe o saldo que ele representa,
mas não os saldos de outras contas bancárias. Os atributos são especificados pelas variáveis de
instância da classe.

Podemos acessar atributos criando um objeto da classe e usando a sintaxe de ponto ( .). O
exemplo a seguir criará um objeto da classe Main, com o nome myObj. Usamos o x atributo no
objeto para imprimir seu valor:

public class Main {

int x = 5;

public static void main(String[] args) {

Main myObj = new Main();

[Link](myObj.x);

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 81


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Para modificar o atributo x, podemos realizar a seguinte operação:

myObj.x = 40;

Ou substitua os valores existentes:

myObj.x = 25; // x passa a ser igual a 25

Há também a possibilidade de impedir que os atributos sejam modificados! . Para impedir a


substituição de valores existentes, declare o atributo como final:

public class Main {

final int x = 10;

public static void main(String[] args) {

Main myObj = new Main();

myObj.x = 25; // will generate an error: cannot assign a value to a final variable

[Link](myObj.x);

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 82


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

A palavra-chave final é útil quando você deseja que uma variável armazene sempre o mesmo valor,
como PI (3.14159...). Ela é chamada de "modificador".

Vejamos como são criados métodos em classes! No exemplo, será criado um método denominado
“myMethod”. myMethod()imprime um texto (Hello World!), quando é chamado . Para chamar um
método, escreva o nome do método seguido por dois parênteses () e um ponto e vírgula;
(myMethod();)

public class Main {

static void myMethod() {

[Link]("Hello World!");

public class Main {

static void myMethod() {

[Link]("Hello World!");

public static void main(String[] args) {

myMethod();

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 83


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Frequentemente, você verá programas Java que possuem atributos e métodos static ou public.
No exemplo acima, criamos um static método, o que significa que ele pode ser acessado sem criar
um objeto da classe, diferente de public , que só pode ser acessado por objetos:

A palavra-chave public é um modificador de acesso, o que significa que é usado para definir o
nível de acesso para classes, atributos, métodos e construtores. Dividimos os modificadores em
dois grupos:

Modificadores de acesso: controlam o nível de acesso.

Modificadores de não acesso: não controlam o nível de acesso, mas fornecem outras
funcionalidades.

Para classes, você pode usar public default .

modificador descrição
public A classe é acessível por qualquer outra classe
A classe só é acessível por classes no mesmo pacote. Isso é usado quando
default
você não especifica um modificador.

Para atributos, métodos e construtores, você pode usar um dos seguintes:

modificador descrição
A classe, métodos ou atributos assim declarados podem ser acessadas em
public qualquer lugar e a qualquer momento da execução do programa – é o
modificador menos restritivo.
O código só é acessível dentro da classe declarada. Marca a visibilidade do
método ou variável de instância para que apenas a própria classe acesse.
Membros da classe definidos como private não podem ser acessados ou
private
usados por nenhuma outra classe. Esse modificador não se aplica às classes,
somente para seus métodos e atributos. Esses atributos e métodos também
não podem ser visualizados pelas classes herdadas. métodos ou atributos

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 84


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

(classes, não) assim declaradas podem ser acessadas apenas dentro da classe
que os criou. Subclasses herdam-nos, mas não os acessam – é o modificador
mais restritivo.

O código só é acessível no mesmo pacote. Isso é usado quando você não


default
especifica um modificador.
O código é acessível no mesmo pacote e subclasses. Marca a visibilidade de
um método ou variável de instância para que apenas a própria classe ou suas
filhas acessem. O modificador protected torna o membro acessível às classes
protected do mesmo pacote ou através de herança, seus membros herdados não são
acessíveis a outras classes fora do pacote em que foram declarados.

Vejamos um compilado de informações: entenda, se uma classe for do tipo Privado, a própria
classe pode acessar? Sim! A subclasse? Não! O pacote? Não! E o programa de forma global?
Também não! Privado é o modificador mais restritivo! Já o público é o oposto! Todos (classe,
sublcasse, pacote e global) conseguem acessar.

NOME CLASSE SUBCLASSE PACOTE GLOBAL


PRIVADO Sim Não Não Não
PROTEGIDO Sim Sim Não Não
PÚBLICO Sim Sim Sim Sim
PACOTE Sim Não Sim Não

Outros modificadores: Para classes, você pode usar final ou abstract:

modificador descrição
final A classe não pode ser herdada por outras classes
A classe não pode ser usada para criar objetos. Para acessar uma classe
abstract
abstrata, ela deve ser herdada de outra classe.

Para atributos e métodos, você pode usar um dos seguintes:

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 85


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

modificador descrição
final Atributos e métodos finais não podem ser substituídos/modificados
static Atributos e métodos estáticos pertencem à classe, em vez de um objeto
Só pode ser usado em uma classe abstrata e só pode ser usado em métodos.
abstract O método não tem um corpo, por exemplo abstract void run();. O corpo é
fornecido pela subclasse (herdado da subclasse).
transient Atributos e métodos são ignorados ao serializar o objeto que os contém
synchronized Métodos synchronized só podem ser acessados por um thread por vez
O valor de um atributo não é armazenado em cache localmente e é sempre
volatile
lido na "memória principal"

Modificador de acesso - controla o nível de acesso.


Modificador de não acesso - fornecem outras funcionalidades
Modificadores

final: impossibilita substituição dos valores de atributo existentes

static: possibilita o acesso sem criar um objeto da classe

abstract: método que pertence a uma classe abstract e não possui um


corpo. O corpo é fornecido pela subclasse

(FGV / SEFAZ-AM – 2022) A serialização de objetos na linguagem de programação Java


permite representar o estado de um objeto como uma sequência de bytes que podem ser
armazenados em um arquivo ou banco de dados.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 86


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Para impedir que o conteúdo de determinado atributo seja convertido em bytes no processo
padrão de serialização, este atributo deve ser declarado na classe com o modificador

a) final.

b) native.

c) volatile.

d) transient.

e) synchronized.

_______________________

Comentários: Pessoal, olha que questão interessante! Falamos na aula que variáveis de
instância não Serializable devem ser declaradas transient para indicar que elas devem ser
ignoradas durante o processo de serialização. A questão solicita exatamente o que foi
pedido: qual modificador usado para impedir que o conteúdo de determinado atributo seja
convertido em bytes no processo padrão de serialização? É o transiente, portanto nosso
gabarito é a letra D. Mas vamos ver de que trata as outras alternativas? BORA! A) Final: é
usada para impossibilitar que uma classe seja estendida, que um método seja sobrescrito ou
que uma variável seja reinicializada. Ou seja, no caso da questão, mantém o atributo
constante. B) native é utilizado para dizer que sua implementação é feita em uma outra
linguagem específica (por exemplo, C), para que se possa acessar recursos específicos do
sistema operacional. Já volatile, indica que uma determinada variável de instância pode ser
modificada em duas threads distintas ao mesmo tempo. Por fim, a letra E) synchronized,
indica que método com essa marcação será controlado para que não se possa ter duas
threads acessando o mesmo objeto.

Gabarito: Letra D.

Métodos

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 87


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Vamos usar nosso exemplo do carro para introduzir alguns conceitos fundamentais da
programação orientada a objetos. Para realizar uma tarefa em um programa é necessário um
método.

O método armazena as declarações do programa que, na verdade, executam as tarefas; além


disso, ele oculta essas declarações do usuário, assim como o pedal do acelerador de um carro
oculta do motorista os mecanismos para fazer o veículo ir mais rápido.

No Java, criamos uma unidade de programa chamada classe para armazenar o conjunto de
métodos que executam as tarefas dela. Por exemplo, uma classe que representa uma conta
bancária poderia conter um método para fazer depósitos de dinheiro, outro para fazer saques e
um terceiro para perguntar qual é o saldo atual.

Uma classe é similar em termos do conceito aos desenhos de engenharia de um carro, que
armazenam o projeto de um pedal de acelerador, volante etc.

Construtores

Um construtor em Java é um método especial usado para inicializar objetos. O construtor é


chamado quando um objeto de uma classe é criado. Ele pode ser usado para definir valores iniciais
para atributos de objeto:

Para criar um construtor:

// Create a Main class

public class Main {

int x; // Create a class attribute

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 88


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

// Create a class constructor for the Main class

public Main() {

x = 5; // Set the initial value for the class attribute x

public static void main(String[] args) {

Main myObj = new Main(); // Create an object of class Main (This will call the constructor)

[Link](myObj.x); // Print the value of x

// Outputs 5

Observe que o nome do construtor deve corresponder ao nome da classe e não pode ter um tipo
de retorno (como void). Observe também que o construtor é chamado quando o objeto é criado.
Todas as classes têm construtores por padrão: se você não criar um construtor de classe, o Java
cria um para você. No entanto, você não poderá definir valores iniciais para atributos de objeto.

Os construtores também podem receber parâmetros, que são usados para inicializar atributos. O
exemplo a seguir adiciona um int yparâmetro ao construtor. Dentro do construtor definimos x para
y (x=y). Quando chamamos o construtor, passamos um parâmetro para o construtor (5), que
definirá o valor de x para 5:

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 89


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

em Java apenas as Interfaces não possuem construtores.

Toda classe tem pelo menos um construtor sempre definido. Se nenhum construtor for
explicitamente definido pelo programador da classe, um construtor default, que não recebe
argumentos, é criado pelo compilador Java. No entanto, se o programador da classe criar pelo
menos um método construtor, o construtor default não será criado automaticamente -- se ele o
desejar, deverá criar um construtor sem argumentos explicitamente.

No momento em que um construtor é invocado, a seguinte sequência de ações é executada para


a criação de um objeto:

● O espaço para o objeto é alocado e seu conteúdo é inicializado (bitwise) com zeros.
● O construtor da classe base é invocado.
● Os membros da classe são inicializados para o objeto, seguindo a ordem em que foram
declarados na classe.
● O restante do corpo do construtor é executado.

Seguir essa sequência é uma necessidade de forma a garantir que, quando o corpo de um
construtor esteja sendo executado, o objeto já terá à disposição as funcionalidades mínimas
necessárias, quais sejam aquelas definidas por seus ancestrais. O primeiro passo garante que
nenhum campo do objeto terá um valor arbitrário, que possa tornar erros de não inicialização
difíceis de detectar.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 90


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

(FGV – DPE-RJ – 2019) Considere as seguintes afirmativas sobre class constructor na


linguagem Java.

I. Deve receber o mesmo nome da classe a ele associada.

II. Não deve ser especificado um tipo de retorno na sua declaração.

III. É útil para a definição de valores iniciais para os atributos da classe.

IV. É sempre declarado como public.

É correto somente o que se afirma em:

a) I e II;

b) II e III;

c) III e IV;

d) I, II e III;

e) I, III e IV.

_______________________

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 91


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Comentários: Vamos lá, um construtor é um método especial usado para inicializar objetos.
O construtor é chamado quando um objeto de uma classe é criado. Ele pode ser usado para
definir valores iniciais para atributos de objeto. o construtor é apenas invocado no momento
da criação do objeto através do operador new. A assinatura de um construtor diferencia-se
das assinaturas dos outros métodos por não ter nenhum tipo de retorno (nem mesmo void).
Além disto, o nome do construtor deve ser o próprio nome da classe. O construtor pode
receber argumentos, como qualquer método. Usando o mecanismo de sobrecarga, mais de
um construtor pode ser definido para uma classe. Assim, temos que os itens I, II e III estão
corretos. Já, a assertiva IV está errada, pois pode ser public, protected ou private. (Gabarito:
Letra D).

(FGV / MPE-AL – 2018) Sobre as variáveis e os métodos declarados como private, em Java,
analise as afirmativas a seguir.

I. Ficam acessíveis somente aos membros da própria classe.

II. Ficam acessíveis somente às classes definidas no mesmo package.

III. Ficam acessíveis somente para suas classes derivadas.

Está correto o que se afirma em

a) I, apenas.

b) II, apenas.

c) III, apenas.

d) I e II, apenas.

e) II e III, apenas.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 92


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

_______________________

Comentários: Pessoal, vamos relembrar a tabela? As variáveis e os métodos private ficam


acessíveis apenas aos membros da própria classe! Não ficam disponíveis no pacote e também
não ficam acessíveis ás subclasses! Portanto nosso gabarito é apenas o item I.

Gabarito: Letra A.

Herança e Encapsulamento
Encapsulamento e ocultamento de informações

Classes (e seus objetos) encapsulam, isto é, contêm seus atributos e métodos. Os atributos e
métodos de uma classe (e de seu objeto) estão intimamente relacionados. Os objetos podem se
comunicar entre si, mas eles em geral não sabem como outros objetos são implementados — os
detalhes de implementação permanecem ocultos dentro dos próprios objetos. Esse ocultamento
de informações, como veremos, é crucial à boa engenharia de software.

Encapsulamento e ocultamento de informações

Classes (e seus Os objetos não os detalhes de


objetos) sabem como outros implementação
encapsulam, isto é, objetos são permanecem
contêm seus implementados ocultos dentro dos
atributos e métodos próprios objetos

Herança

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 93


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Uma nova classe de objetos pode ser criada convenientemente por meio de herança — ela
(chamada subclasse) começa com as características de uma classe existente (chamada superclasse),
possivelmente personalizando-as e adicionando aspectos próprios.

Na nossa analogia do carro, um objeto da classe “conversível” decerto é um objeto da classe mais
geral “automóvel”, mas, especificamente, o teto pode ser levantado ou baixado.

Em java a herança é realizada de maneira simples ao utilizar a palavra-chave extends:

package academico;

public abstract class Pessoa {

public String strNome;

public String strTelefone;

// Métodos

public void getStrNome(String Nome) {

[Link] = Nome;

public String setStrNome() {

return StrNome;

public class Aluno extends Pessoa {

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 94


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

// strNome e strTelefone, bem como seus metodos são herdados nesta calasse por meio da
palavra "extends"

Quando uma classe é criada como sub-classe de outra classe, a palavra-chave super é usada para
que a sub-classe possa acessar métodos public ou protected (mas não private) da superclasse.
super também é usado para invocar o constructor da superclasse, durante o constructor da
subclasse.

public class SuperClass

SuperClass(String title)

[Link]( "Super: " + title );

public void printHello()

[Link]( "Hello from SuperClass" );

return;

public class SubClass extends SuperClass

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 95


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

SubClass(String title)// constructor

super(title); // chama o constructor de Frame

public void printHello()

[Link]();

[Link]( "Hello from SubClass" );

return;

public static main( String[] args )

SubClass obj = new SubClass();

[Link]();

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 96


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

(FGV / SEFAZ-AM – 2022) Na programação orientada a objetos, a herança é uma técnica de


abstração que permite categorizar as classes de objetos sob certos critérios, especificando-
se as características dessas classes. As classes que são vinculadas por meio de
relacionamentos de herança formam uma hierarquia de herança. Na linguagem de
programação Java, o relacionamento de herança é definido pela palavra-chave

a) static.

b) extends.

c) public.

d) new.

e) this.

Comentários: Pessoal, a palavra-chave da herança é extends! A palavra-chave extends faz


com que uma subclasse herde (receba) todos os atributos e métodos declarados na classe-
pai.

Gabarito: Letra B.

Especificador CLASSE SUBCLASSE PACOTE GLOBAL


PRIVADO Sim Não Não Não
PROTEGIDO Sim Sim Não Não
PÚBLICO Sim Sim Sim Sim
PACOTE Sim Não Sim Não

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 97


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

(FGV – TJDFT – 2022) Observe as classes abaixo descritas na linguagem de programação


Java.

public class DocumentoProcesso extends Object

private String docNumero;

private int classificacao;

public DocumentoProcesso (String docNumero, int

classificacao){

if (classificacao < 1)

throw new IllegalArgumentException (

"A classificação do documento deve ser no mínimo 1.");

[Link] = docNumero;

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 98


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

[Link] = classificacao;

public String getDocNumero()

{ return docNumero; }

public int getClassificacao()

{ return classificacao; }

public void setDocNumero(String docNumero)

{ [Link] = docNumero; }

public void setClassificacao(int classificacao)

{ [Link] = classificacao; }

public int promove()

{ return classificacao + 1; }

public class Oficio extends DocumentoProcesso

private int precedencia;

public Oficio (String docNumero, int classificacao, int precedencia)

{super(docNumero,classificacao);

[Link] = precedencia; }

public int getPrecedencia()

{ return precedencia; }

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 99


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

public void setPrecedencia(int precedencia)

{ [Link] = precedencia; }

@Override

public int promove()

{ return precedencia + 1; }

Com base nos conceitos de orientação a objetos, é correto afirmar que:

a) os atributos private de DocumentoProcesso são acessíveis por Oficio;

b) a anotação @Override indica que o método promove() é abstrato e polimórfico;

c) a classe Oficio representa uma herança múltipla das classes DocumentoProcesso e Object;

d) a classe Oficio é composta pela classe DocumentoProcesso, permitindo que uma instância
da classe Oficio faça referências a instâncias da classe DocumentoProcesso;

e) os métodos getDocNumero() e setDocNumero() da classe DocumentoProcesso


encapsulam o atributo docNumero e asseguram que os objetos da classe mantenham
estados consistentes.

Comentários: temos o nosso gabarito na letra E. Pessoal, os métodos getDocNumero() e


setDocNumero() de fato, são utilizados para encapsular o atributo docNumero. Ademais,
asseguram que os objetos da classe mantenham estados consistentes. Getters e setters são
usados para proteger seus dados, especialmente na criação de classes. Para cada instância
de variável, um método getter retorna seu valor, enquanto um método setter o define ou
atualiza seu valor. Nas questões comentada comento todas as demais assertivas!

Gabarito: Letra E.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 100


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Interfaces

O Java também suporta interfaces — coleções de métodos relacionados que normalmente


permitem informar aos objetos o que fazer, mas não como fazer. Na analogia do carro, uma
interface das capacidades “básicas de dirigir” consistindo em um volante, um pedal de acelerador
e um pedal de freio permitiria que um motorista informasse ao carro o que fazer. Depois que você
sabe como usar essa interface para virar, acelerar e frear, você pode dirigir muitos tipos de carro,
embora os fabricantes possam implementar esses sistemas de forma diferente.

Uma classe implementa zero ou mais interfaces — cada uma das quais pode ter um ou mais
métodos —, assim como um carro implementa interfaces separadas para as funções básicas de
dirigir, controlar o rádio, controlar os sistemas de aquecimento, ar-condicionado e afins. Da mesma
forma que os fabricantes de automóveis implementam os recursos de forma distinta, classes
podem implementar métodos de uma interface de maneira diferente. Por exemplo, um sistema
de software pode incluir uma interface de “backup” que ofereça os métodos save e restore. As
classes podem implementar esses métodos de modo diferente, dependendo dos tipos de formato
em que é feito o backup, como programas, textos, áudios, vídeos etc., além dos tipos de
dispositivo em que esses itens serão armazenados.

INTERFACES

Todos os métodos da interface todos os campos são


são implicitamente métodos implicitamente
public abstract
public, static e final.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 101


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

(FCC / SABESP – 2018) As interfaces são usadas nas aplicações Java quando se deseja
permitir que diversas classes implementem determinados métodos, mesmo que de formas
diferentes. Em uma interface Java

a) os métodos não podem ter os modificadores protected ou private.

b) não pode haver assinaturas de métodos cujo tipo de retorno seja void.

c) pode haver múltiplos construtores, desde que recebam parâmetros diferentes.

d) não pode haver dois ou mais métodos com o mesmo nome, mesmo que recebam
parâmetros diferentes.

e) todo método deverá ser implementado por uma das subclasses da aplicação pelo menos
uma vez.

Comentários: A alternativa ‘a’ diz que os métodos não podem ter os modificadores protected
ou private, o que está correto! Vimos em aula que em geral, as interfaces são compostas
basicamente de um conjunto de assinaturas de métodos públicos e abstratos. Ou seja, os
métodos das interfaces são públicos! B: Não há nenhuma restrição relacionado a assinatura
de métodos com tipo de retorno void! Errada letra B! A restrição da letra C também está
incorreta! Não há nenhuma restrição relacionada a quantidade de métodos, sequer métodos
com o mesmo nome! Se houver, estaremos diante de um caso de sobrecarrega, ou
polimorfismo estático. Por fim, a letra E também está errada! Pode sim haver método sem a
implementação na subclasse.Não existe obrigação de implementação de uma interface.

Gabarito: Letra A.

Polimorfismo

O polimorfismo permite escrever programas que processam objetos que compartilham a mesma
superclasse, direta ou indiretamente, como se todos fossem objetos da superclasse; isso pode
simplificar a programação.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 102


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Considere o exemplo de polimorfismo a seguir. Suponha que criamos um programa que simula o
movimento de vários tipos de animais para um estudo biológico. As classes Peixe, Anfíbio e
Pássaro representam os três tipos de animais sob investigação.

Imagine que cada classe estende a superclasse Animal, que contém um método mover e mantém
a localização atual de um animal como coordenadas x-y. Cada subclasse implementa o método
mover. Nosso programa mantém um array Animal que contém referências a objetos das várias
subclasses Animal. Para simular os movimentos dos animais, o programa envia a mesma
mensagem a cada objeto uma vez por segundo — a saber, mover.

Cada tipo específico de Animal responde a uma mensagem mover de uma maneira única — um
Peixe poderia nadar um metro, um Anfíbio poderia pular um metro e meio e um Pássaro poderia
voar três metros. Cada objeto sabe como modificar suas coordenadas x-y de forma adequada para
seu tipo específico de movimento. Contar com o fato de que cada objeto sabe “fazer a coisa
certa” (isto é, faz o que é apropriado a esse tipo de objeto) em resposta à mesma chamada de
método é o conceito-chave do polimorfismo.

A mesma mensagem (nesse caso, mover) enviada a uma variedade de objetos tem muitas formas
de resultados — daí o termo polimorfismo.

Com o polimorfismo, podemos projetar e implementar sistemas que são facilmente extensíveis —
novas classes podem ser adicionadas com pouca ou nenhuma modificação a partes gerais do
programa, contanto que as novas classes façam parte da hierarquia de herança que o programa
processa genericamente.

As novas classes simplesmente se “encaixam”. As únicas partes de um programa que devem ser
alteradas são aquelas que exigem conhecimento direto das novas classes que adicionamos à
hierarquia. Por exemplo, se estendermos a classe Animal para criar a classe Tartaruga (que poderia
responder a uma mensagem mover deslizando uma polegada), precisaremos escrever somente a
classe Tartaruga e a parte da simulação que instancia um objeto Tartaruga. As partes da simulação
que dizem para que cada Animal se mova genericamente podem permanecer as mesmas.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 103


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Vejamos um exemplo clássico de polimorfismo para fixação do conhecimento. Se a classe


Retângulo é derivada da classe Quadrilátero, então um objeto Retângulo é uma versão mais
específica de um objeto Quadrilátero. Qualquer operação (por exemplo, calcular o perímetro ou
a área) que pode ser realizada em um objeto Quadrilátero também pode ser realizada em um
objeto Retângulo. Essas operações podem ser realizadas em outros Quadriláteros, como
Quadrados, Paralelogramos e Trapezoides. O polimorfismo ocorre quando um programa invoca
um método por meio de uma variável de superclasse Quadrilátero — em tempo de execução, a
versão correta da subclasse do método é chamada com base no tipo de referência armazenado
na variável da superclasse.

polimorfismo

A mesma mensagem enviada a uma variedade de objetos tem muitas


formas de resultados.

(CESPE / SERPRO – 2021) O polimorfismo ocorre quando a mesma operação é construída


em uma mesma classe ou quando o método da subclasse sobrepõe-se ao método da
superclasse.

Comentários: Pessoal, o polimorfismo ocorre quando um programa invoca um método por


meio de uma variável de superclasse em tempo de execução, a versão correta da subclasse
do método é chamada com base no tipo de referência armazenado na variável da

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 104


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

superclasse. Portanto, trata-se da capacidade de um objeto poder se comportar de diversas


formas dependendo da mensagem recebida.

Gabarito: Correto.

Dois conceitos muito importantes em Java são: sobrecarga e sobrescrita. Com a sobrecarga
(overload) de métodos, vários métodos podem ter o mesmo nome com parâmetros diferentes.
Em vez de definir dois métodos que devem fazer a mesma coisa, é melhor sobrecarregar um.
Sobrecarga ou Polimorfismo Estático ocorre quando uma classe possui métodos com mesmo
nome, entretanto assinaturas diferentes. Ocorre em Tempo de Compilação.

A sobrescrita (ou override) está diretamente relacionada à orientação a objetos, mais


especificamente com a herança. Com a sobrescrita, conseguimos especializar os métodos
herdados das superclasses, alterando o seu comportamento nas subclasses por um mais
específico. A sobrescrita de métodos consiste basicamente em e mesmo tipo de retorno do
método sobrescrito.

Os métodos com o mesmo nome podem ser declarados na mesma classe, contanto que tenham
diferentes conjuntos de parâmetros (determinados pelo número, tipos e ordem dos parâmetros)
— isso é chamado de sobrecarga de métodos. Quando um método sobrecarregado é chamado,
o compilador Java seleciona o método adequado examinando o número, os tipos e a ordem dos
argumentos na chamada. A sobrecarga de métodos é comumente utilizada para criar vários
métodos com o mesmo nome que realizam as mesmas tarefas, ou tarefas semelhantes, mas sobre
tipos diferentes ou números diferentes de argumentos.

O compilador distingue os métodos sobrecarregados pelas suas assinaturas — uma combinação


do nome e o número do método, tipos e ordens de seus parâmetros, mas não de seu tipo de
retorno. Se o compilador examinasse somente os nomes do método durante a compilação, o
código do programas seria ambíguo. Internamente, o compilador utiliza nomes de método mais
longos, que incluem o nome original do método, os tipos de cada parâmetro e a ordem exata dos
parâmetros para determinar se os métodos em uma classe são únicos nela.

Em resumo, o Java permite métodos sobrecarregados em uma classe, desde que os métodos
tenham diferentes conjuntos de parâmetros (determinados pelo número, ordem e tipo de

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 105


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

parâmetros). Métodos sobrecarregados são distinguidos por suas assinaturas — combinações dos
nomes e número, tipos e ordem dos parâmetros dos métodos, mas não pelos tipos de retorno.

Tratamento de Exceções

Ao executar o código Java, diferentes erros podem ocorrer: erros de codificação feitos pelo
programador, erros devido a entrada errada ou outros imprevistos. Quando ocorre um erro, o
Java normalmente para e gera uma mensagem de erro. O termo técnico para isso é: Java lançará
uma exceção (jogará um erro).

Uma exceção é uma indicação de um problema que ocorre durante a execução de um programa.
O tratamento de exceção permite criar aplicativos que podem resolver (ou tratar) exceções. Em
muitos casos, o tratamento de uma exceção permite que um programa continue executando como
se nenhum problema tivesse sido encontrado.

Somente as classes que estendem Throwable (pacote [Link]) direta ou indiretamente podem
ser utilizadas com o tratamento de exceção. Exceções encadeadas podem ser usadas ao chamar
um método que indica uma exceção, você pode lançar outra exceção e encadear o original com
o novo. Isso permite adicionar informações específicas do aplicativo à exceção original.

Ademais, há pré-condições e pós-condições, que devem ser verdadeiras quando seus métodos
são chamados e quando eles retornam, respectivamente.

A instrução try permite que você defina um bloco de código para ser testado quanto a erros
enquanto está sendo executado. A instrução catch permite definir um bloco de código a ser
executado, caso ocorra um erro no bloco try. As palavras-chave try e catch vêm em pares:

try {

// bloco de código para ser testado

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 106


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

catch(Exception e) {

// bloco de código a ser executado, caso ocorra um erro no bloco try

Sincronismo e Multithreading

Seria interessante se pudéssemos concentrar nossa atenção na realização de uma única tarefa de
cada vez e fazer isso bem, o que geralmente é difícil de alcançar em um mundo complexo em que
muitas coisas acontecem ao mesmo tempo. Principalmente atualmente, com a tecnologia
avançando rapidamente, são inúmeros processos executando de forma concorrente.

Quando dizemos que duas tarefas operam concorrentemente, queremos dizer que ambas
progridem ao mesmo tempo. Até recentemente, a maioria dos computadores tinha apenas um
único processador. Sistemas operacionais nesses computadores executam tarefas de forma
concorrente alternando rapidamente entre elas, fazendo uma pequena parte de cada uma antes
de passar para a próxima, de modo que todas as tarefas continuem progredindo. Por exemplo, é
comum que computadores pessoais compilem um programa, enviem um arquivo para uma
impressora, recebam mensagens de correio eletrônico por uma rede e muito mais,
concorrentemente. Desde sua criação, o Java suporta a concorrência.

Quando dizemos que duas tarefas operam em paralelo, queremos dizer que elas são executadas
simultaneamente. Nesse sentido, o paralelismo é um subconjunto da concorrência. O corpo
humano realiza uma grande variedade de operações paralelas.

O Java disponibiliza a concorrência por meio da linguagem e APIs. Programas Java podem ter
várias threads de execução, em que cada thread tem sua própria pilha de chamadas de método e
seu próprio contador de programa, permitindo que seja executada concorrentemente com outras
threads enquanto compartilha os recursos de nível de aplicativo como memória e handles de
arquivo. Essa capacidade é chamada multithreading

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 107


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

A qualquer momento, diz-se que uma thread está em um de vários estados de thread

Estado descrição
Uma nova thread inicia seu ciclo de vida no estado novo. Ela permanece
nesse estado até que o programa inicie a thread, o que a coloca no estado
executável. Considera-se que uma thread no estado executável está
executável
executando sua tarefa.

Às vezes a thread executável transita para o estado de espera enquanto


aguarda outra thread realizar uma tarefa. Uma thread em espera volta ao
estado executável somente quando outra thread a notifica para continuar a
espera
execução.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 108


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Uma thread executável pode entrar no estado de espera sincronizada por


um intervalo especificado de tempo. Ela faz a transição de volta ao estado
executável quando esse intervalo de tempo expira ou o evento que ela
espera ocorre. Threads de espera sincronizada não podem utilizar um
processador, mesmo se houver um disponível. Uma thread executável pode
transitar para o estado de espera sincronizada se fornecer um intervalo de
espera opcional quando ela estiver esperando outra thread realizar uma
tarefa. Essa thread retornará ao estado executável quando ela for notificada
por outra thread ou quando o intervalo sincronizado expirar — o que ocorrer
primeiro. Outra maneira de posicionar uma thread no estado em espera
sincronizada é colocar uma thread executável para dormir — uma thread
adormecida permanece no estado de espera sincronizada por um
determinado período de tempo (chamado intervalo de adormecimento),
depois do qual ela retorna ao estado executável. As threads dormem
espera sincronizada quando, por um breve período, não têm de realizar nenhuma tarefa. Por
exemplo, um processador de texto pode conter uma thread que grave
periodicamente backups (isto é, grava uma cópia) do documento atual no
disco para fins de recuperação. Se a thread não dormisse entre os sucessivos
backups, seria necessário um loop em que testaria continuamente se deve
ou não gravar uma cópia do documento em disco. Esse loop consumiria
tempo de processador sem realizar trabalho produtivo, reduzindo assim o
desempenho do sistema. Nesse caso, é mais eficiente para a thread
especificar um intervalo de adormecimento (igual ao período entre backups
sucessivos) e entrar no estado de espera sincronizada. Essa thread é
retornada ao estado executável quando seu intervalo de adormecimento
expira, ponto em que ela grava uma cópia do documento no disco e entra
novamente no estado de espera sincronizada.

Uma thread executável passa para o estado bloqueado quando tenta realizar
uma tarefa que não pode ser concluída imediatamente e deve esperar
temporariamente até que a tarefa seja concluída. Por exemplo, quando uma
thread emite uma solicitação de entrada/saída, o sistema operacional só
permite que ela seja executada depois que a solicitação de E/S estiver
bloqueado
concluída — nesse ponto, a thread bloqueada faz uma transição para o
estado executável, assim pode continuar a execução. Uma thread bloqueada
não pode utilizar um processador, mesmo se algum estiver disponível.

Uma thread executável entra no estado terminado (às vezes chamado


terminado estado morto) quando ela conclui com sucesso suas tarefas ou é de outro
modo terminada (talvez em razão de um erro).

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 109


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

No nível do sistema operacional, o estado executável do Java geralmente inclui dois estados
separados. O sistema operacional oculta esses estados da Java Virtual Machine (JVM), que vê
apenas o estado executável. Quando uma thread entra pela primeira vez no estado executável a
partir do estado novo, ela está no estado pronto. Uma thread pronta entra no estado de execução
(isto é, começa a executar) quando o sistema operacional a atribui a um processador — também
conhecido como despachar a thread. Na maioria dos sistemas operacionais, cada thread recebe
uma pequena quantidade de tempo de processador — chamada de quantum ou fração de tempo
— com a qual realiza sua tarefa. Decidir qual deve ser o tamanho máximo do quantum é um tema-
chave nos cursos sobre sistemas operacionais. Quando o quantum expira, a thread retorna ao
estado pronto, e o sistema operacional atribui outra thread ao processador. As transições entre
os estados pronto e em execução são tratadas exclusivamente pelo sistema operacional. A JVM
não “vê” as transições — ela simplesmente vê a thread como executável e deixa para o sistema
operacional fazer a transição entre a thread pronta e em execução. O processo que um sistema
operacional usa para determinar qual thread despachar é chamado agendamento de thread e
depende das prioridades de thread.

Coleções

A Java API fornece várias estruturas de dados predefinidas, chamadas coleções, usadas para
armazenar grupos de objetos relacionados na memória. Essas classes fornecem métodos

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 110


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

eficientes que organizam, armazenam e recuperam seus dados sem a necessidade de conhecer
como os dados são armazenados.

Isso reduz o tempo de desenvolvimento de aplicativos. Você já usou arrays para armazenar
sequências de objetos. Arrays não mudam automaticamente o tamanho em tempo de execução
para acomodar elementos adicionais. A classe de coleção ArrayList<T> (pacote [Link]) fornece
uma solução conveniente para esse problema — ela pode alterar dinamicamente seu tamanho
para acomodar mais elementos. O T (por convenção) é um espaço reservado — ao declarar um
novo ArrayList, substitua-o pelo tipo dos elementos que você deseja que o ArrayList armazene.
Por exemplo,

ArrayList<String> list;

declara list como uma coleção ArrayList que só pode armazenar Strings. Classes com esse tipo de
espaço reservado que podem ser usadas com qualquer tipo são chamadas classes genéricas.
Somente tipos não primitivos podem ser usados para declarar variáveis e criar objetos das classes
genéricas. Mas o Java fornece um mecanismo conhecido como boxing, que permite que valores
primitivos sejam empacotados como objetos para uso com classes genéricas. Assim, por exemplo,

ArrayList<Integer> integers;

declara integers como um ArrayList que só pode armazenar Integers. Ao inserir um valor int em
um ArrayList<Integer>, o valor int é empacotado como um objeto Integer, e quando você obtém
um objeto Integer de um ArrayList<Integer>, e então atribui o objeto a uma variável int, o valor
int dentro do objeto é desempacotado.

A classe array é um ArrayList redimensionável, que pode ser encontrado no [Link]. A


diferença entre um array embutido e um ArrayList em Java, é que o tamanho de um array não
pode ser modificado (se você quiser adicionar ou remover elementos de/para um array, você tem
que criar um novo). Enquanto os elementos podem ser adicionados e removidos de um ArrayList
sempre que você quiser. Vejamos alguns métodos e propriedades da classe ArrayList<T>.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 111


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

MÉTODO DESCRIÇÃO
add Adiciona um elemento ao final do ArrayList.
clear Remove todos os elementos do ArrayList.
contains Retorna true se o ArrayList contém o elemento especificado; caso contrário,
retorna false.
get Retorna o elemento no índice especificado.
indexOf Retorna o índice da primeira ocorrência do elemento especificado no
ArrayList.
remove Sobrecarregado. Remove a primeira ocorrência do valor especificado ou o
elemento no índice especificado.
Size Retorna o número de elementos armazenados em ArrayList.
trimToSize Corta a capacidade do ArrayList para o número atual de elementos.

A classe LinkedList é quase idêntica à ArrayList. A classe LinkedList é uma coleção que pode conter
muitos objetos do mesmo tipo, assim como o ArrayList. A classe LinkedList tem todos os mesmos
métodos que a classe ArrayList porque ambos implementam a interface List. Isso significa que
você pode adicionar itens, alterar itens, remover itens e limpar a lista da mesma maneira.

No entanto, embora a classe ArrayList e a classe LinkedList possam ser usadas da mesma maneira,
elas são construídas de maneira muito diferente.

A classe ArrayList tem um array regular dentro dela. Quando um elemento é adicionado, ele é
colocado no array. Se a matriz não for grande o suficiente, uma nova matriz maior é criada para
substituir a antiga e a antiga é removida.

A LinkedList armazena seus itens em "contêineres". A lista tem um link para o primeiro contêiner
e cada contêiner tem um link para o próximo contêiner na lista. Para adicionar um elemento à lista,
o elemento é colocado em um novo contêiner e esse contêiner é vinculado a um dos outros
contêineres da lista.

MÉTODOs LinkedList DESCRIÇÃO


addFirst Adiciona um item ao início da lista.
addLast Adiciona um item ao final da lista.
removeFirst Remove um item do início da lista.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 112


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

removeLast Remove um item do final da lista.


getFirst Obtém o item no início da lista.
getLast Obtém o item no final da lista.

(FGV/ IBGE – 2017) Um programador Java precisa utilizar um array unidimensional dinâmico
armazenando números inteiros e decide importar a classe [Link].

A declaração da referência ao array que ele deverá utilizar é:

a) ArrayList<int> arr;

b) ArrayList<int>[] arr;

c) ArrayList<int> arr[];

d) ArrayList<Integer> arr[];

e) ArrayList<Integer> arr.

_______________________

Comentários: Pessoal, quando criamos o ArrayList carro – no exemplo – utilizamos a seguinte


sintaxe: ArrayList<String> carro. Da mesma forma, para criar um ArrayList do tipo inteiro,
teríamos que usar: ArrayList<Integer> arr. Portanto, nosso gabarito é a Letra E

Gabarito: Letra E.

Um Set é uma Collection não ordenada de elementos únicos (isto, sem duplicatas). A estrutura de
coleções contém diversas implementações de Set, incluindo HashSet e TreeSet. HashSet armazena
seus elementos em uma tabela de hash; e TreeSet armazena seus elementos em uma árvore.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 113


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

A estrutura de coleções também inclui a interface SortedSet (que estende Set) para conjuntos que
mantêm seus elementos em ordem classificada — a ordem natural dos elementos (por exemplo,
números estão em ordem crescente) ou uma ordem especificada por um Comparator. A classe
TreeSet implementa SortedSet

Vamos conhecer os mapas! Mapa ou Map associam chaves a valores. As chaves em um Map devem
ser únicas, mas os valores associados não precisam ser. Se um Map contém chaves únicas e valores
únicos, diz-se que implementa um mapeamento de um para um. Se somente as chaves são únicas,
diz-se que o Map implementa um mapeamento de muitos para um — muitas chaves podem
mapear para um valor.

Maps diferem de Sets pelo fato de que Maps contêm chaves e valores, enquanto Sets contêm
somente valores. Três das várias classes que implementam a interface Map são Hashtable,
HashMap e TreeMap. Hashtables e HashMaps armazenam elementos em tabelas de hash e
TreeMaps armazenam elementos em árvores. Esta seção discute as tabelas de hash e fornece um
exemplo que utiliza um HashMap para armazenar pares chave–valor. A interface SortedMap
estende Map e mantém suas chaves em ordem classificada — na ordem natural dos elementos ou
em uma ordem especificada por uma implementação Comparator. A classe TreeMap implementa
SortedMap.

MÉTODOs DESCRIÇÃO
clear() Remove todos os pares chave/valor do mapa;
containsKey(k) Retorna true se o mapa invocador contiver o objeto k como chave;
containsValue(v) Retorna true se o mapa contiver o objeto v como chave;
entrySet() Retorna um conjunto que contenha as entradas no mapa;
equals() Retorna true se mapas contiverem as mesmas entradas;
get() Retorna o valor associado com a chave k;
remove(k) Remove a entrada que tiver chave igual a k;

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 114


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Um Set é uma Collection não ordenada que não contém elementos duplicados.

HashSet armazena seus elementos em uma tabela de hash.


Conjuntos

TreeSet armazena seus elementos em uma árvore.

A interface SortedSet estende Set e representa um conjunto que mantém seus


elementos na ordem de classificação.

A classe TreeSet implementa SortedSet.

Maps armazenam pares de chave–valor e não podem conter chaves duplicadas.


Mapas

HashMaps e Hashtables armazenam elementos em uma tabela de hash

TreeMaps armazenam elementos em uma árvore.

HashMap recebe dois argumentos — o tipo da chave e o tipo do valor.

put adiciona um par chave–valor a um HashMap.


métodos Mapas

get localiza o valor associado com a chave especificada.

isEmpty determina se o mapa está vazio.

keySet retorna um conjunto de chaves.

size retorna o número de pares chave–valor no Map.

Streams e Serialização

O JAVA 8 foi usado para incluir o método stream() na API de Collections e possibilitar que todas
as coleções sejam fontes de dados para streams. Além deste, outros métodos padrão também
foram incorporados à API de coleções, como o removeIf() na interface Collection, e em

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 115


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Comparator, o método reversed(), que retorna um novo comparador que realiza a ordenação ao
contrário.

O Java 8 apresenta diversas funcionalidades adicionadas à linguagem , uma das principais funções
é a Streams API, recurso que oferece ao desenvolvedor a possibilidade de trabalhar com conjuntos
de elementos de forma mais simples e com um número menor de linhas de código. Isso se tornou
possível graças à incorporação do paradigma funcional, combinado com as expressões lambda, o
que facilita a manutenção do código e aumenta a eficiência no processamento devido ao uso de
paralelismo.

A proposta em torno da Streams API é reduzir a preocupação do desenvolvedor com a forma de


implementar controle de fluxo ao lidar com coleções, deixando isso a cargo da API. A ideia é iterar
sobre essas coleções de objetos e, a cada elemento, realizar alguma ação, seja ela de filtragem,
mapeamento, transformação, etc. Caberá ao desenvolvedor apenas definir qual ação será
realizada sobre o objeto.

Stream map(Function mapper) retorna um stream que consiste nos resultados da aplicação da
função dada aos elementos desse stream. Stream map (Mapeador de funções) é uma operação
intermediária. As operações intermediárias são invocadas em uma instância do Stream e, depois
que terminam seu processamento, fornecem uma instância do Stream como saída.

A Streams API traz uma nova opção para a manipulação de coleções em Java seguindo os
princípios da programação funcional. Combinada com as expressões lambda, ela proporciona uma
forma diferente de lidar com conjuntos de elementos, oferecendo ao desenvolvedor uma maneira
simples e concisa de escrever código que resulta em facilidade de manutenção e paralelização
sem efeitos indesejados em tempo de execução.

A proposta em torno da Streams API é fazer com que o desenvolvedor não se preocupe mais com
a forma de se programar o comportamento, deixando a parte relacionada ao controle de fluxo e
loop a cargo da API. É algo muito parecido com o que é feito com Threads, onde os aspectos mais
complexos ficam encapsulados em APIs e as regras de negócio passam a ser a única
responsabilidade do desenvolvedor.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 116


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Portanto, sabemos que o Java 8 introduz o conceito de streams, que são semelhantes aos
iteradores. Fluxos são objetos das classes que implementam a interface Stream (do pacote
[Link]) ou uma das interfaces de fluxo especializadas para processar coleções de valores
int, long ou double, Juntamente com lambdas, fluxos permitem realizar tarefas sobre coleções de
elementos, muitas vezes a partir de um objeto array ou coleção.

Fluxos movem elementos por meio de uma sequência de passos de processamento conhecidos
como pipeline de fluxo — que começa com uma origem de dados (como um array ou coleção),
realiza várias operações intermediárias sobre os elementos da origem de dados e termina com
uma operação terminal. Um pipeline de fluxo é formado encadeando chamadas de método. Ao
contrário de coleções, fluxos não têm um armazenamento próprio — depois que o fluxo é
processado, ele não pode ser reutilizado, porque não mantém uma cópia da origem de dados
original.

Uma operação intermediária especifica as tarefas a realizar sobre os elementos do fluxo e sempre
resulta em um novo fluxo. Operações intermediárias são “preguiçosas” — elas só são executadas
depois que uma operação terminal é invocada. Isso permite que desenvolvedores de biblioteca
otimizem o desempenho do processamento de fluxo. Por exemplo, se você tem uma coleção de
1.000.000 objetos Person e está procurando o primeiro com o sobrenome "Jones", o
processamento de fluxo pode terminar assim que o primeiro desses objetos Person for
encontrado.

A operação terminal inicia o processamento das operações intermédias de um pipeline de fluxo e


produz um resultado. Operações terminais são “gulosas” — elas realizam a operação solicitada
quando são chamadas.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 117


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Classe Descrição
Resulta em um fluxo contendo apenas os elementos que atendem uma
filter
condição.
distinct Resulta em um fluxo que contém somente os elementos únicos.
Resulta em um fluxo com o número especificado de elementos a partir do
limit
início do fluxo original.
Resulta em um fluxo em que cada elemento do fluxo original é mapeado
para um novo valor (possivelmente de um tipo diferente) — por exemplo,
map
mapear valores numéricos para as raízes quadradas dos valores numéricos.
O novo fluxo tem o mesmo número de elementos que o fluxo original.
Resulta em um fluxo em que os elementos estão em ordem classificada. O
sorted
novo fluxo tem o mesmo número de elementos que o fluxo original.
forEach Realiza o processamento em cada elemento em um fluxo (por exemplo,
exibir cada elemento).

Método filter: filtra os elementos de um fluxo de acordo com alguma condição fornecida, ao final
ele nos retorna um fluxo apenas com os elementos que se enquadaram na condição. Dessa forma,
o método filter() cria um novo array com todos os elementos que passaram no teste implementado
pela função fornecida.

filter: Resulta em um fluxo contendo apenas os elementos que


Operações Stream intermediárias

atendem uma condição


distinct: retorna um fluxo contendo apenas elementos únicos, sem
dados duplicados.
limit: limita a quantidade de elementos em um fluxo.

sorted: ordena um fluxo.

map: Resulta em um fluxo em que cada elemento do fluxo original é


mapeado para um novo valor
forEach: Realiza o processamento em cada elemento em um fluxo

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 118


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Code Conventions

Code Conventions Java é uma regra a ser seguida ao decidir como nomear seus identificadores,
como classe, pacote, variável, constante, método etc. Mas, não é forçado a seguir. Então, é
conhecido como convenção e não regra. Essas convenções são sugeridas por várias comunidades
Java, como Sun Microsystems e Netscape.

Todas as classes, interfaces, pacotes, métodos e campos da linguagem de programação Java são
fornecidos de acordo com a convenção de nomenclatura Java. Se você não seguir essas
convenções, poderá gerar confusão ou código errôneo.

Vantagem de convenções de nomenclatura em Java: Ao usar convenções de nomenclatura Java


padrão, você torna seu código mais fácil de ler para você e outros programadores. A legibilidade
do programa Java é muito importante. Indica que menos tempo é gasto para descobrir o que o
código faz.

tipo Descrição
Os nomes de classes iniciam com uma letra maiúscula e apresentam a letra
Nomes e inicial de cada palavra que eles incluem em maiúscula (por exemplo,
identificadores de SampleClassName). Essa convenção de nomenclatura é conhecida como
classe notação camelo, porque as letras maiúsculas destacam-se como corcovas
desse animal.
Todo arquivo de código deve iniciar com comentários de início, que devem
Comentários iniciais conter informações a respeito da classe/interface, como por exemplo,
nome da classe, informações de versão, data e autor
A primeira linha de código após os comentários iniciais deve ser a
Declarações de pacotes
declaração do pacote (se necessário), e em sequência as declarações de
e importações
importações
A ordem em que elas devem aparecer é: Comentário de documentação,
Declaração da
Declaração da classe/interface, Comentários de implementação da classe,
classe/interface
Atributos estáticos, Demais atributos, Construtores, Demais métodos.
Os recuos são utilizados para alinhar visualmente comandos pertencentes
Indentação ou recuo de a blocos de código. Um bloco é o código envolvido pelos delimitadores { e
código }, como por exemplo o if. A regra geral é abrir o bloco na linha do comando
e fechar alinhado a ele.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 119


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Quando uma expressão não couber numa única linha, quebrá-la de acordo
com as seguintes regras básicas: Após uma vírgula, Antes de um operador,
Quebras de linha Alinhar a nova linha com o início da expressão da linha anterior, Se as
regras acima gerarem código confuso, ou se a linha de baixo ficar colada na
margem, use uma tabulação de 8 espaços.
Há quatro possíveis formatos de comentário de implementação: bloco,
linha, à direita e no fim da linha. Os comentários de bloco são utilizados
para descrever arquivos de código, métodos ou algum algoritmo dentro de
um método. Procure sempre inserir uma linha em branco antes do bloco de
comentários. Os comentários de linha são para comentários curtos, e
Comentários de devem ser precedidos com uma linha em branco, assim como o
implementação comentário de bloco. Comentários muito curtos podem aparecer na
mesma linha do código que descrevem, mas devem ser deslocados o
suficiente para separá-los das declarações. O delimitador de comentário //
pode servir para comentar toda uma linha ou apenas parte dela.

Ao declarar variáveis, observe as seguintes regras: Faça apenas uma


declaração por linha, de modo a incentivar o uso de comentários, Inicialize
Declarações
apenas uma variável por linha, Use letras minúsculas e evite caracteres
especiais.
Pacotes Letras minúsculas sem caracteres especiais
Os nomes de classe devem ser substantivos, com a primeira letra de cada
Classes e
palavra interna em maiúscula. Tente manter seus nomes de classe simples
e descritivos. Evite siglas e abreviações (a menos que a sigla seja muito mais
interfaces
usada do que a forma longa, como a URL ou HTML) .
Métodos devem ser verbos, em maiúsculas e minúsculas com a primeira
Métodos letra minúscula, com a primeira letra de cada palavra interna em
maiúscula.
Devem iniciar com minúscula. Palavras internas começam com letras
maiúsculas. Não deve começar com underline ou $, mesmo que ambos
sejam permitidos. Use nomes curtos, mas significativos. O nome deve
Variáveis
indicar a intenção da utilização da variável. Os nomes comuns para
variáveis temporárias são i, j, k, m, n e para inteiros, c, d, e e para
caracteres.
Constantes Constantes devem ter todas as letras maiúsculas separadas por underline

Java 8

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 120


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

O Java 8 é a release mais recente do Java que contém novas funcionalidades, aprimoramentos e
correções de bug para aumentar a eficiência do desenvolvimento e execução de programas Java.
A nova release do Java primeiro é disponibilizada para desenvolvedores, a fim de permitir um
tempo adequado de teste e certificação, e só então fica disponível no site [Link] para que
usuários finais façam download. As novas funcionalidades do Java 8 são:

Métodos de Expressão Lambda e Extensão Virtual: O destaque do Java SE 8 é a implementação


de expressões Lambda e funcionalidades de suporte para a linguagem de programação e
plataforma Java.

API de Data e Hora: Essa nova API permitirá que os desenvolvedores tratem data e hora de
maneira mais natural, clara e fácil de entender.

Nashhorn JavaScript Engine: Uma nova implementação leve de alto desempenho do motor
JavaScript foi integrada ao JDk e está disponível para aplicações Java por meio das APIs
existentes.

Maior Segurança: A lista manual existente de métodos sensíveis do chamador foi substituída por
um mecanismo que identifica com precisão esses métodos e permite que seus chamadores sejam
descobertos com confiança.

Java 8 trouxe também o recurso denominado Default Methods, que foi introduzido para
possibilitar a evolução de interfaces ao permitir que interfaces já existentes ofereçam métodos
novos sem que os códigos que as implementem também tenham que fornecer uma
implementação para esses métodos.

Diante disso, note que um dos focos dessa nova versão continua sendo manter a compatibilidade
com códigos legados e ser o menos intrusivo possível, ou seja, afetar o menos possível as antigas
APIs.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 121


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Java 17

A Oracle anunciou em setembro de 2021 a disponibilização do Java 17, a versão mais recente da
plataforma de desenvolvimento e linguagem de programação que é número um do mundo. O
Java 17 oferece milhares de atualizações de desempenho, estabilidade e segurança, bem como
14 JEPs (JDK Enhancement Proposals) que melhoram ainda mais a linguagem e a plataforma Java
para ajudar os desenvolvedores a serem mais produtivos.

Java 17 é o mais recente lançamento de suporte de longo prazo (LTS) sob a cadência de
lançamento de seis meses do Java e é o resultado de uma ampla colaboração entre engenheiros
da Oracle e outros membros da comunidade mundial de desenvolvedores Java, por meio da
OpenJDK Community e do Java Community Process (JCP). Desde o lançamento do JDK 11 LTS
anterior há três anos, mais de 70 JEPs foram implementados.

Os JEPs são divididos em: Aprimoramento da linguagem Java (JEP 409), Atualizações e melhorias
para bibliotecas( JEPs 306, 356, e 382), Suporte para nova plataforma (JEP 391), Removals and
Deprecations (JEPs 398, 407, 410 e 411), Programas Java de Prova Futura (JEP 403), Visualizações
e incubadoras para versões posteriores do JDK (JEPs 406, 412, 414). Vejamos os nomes e as
descrições dos 17 JEPs!

JEP Descrição
Classes e interfaces seladas restringem outras classes ou interfaces que
podem estendê-las ou implementá-las. Esse aprimoramento é mais um
JEP 409: Classes seladas
aprimoramento do Projeto Amber, que visa aumentar a produtividade
do desenvolvedor por meio da evolução da linguagem Java.
A linguagem de programação Java e a máquina virtual Java,
originalmente tinham apenas semântica de ponto flutuante estrita. A
JEP 306: Restaure a
partir do Java 1.2, pequenas variações nessas semânticas estritas foram
semântica de ponto
permitidas por padrão para acomodar as limitações das arquiteturas de
flutuante Always-Strict
hardware atuais. Essas variações não são mais úteis ou necessárias, por
isso foram removidas pelo JEP 306.
Fornece novos tipos de interface e implementações para geradores de
JEP 356: Gerador de número pseudo-aleatório (PRNGs). Essa mudança melhora a
número pseudo-aleatório interoperabilidade de diferentes PRNGs e torna mais fácil solicitar um
aprimorado algoritmo com base em requisitos, em vez de codificar uma
implementação específica.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 122


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Implementa um pipeline Java 2D para macOS usando a API Apple Metal.


JEP 382: Novo pipeline de
O novo pipeline reduzirá a dependência do JDK na API Apple OpenGL
renderização do macOS
obsoleta.
Portas do JDK para a plataforma macOS / AArch64. Esta porta permitirá
JEP 391: macOS AArch64
que os aplicativos Java sejam executados nativamente nos novos
Port
computadores Apple Silicon baseados no Arm 64.
Todos os fornecedores de navegadores da web removeram o suporte
para plug-ins de navegador Java ou anunciaram planos para iniciarem a
JEP 398: descontinuar a
solução. A API Applet foi descontinuada, mas não para remoção, no Java
API do miniaplicativo para
9 em setembro de 2017.
remoção

JEP 407: Remove RMI Remove o mecanismo de ativação de Remote Method Invocation (RMI),
Activation preservando o resto do RMI.
O compilador experimental baseado em Java (AOT) e just-in-time (JIT)
JEP 410: Remova o AOT
foram recursos experimentais que não tiveram muita adoção. Por serem
experimental e o
opcionais, eles já foram removidos do JDK 16. Este JEP remove esses
compilador JIT
componentes do código-fonte do JDK.
O Security Manager remonta ao Java 1.0. Não foi o principal meio de
JEP 411: Obsoleta o proteger o código Java do lado do cliente por muitos anos e, raramente,
Security Manager para foi usado para proteger o código do lado do servidor. Removê-lo em uma
Remoção versão futura ajudará a eliminar uma carga de manutenção significativa
e permitirá que a plataforma Java avance.
Não será mais possível relaxar o forte encapsulamento de elementos
internos por meio de uma única opção de linha de comando, como era
possível no JDK 9 ao JDK 16. Ainda será possível acessar os APIs internos
JEP 403: Encapsular existentes, mas agora exigirá enumerar, como parâmetros de linha de
fortemente JDK comando ou atributos de manifesto de arquivo JAR, cada pacote para o
qual o encapsulamento deve ser relaxado. Essa mudança levará a
aplicativos mais seguros e menos dependências de detalhes de
implementação JDK internos que não são padrão.
JEP 406: Permite que uma expressão seja testada em vários padrões, cada um
Correspondência de com uma ação específica, de forma que consultas complexas orientadas
padrões para switch a dados, possam ser expressas de forma concisa e segura.
(visualização)
Melhora as APIs de incubação introduzidas no JDK 14 e JDK 15 que
permitem que, programas Java interoperem com código e dados fora do
tempo de execução Java. Invocando com eficiência funções externas (ou
JEP 412: Função externa e
seja, código fora da JVM) e acessando com segurança a memória externa,
API de memória
essas APIs permitem que os programas Java chamem bibliotecas nativas
(incubadora)
e processem dados nativos sem a fragilidade e complexidade da Java
Native Interface (JNI). Essas APIs estão sendo desenvolvidas no Projeto
Panamá, que visa melhorar a interação entre código Java e não Java.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 123


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Permite expressar cálculos vetoriais que compilam de forma confiável


JEP 414: API Vector em tempo de execução para instruções vetoriais otimizadas em
(Segunda Incubadora) arquiteturas de CPU suportadas, alcançando, assim, um desempenho
superior aos cálculos escalares equivalentes.

O Java 17 LTS é a versão de suporte de longo prazo mais recente para a plataforma Java SE. Os
binários JDK 18 e JDK 17 são gratuitos para uso em produção e para redistribuição, sem custo.

No site da Oracle temos a informação que o JDK 18 receberá atualizações até setembro de 2022,
quando será substituído pelo JDK 19. O JDK 17 receberá atualizações até pelo menos setembro
de 2024.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 124


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

REFERÊNCIAS

[Link]

[Link]

Deitel, Paul. Java: como programar / Paul Deitel, Harvey Deitel; tradução Edson Furmankiewicz;
revisão técnica Fabio Lucchini. -- São Paulo: Pearson Education do Brasil, 2017

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 125


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

QUESTÕES COMENTADAS – CEBRASPE

1. (CESPE – Petrobrás – 2022)

package cadastroUsuario;

import [Link];

import [Link];

import [Link].*;

import [Link];

import [Link];

import [Link];

public class CadastroServlet extends HttpServlet

protected void doPost(HttpServletRequest

request,HttpServletResponse response)

throws ServletException, IOException {

String nome = [Link](“nome”);

String endereco =

[Link](“endereco”);

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 126


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

String telefone =

[Link](“telefone”);

[Link](“text/html”);

PrintWriter out = [Link]( );

[Link](“<HTML>“);

[Link](“<HEAD>“);

[Link](“<STYLE>“);
==1365fc==

[Link](“background-color: green;”);

[Link](“</STYLE>“);

[Link](“</HEAD>“);

[Link](“<BODY>“);

[Link](“<P>Prezado(a) “, “ + nome + “

</P>“);

[Link](“<P>Obrigado por se

cadastrar.</P>“);

[Link](“<P>Entraremos em contato através

do telefone”, “ + telefone+ “ em breve.</P>“);

[Link](“</BODY>“);

[Link](“</HTML>“);

[Link]( );

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 127


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Tendo como referência o código precedente, julgue o item que se segue.

A linha

String nome = [Link](“nome”);

pode ser alterada para

String nome = [Link](“nome”);

sem perda de funcionalidade no código.

Comentários:

Pessoal, conforme descrito no tópico “Métodos”, há diferenças entre esses métodos, um deles é
o retorno: getParameter retorna uma String representando o valor único do parâmetro. Já, o
getAttribute retorna um Object contendo o valor do atributo, ou null se o atributo não existir.
Portanto, há perda de funcionalidade no código tornando errada a assertiva.

Gabarito: Errada

2. (CESPE - DP DF - 2022) No Java 8, o uso do método map() permite aplicar uma função a todos
os elementos de um stream.

Comentários:

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 128


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Stream map(Function mapper) retorna um stream que consiste nos resultados da aplicação da
função dada aos elementos desse stream. Stream map (Mapeador de funções) é uma operação
intermediária. As operações intermediárias são invocadas em uma instância do Stream e, depois
que terminam seu processamento, fornecem uma instância do Stream como saída.

Gabarito: Correto

3. (CESPE - DP DF– 2022) Quando a mensageria é utilizada com linguagem Java, as requisições
são processadas exclusivamente de forma síncrona.

Comentários:

Os sistemas de mensageria permitem que você acople livremente sistemas heterogêneos,


enquanto fornece também confiabilidade, transações e muitos outros recursos. Ao contrário dos
sistemas baseados em um padrão de Chamada de Procedimento Remoto (RPC), o sistema de
mensageria usa principalmente um padrão de passagem de mensagem assíncrona sem relação
entre pedidos e respostas. Ou seja, o serviço é realizado de forma assíncrona, o que torna a
questão incorreta.

Gabarito: Errado

4. (CESPE – SEED PR –2021) Java é uma linguagem construída a partir de um legado das
linguagens C e C++. No entanto, ela apresenta características únicas que a diferem das demais,
como:

I. o applet, que é um tipo especial de programa Java projetado para ser transmitido pela
Internet e executado por um navegador web compatível com Java.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 129


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

II. a saída de seu compilador não gera um código executável e, sim, um bytecode.

III. o fato de um programa Java ser executado somente pela Java virtual machine (JVM).

Assinale a opção correta.

a) Apenas o item I está certo.

b) Apenas o item II está certo.

c) Apenas os itens I e III estão certos.

d) Apenas os itens II e III estão certos.

e) Todos os itens estão certos.

Comentários:

Pessoal, perfeita a assertiva I: applet é um tipo especial de programa Java projetado para ser
transmitido pela Internet e executado por um navegador web compatível com Java. A assertiva II
também está de acordo com o que vimos! O compilador transforma o arquivo .java em código de
máquina e em um arquivo .class, também chamado bytecode. Por fim, a assertiva III também está
correta, exatamente como dissemos anteriormente: O bytecode é um código intermediário, que
é posteriormente interpretado e executado por uma Java Virtual Machine (JVM). O código fonte
é entendido pelo sistema operacional, mas varia em cada um deles. Quando você usa o bytecode,
através do .class você consegue rodar facilmente em qualquer sistema operacional, sem ter que
usar o código-fonte.

Gabarito: Letra E

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 130


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

5. (CESPE – PGDDF – 2021) Julgue o item subsecutivo, a respeito de lógica e de estrutura de


programação.

função avaliar( a, b )

início

ma <-a;

se (ma < b) então ma <- b;

me <-a;

se (me > b) então me <- b;

resultado <- ( ma % me );

se (resultado = 0)

então retorne me

senão avaliar(me, ma)

fim

escreva avaliar (120,30);

O resultado do pseudocódigo precedente será 120.

Comentários:

Pessoal, o código consiste em comparar dois valores, 120 e 130 (avaliar (120,30)). Vocês devem
observar que os valores de a e b são respectivamente 120 e 30. Daí, no início da função, avaliar
ma recebe o valor de a (120), e passa pelo primeiro se (se (ma < b) então ma <- b) e não entra, já
que ma (120) é maior que b (30). Já, o segundo “se – então” é executado, veja: se (me > b) então
me <- b; me é maior que b porque me = 120 e b = 30. Com o resultado verdadeiro do se, me
recebe o valor 30 – que era o valor de b (no código me=b). Após isso, a variável resultado recebe

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 131


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

o resto da divisão de ma por me que é igual a 0. Como resultado é igual a zero, entra no próximo
se ( se (resultado = 0)), daí retorna o valor de me que é 30. Portanto, o resultado do pseudocódigo
será 30, e não 120 conforme diz a questão.

Gabarito: Errado

6. (CESPE – TJ-RJ – 2021) Considere o trecho de código a seguir, de um programa escrito na


linguagem Java.

Com relação aos trechos de código precedentes, é correto afirmar que

a) o parâmetro this, na linha 7 da classe CarroEsportivo, é uma palavra reservada usada para
mostrar que está sendo feita referência ao atributo privado marca da classe Carro.

b) o comando this, na linha 7 da classe CarroEsportivo, é uma palavra reservada que faz
referência ao atributo público marca da classe Carro.

c) a instrução super, na linha 6 da classe CarroEsportivo, é usada para importar o pacote


atributos privados da classe Carro, a fim de se tornarem públicos para a classe CarroEsportivo.

d) a instrução super, na linha 6 da classe CarroEsportivo, permite à classe CarroEsportivo


acessar os atributos privados da classe Carro.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 132


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

e) a instrução super, na linha 6 da classe CarroEsportivo, pode permitir à classe CarroEsportivo


acessar atributos públicos da classe Carro.

Comentários:

Vejamos cada uma das alternativas a partir da análise do código apresentado. A letra a está errada,
pois diz que o parâmetro this, na linha 7 da classe CarroEsportivo, é uma palavra reservada usada
para mostrar que está sendo feita referência ao atributo privado marca da classe Carro, sendo que
o parâmetro this faz referência ao atributo privado marca da classe CarroEsportivo. A letra B
também está errada porque o comando this, na linha 7, faz referência a marca da classe
CarroEsportivo. Já a alternativa c está errada pois não é possível importar o pacote atributos
privados da classe Carro, a fim de se tornarem públicos dado que eles estão com o modificador
private. A alternativa d também está errada, assim como a anterior, pois não é possível acessar
atributos privados, mesmo que seja uma classe filha. Por fim, a alternativa e é o nosso gabarito!
De fato, a instrução super chama membros da classe-pai. Ou seja, é uma variável de referência
usada para referenciar o objeto da classe pai.

Gabarito: Letra E

7. (CESPE – PGDF – 2021) Com relação a servidores de aplicação e seus serviços e a teoria de
becapes, julgue o item a seguir.

Apenas uma única instância do Tomcat pode existir em uma única JVM (Java virtual machine);
no entanto, é possível ter múltiplas instâncias em uma mesma máquina virtual, desde que em
processos Java separados, em execução em portas separadas.

Comentários:

Pessoal, na verdade, é possível uma mesma máquina física, porém com processos Java separados
e sendo executados em portas separadas. Veja: uma instância do Tomcat é o componente de mais
alto nível na hierarquia do contêiner Tomcat. Apenas uma única instância do Tomcat pode existir
em uma única JVM. Essa abordagem faz que todas as outras aplicações Java que estejam sendo

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 133


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

executadas em uma mesma máquina física em um servidor Tomcat, seguras, caso o Tomcat ou a
JVM travem. Podem-se ter múltiplas instâncias em uma mesma máquina física, porém com
processos Java separados e sendo executados em portas separadas.

Gabarito: Errado

8. (CESPE -– Ministério da Economia – 2020) Em Java 8, o método de limite de fluxo tem como
objetivo eliminar elementos com base em um critério.

Comentários:

Na verdade, o método limit é utilizado para limitar a quantidade de elementos em um fluxo.

Gabarito: Errado

9. (CESPE – Ministério da Economia – 2020) Uma expressão lambda é usada principalmente para
definir a implementação procedural de uma interface associativa.

Comentários:

Uma expressão lambda é usada principalmente para definir a implementação procedural de uma
interface funcional.

Gabarito: Errado

10. (CESPE – Pref. Barra dos Coqueiros – 2020) A máquina virtual do Java (JVM) utiliza uma
tecnologia especificamente para aumentar o desempenho da aplicação, identificando códigos
que serão muito executados, normalmente dentro de loops. Essa tecnologia é chamada de

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 134


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

a) hotspot.

b) bytecode.

c) compilação estática.

d) JRE (Java Runtime Environment).

e) JDK (Java Development Kit).

Comentários:

A questão solicita uma tecnologia especificamente para aumentar o desempenho da aplicação,


identificando códigos que serão muito executados, normalmente dentro de loops. De acordo com
Deitel, em geral, as JVMs atuais executam bytecodes utilizando uma combinação de interpretação
e a chamada compilação Just-In-Time ( JIT). Nesse processo, a JVM analisa os bytecodes à medida
que eles são interpretados, procurando hotspots (pontos ativos) — partes dos bytecodes que
executam com frequência. Para essas partes, um compilador Just-In-Time (JIT) — conhecido como
compilador Java HotSpot — traduz os bytecodes para a linguagem de máquina de um computador
subjacente. Da mesma forma, temos a definição de HotSpot que é uma máquina virtual Java para
desktops e servidores, mantido e distribuído pela Oracle Corporation. Ele apresenta técnicas
como just-in-time de compilação e otimização adaptativa projetado para melhorar o desempenho.
Portanto, temos a certeza que o gabarito é a letra A. A assertiva b está errada porque o bytecode
é um código intermediário, que é posteriormente interpretado e executado por uma Java Virtual
Machine (JVM). A letra c também está errada, foi apenas para confundir o candidato. A letra d
trata da JRE, camada de software que é executado sobre um software de sistema operacional de
um computador e fornece as bibliotecas de classe e outros recursos que um programa específico
do Java precisa executar. Por fim, JDK é um conjunto de utilitários cuja a finalidade é a permissão
para criação de jogos e programas para a plataforma Java. Este pacote é disponibilizado pela
Oracle, e nele vem todo o ambiente necessário para a criação e execução dos aplicativos java.

Gabarito: Letra A

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 135


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

11. (CESPE – MPE-CE – 2020) Com base na linguagem de programação Java, julgue o item a
seguir.

O código

public class mpce {

public static void main(String[] args) {

int[][] num = { {3, 5}, {9, 7} };

for (int i = 0; i < [Link]; ++i) {

for(int j = 0; j < num[i].length; ++j) {

[Link](num[i][j]);

apresentará, quando executado, o resultado a seguir.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 136


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Comentários:

Na verdade, a sequência que será apresentada é: 3, 5, 9, 7. Portanto a questão está errada, pois
a matriz não fará a ordenação dos dados, mas apenas imprimir, primeiro preenchendo as linhas e
em seguida preenchendo as colunas.

Gabarito: Errado

12. (CESPE – MPE-CE – 2020) Com base na linguagem de programação Java, julgue o item a
seguir.

O código

public class mpce {

public static int Funcao(int num, int resultado){

if(num<1)

return resultado;

resultado+=(num%10);

return Funcao(num/10, resultado);

public static void main(String[] args) {

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 137


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

int res = Funcao(17, 0);

[Link]("O resultado é: " +

res);

apresentará a seguinte saída ao ser executado.

O resultado é: 8

Comentários:

Vejamos o funcionamento da função: ela executa até o valor de num ser menor que 1, ou seja, até
que o valor de num seja 0. Para o início da execução temos os valores iniciais de 17 para num e 0
para resultado. O primeiro passo a se fazer é entrar no if, da linha 3, e fazer a comparação: 17 <
1, dezessete é menor que um? A resposta é não, assim ele ignora a instrução de retorno que está
na linha 4 e parta para a operação matemática da linha 5. resultado = resultado + (num % 10), a
variável resultado está recebendo a soma dela mesma com o resto da divisão de num por 10, em
números temos: 0 = 0 + (17 % 10) -> o resto da divisão de 17 por 10 é 7, assim temos: resultado
= 0 + 7. Neste momento o valor da variável resultado é 7. E entramos na instrução de retorno da
linha 6, em que retorna a própria função com o valor da variável num dividido por 10 e o valor da
variável resultado. Assim temos: 17 / 10 = 1,7, mas como a função retorna apenas a parte inteira,
então aqui esta divisão assume valor 1. Então a instrução de retorno da linha 6 tem como valores
num = 1 e resultado = 7. E o processo se repete novamente e voltamos ao if da linha 3. Ele vai
repetir esses passos até que chegue a comparação 0,1 < 1, zero vírgula um é menor que 1? A
resposta é sim, então agora ele entra na instrução de retorno da linha 4, neste caso ele imprime a
variável resultado que possui valor 8. Então, quando chama a função na linha 9 ela imprime a
variável resultado como 8. Dessa forma, o nosso gabarito está correto.

Gabarito: Correto

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 138


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

13. (CESPE – TJPA – 2020)

class GeraNumeros {

public static void main (String args []) {

int num;

num = 36;

for(int i=0; i < num; i++) {

if(i*i >= num) break;

[Link](i + “ ”);

Assinale a opção que apresenta corretamente a saída gerada pelo código Java precedente.

a) 36

b) 1 2 3 4 5 6

c) 1 2 3 4 5

d) 0 1 2 3 4 5

e) 0 1 2 3 4 5 6

Comentários:

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 139


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Pessoal, a função compara i a num. E irá parar quando i for menor que 36. Aparentemente, i é
incrementado em 1, porém dentro do if, i = i*i. Podemos visualizar o foco da questão nessa
condição. Assim, i vale respectivamente 0,1,4,9,16,25,36 a cada iteração. Portanto sendo
executado 7 vezes. E imprimindo respectivamente os valores 0 1 2 3 4 5.

Gabarito: Letra D

14. (CESPE – STM – 2018) Os membros de uma classe definidos como PUBLIC não podem ser
acessados ou usados por nenhuma outra classe.

Comentários:

Vamos relembrar todos os modificadores? Default (modificador): A classe e/ou seus membros são
acessíveis somente por classes do mesmo pacote, na sua declaração não é definido nenhum tipo
de modificador, sendo este identificado pelo compilador. Public: Marca a visibilidade de uma
classe, método ou variável de instância para que todas as classes em todos os pacotes tenham
acesso. Package: Informa em que estrutura de diretórios a classe está localizada. Private: Marca a
visibilidade de um método ou variável de instância para que apenas a própria classe acesse.
Membros da classe definidos como private não podem ser acessados ou usados por nenhuma
outra classe. Esse modificador não se aplica às classes, somente para seus métodos e atributos.
Esses atributos e métodos também não podem ser visualizados pelas classes herdadas. Protected:
Marca a visibilidade de um método ou variável de instância para que apenas a própria classe ou
suas filhas acessem. O modificador protected torna o membro acessível às classes do mesmo
pacote ou através de herança, seus membros herdados não são acessíveis a outras classes fora do
pacote em que foram declarados. Portanto, Public: Marca a visibilidade de uma classe, método ou
variável de instância para que todas as classes em todos os pacotes tenham acesso e a questão
está incorreta!

Gabarito: Errado

15. (CESPE – CGM-Joao Pessoa– 2018) A JME oferece um ambiente robusto e flexível para
aplicativos executados em dispositivos móveis e integrados cuja capacidade de memória, de

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 140


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

vídeo e de processamento são limitados, tais como set-top boxes e reprodutores de discos
blu-ray.

Comentários:

A plataforma Java, Micro Edition (Java ME) fornece um ambiente robusto e flexível para aplicativos
executados em dispositivos embarcados e móveis na Internet das Coisas: microcontroladores,
sensores, gateways, telefones celulares, assistentes digitais pessoais (PDAs), aparelhos de TV top
boxes, impressoras e muito mais. O Java ME inclui interfaces de usuário flexíveis, segurança
robusta, protocolos de rede integrados e suporte para aplicativos em rede e offline que podem
ser baixados dinamicamente. Os aplicativos baseados em Java ME são portáteis em muitos
dispositivos, mas aproveitam os recursos nativos de cada dispositivo. Essa é a definição exata do
site da Oracle! Perfeita questão.

Gabarito: Correto

16. (CESPE – TER-TO– 2017) Na orientação a objetos, a alteração do comportamento dos métodos
herdados das superclasses para um comportamento mais específico nas subclasses, de forma
a se criar um novo método na classe filha que contém a mesma assinatura e o mesmo tipo de
retorno, relaciona-se a

a) sobrecarga.

b) overloading.

c) portabilidade.

d) abstração.

e) sobrescrita.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 141


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Comentários:

Pessoal, isso é um caso de sobrescrita. Utilizando a sobrescrita conseguimos especializar os


métodos herdados das superclasses, alterando o seu comportamento nas subclasses por um mais
específico. A sobrescrita (ou override) está diretamente relacionada à orientação a objetos, mais
especificamente com a herança. Com a sobrescrita, conseguimos especializar os métodos
herdados das superclasses, alterando o seu comportamento nas subclasses por um mais
específico. A sobrescrita de métodos consiste basicamente em mesmo tipo de retorno do método
sobrescrito.

Gabarito: Letra E

17. (CESPE – TCE-PA – 2016) O fato de as expressões lambda terem sido excluídas do Java 8
possibilitou que a linguagem Java ficasse mais flexível e que a implementação de seu código
se tornasse mais precisa.

Comentários:

Pessoal, erradíssimo! Lambda foi incluída no Java 8! Um lambda permite que um trecho de código
seja passado como parâmetro para uma função ou ser armazenado em uma variável para ser
invocado posteriormente

Gabarito: Errado

18. (CESPE – FUNPRESP-JUD – 2016) Para lidar com um conjunto de objetos em JSon, é necessário
utilizar um array que permita realizar, em uma única operação, a carga de todos os objetos.

Comentários:

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 142


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Não é necessário utilizar um array.

Gabarito: Errado

19. (CESPE – TRE-PI – 2016) A linguagem Java foi, originalmente, desenvolvida para

a) permitir a comunicação entre aparelhos domésticos e computadores.

b) traduzir fórmulas matemáticas utilizando-se cartões perfurados.

c) processar valores inteiros, em um ambiente negócios, em computadores de grande porte.

d) trabalhar com inteligência artificial por meio de uma abordagem puramente lógica.

e) demonstrar a viabilidade da implementação da álgebra relacional de dados.

Comentários:

A história de Java começou a ser escrita quando James Gosling, Patrick Naughton e Mike Sheridan
se uniram a dois fundadores da Sun, Andy Bechtolsheim e Bill Joy, para pensar sobre a nova onda
do mundo digital. Eles não demoraram muito para concluir que seria a convergência de
computadores aos dispositivos e eletrodomésticos utilizados no dia a dia, tudo interconectado e
remotamente controlado. Uma questão sobre “curiosidades”, temos como gabarito a letra A, já
que, Java foi, originalmente, desenvolvida para permitir a comunicação entre computadores aos
dispositivos e eletrodomésticos

Gabarito: Letra A

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 143


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

20. (CESPE – TER-GO – 2015) Em um grupo do tipo Array, podem-se armazenar dados de
diferentes tipos.

Comentários:

Errado pessoal! Um Array é um objeto contêiner que contém um número fixo de valores de um
único tipo. O comprimento de um array é estabelecido quando o array é criado. Após a criação,
seu comprimento é fixo.

Gabarito: Errado

21. (CESPE – TJDFT – 2015) Na tecnologia JSP (Java Server Pages), cada documento é convertido
pelo contêiner JSP em um servlet, o que ajuda a separar a apresentação do conteúdo.

Comentários:

Perfeito, pessoal! O JSP é uma ferramenta baseada em Java para criação de páginas dinâmicas
para uso na web. Com isso, cada parte do documento é convertida, através de um Contêiner,
como um TomCat por exemplo, em um Servlet.

Gabarito: Correto

22. (CESPE – SERPRO – 2013) A tecnologia JSE (Java Small Editon) utilizada pela plataforma iOS
permite o desenvolvimento de aplicações para todos os seus dispositivos, como estações
gráficas, iPad, iPod, entre outros.

Comentários:

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 144


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Java Micro Edition (Java ME): trata-se do padrão aplicado a dispositivos compactos ou móveis,
como smartphones, tablets, controles remotos, etc. Permite o desenvolvimento de softwares
embarcados, i.e., aplicações que rodam em um dispositivo de propósito específico,
desempenhando alguma tarefa útil. Em geral, possuem limitações de recursos como memória ou
processamento. Conforme vimos em aula, a questão está cheia de erros! Primeiro, JSE é a sigla
de Java Standard Edition. Segundo, a tecnologia proposta no item é o JME!

Gabarito: Errado

23. (CESPE – MPOG – 2013) O JME foi criado para trabalhar com ambientes de programação
multiprocessados em ambientes distribuídos.

Comentários:

Java Micro Edition (Java ME): trata-se do padrão aplicado a dispositivos compactos ou móveis,
como smartphones, tablets, controles remotos, etc. Permite o desenvolvimento de softwares
embarcados, i.e., aplicações que rodam em um dispositivo de propósito específico,
desempenhando alguma tarefa útil. Em geral, possuem limitações de recursos como memória ou
processamento. Java Enterprise Edition (Java EE): trata-se do padrão para desenvolvimento de
sistemas corporativos, voltada para aplicações multicamadas, baseadas em componentes
executados em servidores de aplicações – ele inclui o Java SE. Contém bibliotecas para acesso a
base de dados, RPC, CORBA, entre outras. As aplicações podem ou não estar na internet.
Conforme vimos em aula, Java ME possui diversas limitações de recursos. Na verdade, é o Java
EE que é ideal para ambientes distribuídos.

Gabarito: Errado

24. (CESPE – ANTT – 2013) JSE, JME, JEE e JCE são edições da tecnologia Java voltadas para o
desenvolvimento de aplicações para desktop/servidores, dispositivos móveis, ambientes
corporativos e ambientes em nuvem, respectivamente.

Comentários:

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 145


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Java Micro Edition (Java ME): trata-se do padrão aplicado a dispositivos compactos ou móveis,
como smartphones, tablets, controles remotos, etc. Permite o desenvolvimento de softwares
embarcados, i.e., aplicações que rodam em um dispositivo de propósito específico,
desempenhando alguma tarefa útil. Em geral, possuem limitações de recursos como memória ou
processamento. Conforme vimos em aula, está quase tudo certo! No entanto, JCE é uma API de
Criptografia (Java Cryptography Extension). Não se trata de uma plataforma ou ambiente de
desenvolvimento em nuvem!

Gabarito: Errado

25. (CESPE – TRT 10ª Região – 2013) O uso de [Link]() possibilita a exibição de textos;
para a exibição de valores de variáveis, é necessário utilizar showAttributes().

Comentários:

Errado! O [Link]() pode perfeitamente ser utilizada para exibir variáveis.

Gabarito: Errado

26. (CESPE – TRT 10ª Região – 2013) No código abaixo, caso a variável salário assuma o valor igual
a 5000, o valor b da variável avaliação será atribuído corretamente.

if (salario > 10000) {

avaliacao=”a”;

else

avaliacao=”b”;

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 146


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Comentários:

Como o valor apresentado (5.000) é menor que 10.000, a assertiva está correta!

Gabarito: Correto

27. (CESPE – TRT 10ª Região – 2013) A execução do código abaixo informará a classe do objeto
que foi atribuído à variável de nome var4.

String nome = [Link]();

Comentários:

Errado, na verdade, getname retorna o nome do objeto. O código apresentado pelo item declara
e inicializa uma variável nome, do tipo String. O valor que essa variável receberá é o que for
retornado pelo método getname, invocado sobre o objeto var4. Apenas com as informações
trazidas, é impossível saber qual a classe à qual o objeto var4 pertence.

Gabarito: Errado

28. (CESPE – MPU – 2013) O tratamento de exceção em Java consiste no bloco try-catch-finally.
O bloco finally sempre executa ao término do bloco try.

Comentários:

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 147


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Questão, ao generalizar, erra porque finally não está relacionada com o sucesso do bloco try-
catch-finally. A instrução finally permite que você execute código, depois do try...catch,
independentemente do resultado.

Gabarito: Errado

29. (CESPE – MPU – 2013) Se a thread executando um código try ou catch for interrompida ou
abortada, o bloco finally poderá não ser executado, apesar de a aplicação como um todo
continuar.

Comentários:

A instrução try permite que você defina um bloco de código para ser testado quanto a erros
enquanto está sendo executado. A instrução catch permite definir um bloco de código a ser
executado, caso ocorra um erro no bloco try. Por fim, a instrução finally permite que você execute
código, depois do try...catch, independentemente do resultado. Mas há casos em que o finally
não é executado. Questão correta!

Gabarito: Correto

30. (CESPE – TRE-MA – 2009) Para definição e manipulação de uma exceção em Java, devem
constar no programa, obrigatoriamente, os termos:

a) try e catch.

b) try e finally.

c) finally e catch.

d) finally e retry.

e) try e retry.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 148


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Comentários:

Pessoal, o correto é Try e catch.

Gabarito: Letra A

31. (CESPE – SERPRO – 2008) A linguagem Java, orientada a objetos, tem como característica ser
compilada em um código executado em máquina virtual.

Comentários:

Java é também uma linguagem portável e multiplataforma! O Compilador é capaz de gerar um


código intermediário (bytecode), que permite que o mesmo programa possa ser executado em
qualquer máquina ou sistema operacional que possua uma JVM. Ademais, busca que todos os
aspectos da linguagem sejam independentes de plataforma (Ex: ela especifica o tamanho e
comportamento de cada tipo de dado). Conforme vimos em aula, está perfeito! Qual o nome
desse código? Bytecode!

Gabarito: Correto

32. (CESPE – TRT - 5ª Região – 2008) A instrução import [Link].* indica que o programa irá
utilizar componentes gráficos.

Comentários:

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 149


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Essa questão é polêmica! Alguns afirmar que é possível inserir a instrução, mas não utilizar
componentes gráficos. Não faria sentido importar um pacote para não utilizar suas
funcionalidades, mas é possível – apesar de má prática! Eu acredito que a questão cabe recurso,
sim!

Gabarito: Correto

33. (CESPE – TRT - 5ª Região – 2008) Em Java, os métodos public de uma classe são utilizados
pelos clientes da classe para manipular dados armazenados em objetos dessa classe.

Comentários:

Pessoal, esses Modificadores de Acesso determinam quão acessíveis são esses elementos. Vamos
vê-los agora em mais detalhes:<public>: essa instrução indica que a classe, método ou atributo
assim declaradas podem ser acessadas em qualquer lugar e a qualquer momento da execução do
programa – é o modificador menos restritivo. Perfeito, são públicos para toda e qualquer classe.

Gabarito: Correto

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 150


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

QUESTÕES COMENTADAS – FGV

1. (FGV – CGU – 2022) Observe o trecho de código a seguir.

1 import [Link].*;
2
3 interface Segunda { public void segunda();}
4 interface Terca { public void terca();}
5 interface Quarta extends Segunda, Terca { public void quarta();}
6
7 class Quinta implements Segunda {
8 public void segunda(){[Link]("Segunda");}
9}
10
11 class Sexta extends Quinta implements Quarta {
12 public void segunda(){[Link]("Segunda!");}
13 public void terca(){[Link]("Segunda!!");}
14 public void quarta(){[Link]("Segunda!!!");}
15 }
16
17 public class teste
18 {
19 public static void main( String[] args )
20 {
21 Quinta dia = (Quinta) new Sexta();
22 [Link]();
23 }
24 }

A saída produzida pela execução do código é:

a) Erro de compilação na linha 5


b) Segunda
c) Segunda!
d) Segunda!!
e) Segunda!!!

Comentários:

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 151


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Primeiramente, temos que a assertiva a está incorreta, já que a linha 5 não gera erro, pois entre
interfaces pode haver "herança múltipla”, ou seja, herança de duas ou mais classes. Agora vamos
analisar o código. No código há três interfaces, Segunda, Terca e Quarta além das classes Sexta e
Quinta. Sendo que a classe Quinta é classe pai, ou superclasse, e a classe Sexta é classe filha, ou
subclasse. O foco da questão está na chamada da linha 21 Quinta dia = (Quinta) new Sexta(); nessa
linha, temos que o objeto dia chama o método construtor Sexta, que está na classe Sexta, que é
filha de Quinta. Quando esse objeto for criado, ele vai à classe Sexta e procura pelo método
segunda, se o encontrar ali, executa o que estiver no corpo do método, senão, ele vai à classe
Quinta a procura de um método segunda. Daí, quando a linha [Link](); for executada, o
objeto dia procura um método segunda. Ele vai à classe Sexta, pois esse é o método construtor
que foi passado na criação do objeto, após isso, caso não encontre o método segunda na classe
Sexta, ele vai à classe Quinta, que deve ter um método segunda presente em seu corpo. Assim, o
resultado que será apresentado na tela é Segunda! E temos nosso gabarito na alternativa C.

Gabarito: Letra C

2. (FGV – TJDFT – 2022) Observe as classes abaixo descritas na linguagem de programação Java.

public class DocumentoProcesso extends Object


{
private String docNumero;
private int classificacao;

public DocumentoProcesso (String docNumero, int

classificacao){
if (classificacao < 1)
throw new IllegalArgumentException (
"A classificação do documento deve ser no mínimo 1.");

[Link] = docNumero;
[Link] = classificacao;
}
public String getDocNumero()
{ return docNumero; }
public int getClassificacao()
{ return classificacao; }
public void setDocNumero(String docNumero)
{ [Link] = docNumero; }
public void setClassificacao(int classificacao)

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 152


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

{ [Link] = classificacao; }
public int promove()
{ return classificacao + 1; }
}

public class Oficio extends DocumentoProcesso


{

private int precedencia;


public Oficio (String docNumero, int classificacao, int precedencia)
{super(docNumero,classificacao);
[Link] = precedencia; }
public int getPrecedencia()
{ return precedencia; }
public void setPrecedencia(int precedencia)
{ [Link] = precedencia; }
@Override
public int promove()
{ return precedencia + 1; }
}

Com base nos conceitos de orientação a objetos, é correto afirmar que:


a) os atributos private de DocumentoProcesso são acessíveis por Oficio;
b) a anotação @Override indica que o método promove() é abstrato e polimórfico;
c) a classe Oficio representa uma herança múltipla das classes DocumentoProcesso e Object;
d) a classe Oficio é composta pela classe DocumentoProcesso, permitindo que uma instância
da classe Oficio faça referências a instâncias da classe DocumentoProcesso;
e) os métodos getDocNumero() e setDocNumero() da classe DocumentoProcesso encapsulam
o atributo docNumero e asseguram que os objetos da classe mantenham estados consistentes.

Comentários:

Vamos analisar as assertivas: a letra a diz que os atributos private de DocumentoProcesso são
acessíveis por Oficio. Vejamos a classe Oficio: a declaração dela é a seguinte: public class Oficio
extends DocumentoProcesso. Portanto, ofício é filha da classe DocumentoProcesso. Já que os
atributos possuem o modificador private, eles não podem ser compartilhados entre as classes.
Lembrem-se da definição: Membros da classe definidos como private não podem ser acessados
ou usados por nenhuma outra classe. Assim, temos uma assertiva errada. Letra B: a anotação
@Override indica que o método promove() é abstrato e polimórfico. Errada assertiva B porque
@Override indica que um método da classe-pai será sobrescrito por um método da classe-filha,
ou seja, a classe filha modifica o método que foi declarado na classe pai. Para indica que o método

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 153


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

promove() é abstrato deveria ser utilizado abstract. A letra C também está errada, pois na verdade,
é a classe DocumentoProcesso que faz referência à Oficio. Por fim, temos o nosso gabarito na
letra E. Pessoal, os métodos getDocNumero() e setDocNumero() de fato, são utilizados para
encapsular o atributo docNumero. Ademais, asseguram que os objetos da classe mantenham
estados consistentes. Getters e setters são usados para proteger seus dados, especialmente na
criação de classes. Para cada instância de variável, um método getter retorna seu valor, enquanto
um método setter o define ou atualiza seu valor.

Gabarito: Letra E

3. (FGV – PGE-AM – 2022) Considere o trecho de programa Java abaixo.

É correto afirmar que

a) o código mostra um exemplo de sobrescrita de métodos, pois há vários métodos com o


mesmo nome, porém, com parâmetros diferentes.
b) ocorrerá um erro no último método reajuste, pois este não pode ser estático.
c) uma chamada correta ao método reajuste, em condições ideais, é double sal = 1000.5; double
c = [Link](sal);
d) ocorrerá um erro na classe Calcular, pois não é permitido criar vários métodos com o mesmo
nome, como ocorre com o método reajuste.
e) uma chamada correta ao método reajuste, em condições ideais, é float sal = (float) 1000.5;
double c = [Link](sal);

Comentários:

Sobrecarga ou Polimorfismo Estático ocorre quando uma classe possui métodos com mesmo
nome, entretanto assinaturas diferentes. Ocorre em Tempo de Compilação. Veja que o método
reajuste possui diferentes implementações. Com essa explicação inicial podemos verificar que a
letra A está incorreta, pois não ocorre sobrescrita, mas sim, sobrecarga. O erro da letra B consiste
em dizer que método reajuste não pode ser estático. O erro da letra C consiste na falta do
“double” indicado double sal = (double) 1000.5; double c = [Link](sal). O erro da
alternativa d é dizer que não é permitido criar vários métodos com o mesmo nome. Na verdade,

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 154


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

não vai ocorrer um erro. Ocorre uma sobrescrita que é possível em Java! Por fim, temos nosso
gabarito Letra E!
Gabarito: Letra E

4. (FGV – DPE-RJ – 2019) Considere as seguintes afirmativas sobre class constructor na linguagem
Java.

I. Deve receber o mesmo nome da classe a ele associada.

II. Não deve ser especificado um tipo de retorno na sua declaração.

III. É útil para a definição de valores iniciais para os atributos da classe.

IV. É sempre declarado como public.

É correto somente o que se afirma em:


a) I e II;
b) II e III;
c) III e IV;
d) I, II e III;
e) I, III e IV.

Comentários:

Vamos lá, um construtor é um método especial usado para inicializar objetos. O construtor é
chamado quando um objeto de uma classe é criado. Ele pode ser usado para definir valores iniciais
para atributos de objeto. o construtor é apenas invocado no momento da criação do objeto
através do operador new. A assinatura de um construtor diferencia-se das assinaturas dos outros
métodos por não ter nenhum tipo de retorno (nem mesmo void). Além disto, o nome do construtor
deve ser o próprio nome da classe. O construtor pode receber argumentos, como qualquer
método. Usando o mecanismo de sobrecarga, mais de um construtor pode ser definido para uma
classe. Assim, temos que os itens I, II e III estão corretos. Já, a assertiva IV está errada, pois pode
ser public, protected ou private.
Gabarito: Letra D

5. (FGV – MPE-AL – 2018) Analise o código Java a seguir.

public class Exemplo {


public static void main(String[] args) {
int a = 4, b = 16;
String out = (a^b)==0 ? "Sim": (a & b)!=0
? "Talvez" : "Não";

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 155


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

[Link](out);
}
}

A execução do código acima produzirá

a) um erro de compilação.
b) um erro de execução.
c) a linha “Sim”.
d) a linha “Não”.
e) a linha “Talvez”.

Comentários: ==1365fc==

A questão está totalmente focada no operador ternário String out = (a^b)==0 ? "Sim": (a & b)!=0.
Vamos destrinchá-lo. Inicialmente temos: (a^b)==0. O operador ^é um XOR que consiste em um
ou exclusivo que retorna 1 se os bits forem diferentes: Portanto, temos a = 4 e b = 16. a é igual 4
que é igual a 00100 em binário e b – 16 – é igual a 10000 em binário. Fazendo a operação XOR
entre os valores temos como resultado 10100, que é igual a 20 em decimal. Podemos perceber
que o valor não é sim, já que 20 não é igual a 0. Portanto vamos ao próximo argumento que é (a
& b)!=0., ou seja, a e b é diferente de zero. Vejamos como fica o resultado de a & b = 00000
porque o operador “E” (&) só retorna 1 se ambos bits forem 1: a - 00100 (4) b - 10000 (16) =
00000 (0). Veja que o teste vai ficar da seguinte forma: (a & b) != 0. Sabemos que a & b é 0 (de
acordo com o cálculo acima. Assim fica 0 != 0 ? ou seja, zero é diferente de zero? Não né! Então
é retornado o valor “Não”. Já que o operador ternário (TESTE)? X : Y retorna X, se TESTE for
verdadeiro, e Y se teste for falso.

Gabarito: Letra D

6. (FGV – MPE – AL – 2018) No Java, a classe Error e Exception derivam da classe


a) ClassNotFoundException.
b) IOException.
c) MainException.
d) RuntimeException.
e) Throwable.

Comentários:

A classe Throwable é a superclasse de todos os erros e exceções na linguagem Java. Somente


objetos que são instâncias desta classe (ou uma de suas subclasses) são lançados pela Java Virtual
Machine ou podem ser lançados pela instrução throw Java. Da mesma forma, apenas esta classe
ou uma de suas subclasses pode ser o tipo de argumento em uma cláusula catch. Para fins de

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 156


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

verificação de exceções em tempo de compilação, Throwable e qualquer subclasse Throwable


também não é uma subclasse de nenhuma RuntimeExceptionou Error é considerada como
exceções verificadas. Instâncias de duas subclasses, Errore Exception, são convencionalmente
usadas para indicar que ocorreram situações excepcionais. Normalmente, essas instâncias são
recém-criadas no contexto da situação excepcional para incluir informações relevantes (como
dados de rastreamento de pilha).Error e Exception são, portanto, derivadas da superclasse
Throwable. Uma imagem para lembrar da hierarquia de exceções.

Gabarito: Letra E

7. (FGV – MPE-AL – 2018) Sobre as variáveis e os métodos declarados como private, em Java,
analise as afirmativas a seguir.

I. Ficam acessíveis somente aos membros da própria classe.

II. Ficam acessíveis somente às classes definidas no mesmo package.

III. Ficam acessíveis somente para suas classes derivadas.

Está correto o que se afirma em

a) I, apenas.
b) II, apenas.
c) III, apenas.
d) I e II, apenas.
e) II e III, apenas.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 157


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Comentários:

Pessoal, vamos relembrar a tabela? As variáveis e os métodos private ficam acessíveis apenas aos
membros da própria classe! Não ficam disponíveis no pacote e também não ficam acessíveis ás
subclasses! Portanto nosso gabarito é apenas o item I.
Gabarito: Letra A

8. (FGV – BANESTES – 2018) Considere a compilação de um ou mais programas por meio da


linha de comando, num ambiente Java. Nesse caso, o comando que está corretamente
formado para esse fim é:

a) compile [Link] –type java


b) java [Link]
c) javac *.java
d) jvm [Link] [Link]
e) parse java [Link]

Comentários:

A Linguagem Java tem dois processos de execução de código-fonte: Compilação e Interpretação!


Vamos lá... o programador escreve um código em Java em um editor de texto, por exemplo. Ele
salva com a extensão .java e passa por um compilador (JavaC)! O javac é utilizado para compilar
as classes em Java. É necessário usá-lo antes de executar uma classe para que seja gerado um
arquivo .class da classe em questão. Assim, devemos usar a seguinte sintaxe: javac *.java

Gabarito: Letra C

9. (FGV – ALE-RO – 2018) Analise a definição de um array em Java.

int[ ][ ] multi = new int[ 5 ][ 10 ];

Assinale o código que exibe corretamente um elemento de cada linha desse array.

a) for (int i = 0; i < 5; i++) { [Link](multi[i][0]); };


b) for (int i = 0; i < 10; i++) { [Link](multi[i,1]); };
c) for (int i = 0; i <= 5; i++) { [Link](multi[i,0]); };
d) for (int i = 0; i <= [Link]; i++) { [Link](multi[1,i]); };
e) for (int i = 1; i < multi[0].length; i++) { [Link](multi[i,1]); };

Comentários:

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 158


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Bom, o array é multidimentional, possui duas dimensões, costuma-se dizer “i” e “j”. A questão
solicita exibir a primeira linha do array. A primeira linha é composta de 6 elementos (0,1,2,3,4,5).
É necessário que o for seja de 0 até 5. Ademais, para exibir o conteúdo de cada linha usa-se o
nome do array (multi) com a respectiva referência: [i][0]. Assim, temos como gabarito a letra A.

Gabarito: Letra A.

10. (FGV – ALE-RO – 2018) No contexto da linguagem Java, assinale o modificador (modifier) que
se refere ao nível de acesso.

a) abstract
b) final
c) protected
d) static
e) volatile

Comentários:

É nesse momento que você pensa: podia tanto cair uma questão dessas na minha prova .os
modificadores são 4: Privado, Protegido, Público e Pacote. Portanto, nosso gabarito é a letra C.
Vejamos as definições das demais alternativas: abstract: Aplicado a um método ou classe indica
que a implementação completa deste método ou classe é efetuada posteriormente, por uma
subclasse. Caso seja uma classe, significa que ela não pode ser instanciada. Final: é usada para
impossibilitar que uma classe seja estendida, que um método seja sobrescrito ou que uma variável
seja reinicializada. Ou seja, no caso da questão, mantém o atributo constante. Static: é usada para
marcar um método ou variável para que se tenha apenas uma cópia da memória desse membro.
Volatile: para que se possa acessar recursos específicos do sistema operacional, indica que uma
determinada variável de instância pode ser modificada em duas threads distintas ao mesmo
tempo.
Gabarito: Letra C

11. (FGV – ALE-RO – 2018) Sobre construtores (constructors), no contexto da linguagem Java,
analise as afirmativas a seguir.

I. Os construtores devem ser declarados como private.

II. Uma interface não pode ter um construtor.

III. Uma classe abstrata pode ter um construtor.

Está correto o que se afirma em


a) I, somente.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 159


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

b) II, somente.
c) III, somente.
d) I e II, somente.
e) II e III, somente.

Comentários:

Pessoal, o item II está perfeito! A interface só declara métodos e constantes. Ela não implementa!
Uma classe abstrata pode ter um ou mais construtores. O item II também está correto: Embora
não seja possível criar objetos de uma classe abstrata, em uma hierarquia de classes o construtor
de uma subclasse chama (explícita ou implicitamente) o construtor da superclasse. Como uma
classe abstrata deve, necessariamente, ter subclasses, a classe abstrata precisa ter um construtor.
Já, o item I está incorreto: Construtores podem ter qualquer modificador de acesso: private,
<default>, protected ou public.

Gabarito: Letra E

12. (FGV – MPE AL – 2018) O package “[Link]” do Java permite a manipulação de


expressões regulares.

As três classes mais importantes desse pacote são denominadas:


a) RegExp, Parser e Lexicon.
b) RegExPattern, RegExVerifier e RegExCompiler.
c) Pattern, Matcher e PatternSyntaxException.
d) Collector, Retriever e SyntaxParser.
e) Parser, Inspector e Evaluator.

Comentários:

A questão diz que Java permite a manipulação de expressões regulares, e solicita as três classes
mais importantes do pacote. Vejamos o que diz a definição do W3Schools, primeiro sobre
expressões regulares: Uma expressão regular é uma sequência de caracteres que forma um padrão
de pesquisa. Uma expressão regular pode ser um único caractere ou um padrão mais complicado.
As expressões regulares podem ser usadas para executar todos os tipos de pesquisa de texto e
operações de substituição de texto . Java não tem uma classe de Expressão Regular embutida,
mas podemos importar o [Link] pacote para trabalhar com expressões regulares. O
pacote inclui as seguintes classes: PatternClasse - Define um padrão (para ser usado em uma
pesquisa). MatcherClasse - Usada para procurar o padrão. PatternSyntaxExceptionClasse - Indica
erro de sintaxe em um padrão de expressão regular. Portanto as três classes mais importantes são:
Pattern, Matcher e PatternSyntaxException e o nosso gabarito é a letra C.

Gabarito: Letra C

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 160


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

13. (FGV – MPE – AL – 2018) Servidores de aplicação baseados em Java Platform Enterprise Edition
possuem vários tipos de API.

Assinale a opção que indica a API utilizada para fornecer acesso ao servidor de nomes e
diretórios.
a) JNDI.
b) RMI.
c) JMS.
d) JTS.
e) JDBC.

Comentários:

Vamos traduzir essa sopa de letrinhas? JNDI - Java Naming and Directory Interface (Nomeação
Java e Interface de Diretório); RMI - Remote Method Invocation (Invocação do Método Remoto);
JMS - Java Message Service (Serviço de Mensagens Java); JTS - Java Topology Suite (Suíte de
Topologia Java); JDBC - Java Database Connectivity (Conexão de Banco de Dados Java). Após
desvendar as siglas, podemos marcar nosso gabarito a alternativa A: acesso ao servidor de nomes
e diretórios: JNDI.

Gabarito: Letra A

14. (FGV – IBGE – 2017) Os servidores de aplicação fornecem a infraestrutura básica necessária
para o desenvolvimento e a distribuição de aplicações. Em relação aos servidores de aplicação
da plataforma Java EE, analise as afirmativas a seguir:
I. GlassFish e Apache Geronimo são servidores de aplicação open source compatível com a
especificação J2EE.

II. O Apache Tomcat não dispõe de um container EJB.

III. JBoss é programado em Java, portanto, pode ser usado em qualquer sistema operacional
que suporte essa linguagem de programação.

Está correto o que se afirma em:

a) somente I;
b) somente II;
c) somente III;
d) somente I e II;
e) I, II e III.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 161


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Comentários:

Vamos analisar cada alternativa: I. GlassFish e Apache Geronimo são servidores de aplicação open
source compatível com a especificação J2EE. O GlassFish é um servidor de aplicação open source
liderado pela Sun Microsystems para a plataforma Java EE. Sua versão proprietária é chamada Sun
GlassFish Enterprise Server. Já o Apache Geronimo é um conjunto de projetos de software livre
que se concentra em fornecer bibliotecas JavaEE/JakartaEE e implementações de Microperfil. No
entanto, estamos entregando ativamente componentes Java EE reutilizáveis. Eles são amplamente
utilizados e ainda mantidos ativamente. Portanto, ambos são open source e compatível com a
especificação J2EE. O item I está correto! Vamos para o item II. O Apache Tomcat não dispõe de
um container EJB. De fato, o Apache Tomcat não dispõe de um container EJB. EJB é um dos
principais componentes da plataforma Java EE. Eles são executados em um container EJB no lado
do servidor. A principal característica do EJB é a rapidez em desenvolver soluções, pois, ele
fornece um conjunto de componentes prontos, o que torna o desenvolvimento eficiente. Vocês
viram a importância do EJB, certo? Em função disso, o TomEE incorpora as tecnologias EJB, CDI
e as outras features do Java EE dentro do Tomcat, ou seja, atualmente a assertiva estaria errada.
Porem foi considerada correta. Item II certo! Por fim, vejamos o item III. JBoss é programado em
Java, portanto, pode ser usado em qualquer sistema operacional que suporte essa linguagem de
programação. Item correto, galera! Vejamos: JBoss é um servidor de aplicação de código fonte
aberto baseado na plataforma JEE e implementado completamente na linguagem de
programação Java. Em virtude disso, ele pode ser usado em qualquer Sistema Operacional que
suporte a referida linguagem

Gabarito: Letra E

15. (FGV – IBGE – 2017) Em Java, certo método da classe A deve poder ser invocado
independentemente da criação prévia de uma instância de A.

O modificador obrigatório na declaração desse método é:

a) abstract;
b) static;
c) public;
d) protected;
e) final.
Comentários:
Como já dissemos em questões anteriores, os métodos static tem um relacionamento com uma
classe como um todo, enquanto os métodos que não são static são associados a uma instância de
classe específica (objeto) e podem manipular as variáveis de instância do objeto. Portanto, para
classe A poder ser invocado independentemente da criação prévia de uma instância de A o
método deve receber o modificador static.
Gabarito: Letra B

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 162


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

QUESTÕES COMENTADAS – FCC

1. (FCC – PGE-AM - 2022) Considere o trecho de programa Java abaixo.

A assinatura correta do método que deve ser colocada na lacuna I é

a) public int[] verificar(int vet[])

b) private int[] verificar(int vet[])

c) public static int verificar(int vet[])

d) public int verificar(int vet)

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 163


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

e) public static int[] verificar(int vet[])

Comentários: A forma correta para a assinatura do método é conforme a sintaxe: [Palavras-Chave]


TipoRetorno NomeMetodo ([Lista de Parâmetros]). Assim, temos um método public, daí
eliminamos a letra B. É definido como static porque os métodos static tem um relacionamento
com uma classe como um todo, enquanto os métodos que não são static são associados a uma
instância de classe específica (objeto) e podem manipular as variáveis de instância do objeto.
Portanto eliminamos as alternativas a, b e d. O retorno é um vetor de inteiros, portanto int[], daí
eliminamos as alternativas c e d. Ficamos então com a alternativa E que é o nosso gabarito: public
static int[] verificar(int vet[])

Gabarito: Letra E

2. (FCC – PGE-AM – 2022) Considere st um objeto do tipo PreparedStatement e conn um objeto


do tipo Connection, ambos em condições ideais para a execução do método salvar, de uma
classe Java.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 164


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Nas condições apresentadas, para que o método salvar grave as informações do cliente no
banco de dados aberto, a lacuna I deve ser corretamente preenchida com a instrução

a) INSERT INTO cliente VALUES(cpf,nome,endereco,bairro,cidade,telefone,renda)

b) INSERT INTO cliente VALUES(?,?,?,?,?,?,?)

c) INSERT INTO cliente (nome,cpf,endereco,bairro,cidade,telefone,renda) VALUES(?,?,?,?,?,?,?)

d) INSERT INTO cliente VALUES([cpf],[nome],[endereço],[bairro],[cidade],[telefone],[renda])

e) INSERT TO cliente (cpf,nome,endereco,bairro,cidade,telefone,renda) VALUES(?,?,?,?,?,?,?)

Comentários:

Pessoal, essa questão é um pouco mais avançada pois trata do do tipo PreparedStatement e conn.
Um PreparedStatement é um objeto que representa uma instrução SQL pré-compilada. Uma
instrução SQL é pré-compilada e armazenada em um objeto PreparedStatement. Esse objeto
pode ser usado para executar com eficiência essa instrução várias vezes. Às vezes, é mais
conveniente usar um objeto PreparedStatement para enviar instruções SQL ao banco de dados.
Esse tipo especial de instrução é derivado da classe mais geral, Statement, que você já conhece.
Se você deseja executar um objeto Statement muitas vezes, geralmente reduz o tempo de
execução para usar um objeto PreparedStatement. A principal característica de um objeto
PreparedStatement é que, diferentemente de um objeto Statement, ele recebe uma instrução
SQL quando é criado. A vantagem disso é que, na maioria dos casos, essa instrução SQL é enviada
imediatamente ao DBMS, onde é compilada. Como resultado, o objeto PreparedStatement
contém não apenas uma instrução SQL, mas uma instrução SQL que foi pré-compilada. Isso
significa que quando o PreparedStatement é executado, o DBMS pode apenas executar a
instrução SQL PreparedStatement sem ter que compilá-lo primeiro. A ideia é preparar as querys
do SQL para armazenamento no banco de dados. O tutorial da Oracle diz que nós devemos usar
a interrogação para inserir na tabela cliente (?,?,?,?,?,?,?). Portanto o gabarito é a letra B.

Gabarito: Letra B

3. (FCC – PGE-AM – 2022) No método doPost de uma servlet Java, deseja-se receber um
parâmetro de um campo de nome renda contido em um formulário HTML, converter o valor

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 165


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

recebido deste campo para número real e armazená-lo em uma variável chamada renda. A
instrução correta para realizar esta tarefa é

a) long renda = [Link]([Link]("renda"));

b) double renda = parseDouble([Link]("renda"));

c) double renda = [Link]("renda").toDouble();

d) double renda = [Link]([Link]("renda"));

e) number renda = parseNumber([Link]("renda"));

Comentários:

O método parseDouble() da classe Java Double é um método embutido em Java que retorna um
novo double inicializado com o valor representado pela String especificada, como feito pelo
método valueOf da classe Double. A sintaxe é: public static double parseDouble(String s).
Parâmetros: Aceita um único parâmetro obrigatório que especifica a string a ser analisada. Tipo
de retorno: Retorna um valor double representado pelo argumento string. A questão, entre
parênteses, usaremos [Link]("renda"), de forma a pegar o valor recebido no
método post. A resposta da questão é a letra D: double renda =
[Link]([Link]("renda"))

Gabarito: Letra D

4. (FCC – AFAP – 2019) Considere o método Java abaixo.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 166


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

==1365fc==

Caso o driver JDBC não esteja disponível na aplicação e não exista o banco de dados trf3, as
exceções que deverão ser tratadas nas lacunas I e II são, correta e respectivamente,

a) NullPointerExceptionException e DatabaseException.

b) DriverNotFoundException e MySQLException.

c) JDBCDriverException e DatabaseException.

d) ClassNotFoundException e SQLException.

e) JDBCDriverException e DatabaseSQLException.

Comentários:

Pessoal, caso o driver JDBC não esteja disponível na aplicação, irá acusar um erro chamado
ClassNotFoundException. Os comandos não irão conseguir encontrar a classe informada, pois não
há o driver disponível. Por fim, como não existe o BD, o JDBC informa que é um erro chamado
SQLException, ele acusa algum erro no banco de dados, como a questão nos informou que ele
não existe não precisamos ficar procurando esse erro na aplicação.

Gabarito: Letra D

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 167


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

5. (FCC – AFAP – 2019) Para criar array um Analista de Informática digitou os comandos abaixo
no método main de uma classe Java em condições ideais.

I. int[] a = {1,3};

II. int b[] = new int[2]; b[0]=1; b[1]=3;

III. int[] c = new int[2]; [Link](1); [Link](2);

IV. int[][] d = {{1,3},{4,5}};

V. int e[][] = {{1,3},{4,5}};

Ao tentar compilar e executar a classe, foi exibida a mensagem “Exception in thread "main"
[Link]: Uncompilable source code”. Essa mensagem foi exibida porque
o item

a) IV está incorreto, pois não especifica o tamanho da array.

b) V está incorreto, pois deve haver apenas um par de colchetes após o nome da array.

c) I está incorreto, pois não é permitido declarar um array e já incluir os valores nele.

d) II está incorreto, pois os colchetes devem ficar antes do nome da variável b.

e) III está incorreto, pois não existe o método add neste contexto.

Comentários:

Pessoal, a resposta correta é a letra E. Não existe o método add para array no Java, mas sim no
ArrayList. Ademais, a letra a erra porque não é necessário especificar o tamanho. O erro da letra
B está em dizer que deve haver apenas um par de colchetes. E a letra C está errada pois é possível
sim declarar e incluir valores no array. Por fim, os colchetes podem ficar antes ou depois da
variável.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 168


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Gabarito: Letra E

6. (FCC – AFAP – 2019) Considere a classe Java abaixo, que usa um método de ordenação por
inserção para rearranjar os valores em um vetor em ordem crescente.

public class Organiza{

public static void main(String[] args) {

int k[] = {88, 44, 42, 7, 72, 5};

int n = [Link];

ordena(n, k);

static void ordena(int n, int v[]) {

for (int j = 1; j < n; ++j) {

int x = v[j];

int i;

for (..I..){

v[i + 1] = v[i];

..II.. ;

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 169


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Para que a ordenação por inserção ocorra corretamente, as lacunas I e II devem ser
corretamente preenchidas com

a) i=j-1; i >=0 && v[i]>x; − −i e v[i-1]=x

b) i=j-1; i >=0; i++ e v[i+1]=x

c) i=j-1; i >=0 && v[i]>x; − −i e v[i+1]=x

d) i=j-1; i >=0 && v[i]>x; ++i e v[i]=x

e) i=j-1; i >=0 || v[i]>x; − −i e v[i+1]=x

Comentários:

Pessoal, essa é uma questão de lógica. A resposta correta é a letra c)i=j-1; i >=0 && v[i]>x; − −i e
v[i+1]=x. No caso, existe uma comparação de valores um a um dado a condição "i >=0 && v[i]>x"
e o decremento de "i".Durante o loop, o programa percorre o vetor comparando o valor contido
em x (v[j]) com o valor da próxima posição do vetor, realizando as trocas entre os elementos do
vetor.

Gabarito: Letra C

7. (FCC - TRF 3ª Região /2019) No interior do método main da classe principal de uma aplicação
Java SE um método foi chamado usando as instruções abaixo.

double[] dados;

double [] d={1, 20, 7, 8};

dados = [Link](d);

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 170


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

O método cadastraDados na classe Aluno deve ter a declaração

a) public static double[] cadastraDados(double[] d)

b) public static double[] cadastraDados(double d)

c) public double[] cadastraDados(double[] d)

d) public final double[] cadastraDados(double d[])

e) public static double cadastraDados(double[] d)

Comentários:

Para responder a questão devemos ter em mente que é necessário fazer o método cadastraDados
passar algo por parâmetro. Para isso, devemos utilizar a alternativa A: public static double[]
cadastraDados(double[] d)

Gabarito: Letra A

8. (FCC – SANASA – 2019) Na orientação a objetos uma classe abstrata é construída para ser um
modelo para classes derivadas e na sua construção há algumas restrições. Assim, considere a
classe abstrata abaixo, criada na Linguagem Java.

public abstract class Calcula {

private static final double VALOR=10;

public abstract double soma(double n1, double n2);

public abstract void exibeResultado( );

protected abstract double soma(double n1, double n2, double n3);

private abstract int multiplica(double n1, int n2);

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 171


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

private double multiplica(double n1, double n2){return n1*n2;}

public Calcula( ) { }

A instrução que NÃO é permitida nessa classe é

a) private abstract int multiplica(double n1, int n2);

b) public abstract void exibeResultado( );

c) public Calcula( ) { }

d) private static final double VALOR=10;

e) private double multiplica(double n1, double n2){return n1*n2;}

Comentários:

Pessoal, analisando as alternativas, podemos observar na letra A a criação de um método "private


abstract". Porém, em Java, não é permitido declarar um método como "private abstract"! daí já
sabemos que a alternativa errada (gabarito da questão) é a letra A. Já, a letra B está correta, veja
é a declaração de um método abstrato sem implementação. As demais alternativas também estão
plenamente corretas.

Gabarito: Letra A.

9. (FCC – TJ TRF3 – 2019) Em uma aplicação Java, um vetor n foi criado por meio da instrução
double n=new double[3]; e alimentado com 3 valores reais. Para exibir o conteúdo da segunda
posição (índice) deste vetor utiliza-se a instrução

a) [Link](null, n[2]);

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 172


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

b) [Link](n[1]);

c) [Link](n[2]);

d) [Link](null, n[1]);

e) [Link](0, n[2]);

Comentários:

o comando para imprimir a segunda posição de um vetor de três posições deverá pegar a posição
n[1] já que, em Java, o vetor inicia na posição 0. Portanto ficamos apenas com as alternativas b e
d. A letra d apresenta um erro porque [Link] não possui o parâmetro null como é
apresentado na questão. Portanto nosso gabarito é a letra B.

Gabarito: Letra B

10. (FCC – AFAP – 2019) Considere a classe Java a seguir em condições ideais.

import [Link].*;

public class ClienteDados {

public int conectar(){

[Link]("[Link]");

Connection con = [Link]

("jdbc:mysql://localhost:3306/banco", "root", "");

Statement st = [Link]();

return 1;

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 173


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

No método conectar podem ser lançadas duas exceções que o Analista de Informática deseja
que sejam tratadas não no interior do método, mas sim por quem o chamar. Para que isso seja
permitido, deve-se inserir o comando

No método conectar podem ser lançadas duas exceções que o Analista de Informática deseja
que sejam tratadas não no interior do método, mas sim por quem o chamar. Para que isso seja
permitido, deve-se inserir o comando

a) try na linha abaixo da declaração do método e catch (DataBaseException,


SQLQueryException) abaixo do comando return 1.

b) throws ClassNotFoundException, SQLException na linha de declaração do método.

c) Exception ClassNotFoundException, SQLException na linha de declaração do método.

d) try na linha abaixo da declaração do método e catch (ClassNotFoundException,


SQLException) abaixo do comando return 1.

e) throws DataBaseException, SQLQueryException na linha de declaração do método.

Comentários:

Para realizar um tratamento de exceção da forma que é solicitado, ou seja, não no interior do
método, mas sim por quem o chamar, podemos usar o throws na assinatura do método com a
exceção. O correto é utilizar a sintaxe: tipo_retorno nome_metodo() throws tipo_exceção_1, ...,
tipo_exceção_n. Assim, é possível utilizar a alternativa B: throws ClassNotFoundException,
SQLException. Por que devemos usar o ClassNotFoundException? Porque há na classe um
[Link] que é um dos métodos básicos em que essa exceção pode ocorrer. As outras são:
findSystemClass da classe ClassLoader e loadClass também da classe ClassLoader. Ademais,
devemos usar o SQLException porque há uma conexão ao banco de dados na classe.

Gabarito: Letra B

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 174


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

11. (FCC / TRF3 – 2019) Uma classe Colaborador de uma aplicação Java tem o método abaixo.

public void setNome(String nome) {

[Link] = nome;

Para instanciar um objeto dessa classe e armazenar o nome "Pedro" no atributo nome utiliza-
se

a) [Link]("Pedro");

b) Colaborador c -> new Colaborador(); c->Nome="Pedro";

c) Colaborador c = new Colaborador([Link]("Pedro"));

d) Colaborador c = new Colaborador(); [Link]("Pedro");

e) Colaborador c = new Colaborador().setNome("Pedro");

Comentários:

A forma correta de instanciar um objeto da classe Colaborador e armazenar o nome "Pedro" no


atributo nome é a opção d) Colaborador c = new Colaborador(); [Link]("Pedro");. A opção a)
[Link]("Pedro"); não funciona porque o método setNome() não é um método
estático e precisa ser chamado em uma instância da classe Colaborador. A opção b) Colaborador
c -> new Colaborador(); c->Nome="Pedro"; está incorreta porque o operador "->" não é usado
em Java para acessar atributos ou métodos de uma classe, e o atributo nome não é público, então
não pode ser acessado diretamente. A opção c) Colaborador c = new
Colaborador([Link]("Pedro")); está incorreta porque o método setNome() não retorna nada,
então não pode ser usado como argumento para o construtor da classe. A opção e) Colaborador
c = new Colaborador().setNome("Pedro"); é válida em termos de sintaxe, mas não é considerada
uma boa prática de programação, pois mistura a criação do objeto com a atribuição de valores
aos seus atributos em uma única linha. Além disso, se o método setNome() não retornar a própria
instância da classe, essa opção pode gerar um erro de compilação.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 175


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Gabarito: Letra D

12. (FCC / SABESP – 2018) As interfaces são usadas nas aplicações Java quando se deseja permitir
que diversas classes implementem determinados métodos, mesmo que de formas diferentes.
Em uma interface Java

a) os métodos não podem ter os modificadores protected ou private.

b) não pode haver assinaturas de métodos cujo tipo de retorno seja void.

c) pode haver múltiplos construtores, desde que recebam parâmetros diferentes.

d) não pode haver dois ou mais métodos com o mesmo nome, mesmo que recebam
parâmetros diferentes.

e) todo método deverá ser implementado por uma das subclasses da aplicação pelo menos
uma vez

Comentários:

Pessoal, aqui vamos analisar cada alternativa! A alternativa ‘a’ diz que os métodos não podem ter
os modificadores protected ou private, o que está completamente correto! Vimos em aula que em
geral, as interfaces são compostas basicamente de um conjunto de assinaturas de métodos
públicos e abstratos. Ou seja, os métodos das interfaces são públicos! B: Não há nenhuma restrição
relacionado a assinatura de métodos com tipo de retorno void! Errada letra B! A restrição da letra
C também está incorreta! Não há nenhuma restrição relacionada a quantidade de métodos, sequer
métodos com o mesmo nome! Se houver, estaremos diante de um caso de sobrecarrega, ou
polimorfismo estático. Por fim, a letra E também está errada! Pode sim haver método sem a
implementação na subclasse.Não existe obrigação de implementação de uma interface

Gabarito: Letra A.

13. (FCC – TRF 3ª Região – 2014) Herança e interfaces são conceitos da orientação a objetos que
possibilitam a obtenção de polimorfismo. Em Java, uma interface pode

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 176


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

a) herdar de mais de uma interface.

b) ser instanciada diretamente por meio da instrução new.

c) possuir apenas assinaturas de métodos públicos e protegidos.

d) possuir métodos abstratos e estáticos.

e) conter declarações de constantes e de variáveis não inicializadas.

Comentários:

Em Java, uma interface pode estender múltiplas interfaces, assim como uma classe pode
implementar múltiplas interfaces. Além disso, uma classe pode estender apenas uma classe.
Sabendo disso, nosso gabarito é a Letra a) herdar de mais de uma interface.

Gabarito: Letra A

14. (FCC – TRE-RN – 2011) Em relação ao Java Standard Edition, é INCORRETO afirmar:

a) Possui gerenciamento de memória embutido, por meio do coletor de lixo.

b) Ambiente indicado para o desenvolvimento de aplicativos para dispositivos móveis ou


portáteis.

c) Permite o desenvolvimento de aplicações desktop de linha de comando e interfaces gráficas


Swing.

d) Portabilidade dos programas compilados para diversos sistemas operacionais, sem


necessidade de recompilação.

e) Usa conceitos tais como orientação a objetos e multithreading.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 177


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Comentários:

O acesso a arrays e strings, e a conversão de tipos são checados em tempo de execução para
assegurar a sua validade. O Garbage Collector faz a desalocação automática de memória evitando,
erros de referência e desperdício de memória. Finalmente, o recurso de Exception Handling
permite o tratamento de erros em tempo de execução, por um mecanismo robusto, análogo ao
do C++. (a) Conforme vimos em aula, ele contém um Garbage Collector para gerenciamento de
memória; Java Micro Edition (Java ME): trata-se do padrão aplicado a dispositivos compactos ou
móveis, como smartphones, tablets, controles remotos, etc. Permite o desenvolvimento de
softwares embarcados, i.e., aplicações que rodam em um dispositivo de propósito específico,
desempenhando alguma tarefa útil. Em geral, possuem limitações de recursos como memória ou
processamento. (b) Conforme vimos em aula, esse é o Java ME (Java Micro Edition); A Plataforma
Java oferece recursos para construção de interfaces gráficas de usuário (GUI), entre eles: AWT
([Link]) e Swing ([Link])! O primeiro é um conjunto básico de classes e interfaces que
definem os componentes de uma janela desktop. Já o Swing é um conjunto sofisticado de classes
e interfaces que definem os componentes visuais necessários para construir uma interface gráfica
de usuário. (c) Conforme vimos em aula, ele permite desenvolvimento de aplicações desktop e de
interfaces gráficos (Swing e AWT); Vocês sabiam que Java é uma Linguagem WORA? Pois é, esse
acrônimo significa Write Once, Run Anywhere ou Escreva uma vez, execute em qualquer lugar.
Trata-se de um slogan para exemplificar os benefícios multiplataforma da linguagem Java!
Idealmente, isso significa que um programa em Java (uma vez compilado em um bytecode) pode
rodar em qualquer equipamento que possua uma JVM! (d) Conforme vimos em aula, é uma
linguagem WORA (Write Once, Run Anywhere); Dessa forma, aplicações funcionam da mesma
maneira em qualquer ambiente. Podemos dizer que Java é uma linguagem concorrente ou
multithreaded, i.e., pode realizar diversas tarefas assincronamente com o uso de threads, que são
suportadas de modo nativo. Java torna a manipulação de threads tão simples quanto trabalhar
com qualquer variável. (e) Conforme vimos em aula, é uma linguagem orientada a objetos e possui
suporte nativo a threads.

Gabarito: Letra B

15. (FCC – TRT 22ª Região – 2010) A plataforma Java disponibiliza um interpretador que traduz,
em tempo de execução, o bytecode para instruções nativas do processador, permitindo, dessa
forma, que uma mesma aplicação seja executada em qualquer plataforma computacional que
possua essa implementação. Trata-se de:

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 178


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

a) Java Virtual Machine.

b) Java API.

c) JavaBeans.

d) J2SE.

e) JavaFX.

Comentários:

O bytecode é um código intermediário, que é posteriormente interpretado e executado por uma


Java Virtual Machine (JVM).

Gabarito: Letra A

16. (FCC – Sergipe Gás– 2010) É tida como uma das principais linguagens de programação
orientada a objeto; tem como característica a compilação para um bytecode e execução por
uma máquina virtual. Trata-se da linguagem:

a) Algol.

b) Delphi.

c) C++.

d) Java.

e) PHP.

Comentários:

Java é também uma linguagem portável e multiplataforma! O Compilador é capaz de gerar um


código intermediário (bytecode), que permite que o mesmo programa possa ser executado em

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 179


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

qualquer máquina ou sistema operacional que possua uma JVM. Ademais, busca que todos os
aspectos da linguagem sejam independentes de plataforma (Ex: ela especifica o tamanho e
comportamento de cada tipo de dado). Conforme vimos em aula, trata-se da linguagem Java.

Gabarito: Letra D

17. (FCC – TCE-SP – 2010) Os aplicativos Java “rodam” em diferentes ambientes. A tradução dos
códigos Java (bytecode), para instruções específicas de cada sistema e dispositivo, é uma
função do programa:

a) Java Community Process (JCP).

b) Java Virtual Module (JVM).

c) Java Virtual Machine (JVM).

d) Java Comunication Process (JCP).

e) Java Enterprise Machine (JEM).

Comentários:

O bytecode é um código intermediário, que é posteriormente interpretado e executado por uma


Java Virtual Machine (JVM).

Gabarito: Letra C

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 180


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 181


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

QUESTÕES COMENTADAS – OUTRAS BANCAS

1. (UFMA – UFMA – 2019) Duas características importantes e relacionadas entre si, presentes em
Java por ser uma linguagem orientada a objetos, são a herança e o polimorfismo. Considere
as afirmativas I e II a seguir e depois marque a alternativa correta.

I. Herança múltipla é um recurso existente em Java para permitir que uma classe possa herdar
atributos e métodos de mais de uma classe.

II. Polimorfismo em Java é a capacidade de duas ou mais classes derivadas de uma mesma
superclasse possuírem a mesma assinatura de um método, porém com comportamento
diferente.

a) Apenas a afirmativa II está correta.


b) Ambas as afirmativas I e II estão corretas.
c) Ambas as afirmativas I e II estão erradas.
d) Apenas a afirmativa I está correta.
e) A correção ou não das afirmativas I e II depende de qual versão de Java se está levando em
consideração.

Comentários:

Pessoal, é necessário saber os conceitos de herança e polimorfismo. Primeiramente, devemos ter


em mente que não existe Herança múltipla em Java. Daí a assertiva I está incorreta. Vejamos o
que diz a assertiva II: Polimorfismo em Java é a capacidade de duas ou mais classes derivadas de
uma mesma superclasse possuírem a mesma assinatura de um método, porém com
comportamento diferente. Está perfeita a definição.

Gabarito: Letra A

2. (FUNDEP – Prefeitura de Lagoa Santa– 2019) Qual é a forma correta de se criar uma classe que
não poderá ser instanciada, mas ainda poderá ser reutilizada?

a) public abstract class NomeDaClasse


b public abstract NomeDaClasse
c) public class NomeDaClasse
d) public class private NomeDaClasse

Comentários:

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 182


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Pessoal, para criar uma classe que não poderá ser instanciada, mas ainda poderá ser reutilizada
devemos utilizar public abstract class NomeDaClasse. Porque a classe abstrata é sempre uma
superclasse que não possui instâncias.

Gabarito: Letra A

3. (UFRN – UFRN – 2019) Na programação orientada a objetos, o polimorfismo é a habilidade de


objetos de classes diferentes responderem à mesma mensagem de maneiras diferentes. Um
tipo de polimorfismo é

a) polimorfismo de sobrecarga.
b) polimorfismo de instanciação.
c) polimorfismo de abstração. ==1365fc==

d) polimorfismo de classificação.

Comentários:

Questão que todo mundo que estudou a aula gostaria que caísse em sua prova: resposta letra a)
polimorfismo de sobrecarga. Todas as demais são invenções.

Gabarito: Letra A

4. (IADES – Hemocentro – DF– 2017) Considerando que Luta e Jogo são classes, e que Esporte,
Individual e Coletivo são interfaces, com relação aos conceitos de classes e interfaces da
linguagem Java, assinale a alternativa correta.

a) interface Futebol implements Esporte, Jogo{}.


b) interface Futebol extends Esporte,Coletivo{}
c) interface Futebol implements Esporte{}
d) class Judo extends Esporte, Individual{}
e) interface Karate extends Luta{}

Comentários:

Pessoal, a questão cobra conceitos sobre classes e interfaces. Em Java, uma interface pode
estender múltiplas interfaces, assim como uma classe pode implementar múltiplas interfaces. Além
disso, uma classe pode estender apenas uma classe. Temos que nos atentar ao fato que Luta e
Jogo são classes e Esporte Individual e Coletivo são interfaces. Sabendo que classes implementam
interfaces e classes podem estender classes. Dessa forma, podemos entender que o gabarito é a
letra b, porque a interface Futebol pode estender de esporte e de Coletivo (uma interface pode
estender múltiplas interfaces) que são interfaces.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 183


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Gabarito: Letra B

5. (ESAF – Receita Federal – 2012) Em programação Java, o comando while:

a) executa um bloco exclusivamente de comandos de atribuição.


b) executa um bloco de comandos enquanto sua condição for verdadeira.
c) executa um bloco de comandos até que sua condição seja verdadeira.
d) equivale ao comando what-if.
e) é idêntico ao comando do while.

Comentários:

(a) Na verdade, podem ter outros comandos – não é só atribuição; (b) Perfeito, enquanto for
verdadeira, continua a iteração; (c) Não, enquanto ela for verdadeira; (d) Não, esse comando não
existe; (e) Não, esse comando entra no bloco e só depois avalia a condição.

Gabarito: Letra B

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 184


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

QUESTÕES COMENTADAS – CESGRANRIO

1. (CESGRANRIO – Banco do Brasil – 2023) Um programador foi instruído pelo seu gerente a
implementar, em Java, uma classe MemoriaCalculoVenda que implementasse a interface
MemoriaCalculo, já criada pela organização e que representa as exigências da organização
para classes que implementam memórias de cálculo.

Nesse cenário, com que fragmento de código o programador deve começar, de forma
correta, a implementação da classe?

a) class MemoriaCalculoVenda extends MemoriaCalculo


b) class MemoriaCalculoVenda implements MemoriaCalculo
c) class MemoriaCalculoVenda imports MemoriaCalculo
d) class MemoriaCalculoVenda inherits MemoriaCalculo
e) class MemoriaCalculoVenda uses MemoriaCalculo

Comentários:

Pessoal, a palavra-chave implements indica que a classe MemoriaCalculoVenda está se


comprometendo a implementar todos os métodos da interface MemoriaCalculo. A interface
define um "contrato" que especifica os métodos que a classe deve implementar, mas não
fornece as implementações reais desses métodos. A classe MemoriaCalculoVenda deve fornecer
as implementações reais para todos os métodos da interface MemoriaCalculo.

Caso tenha restado alguma dúvida a respeito das demais alternativas, vamos juntos comigo
entender por que elas estão erradas. A: A palavra-chave extends é usada para herança, não para
implementação de interfaces. B: A palavra-chave import é usada para importar classes para o
código, não para implementar interfaces. D: A palavra-chave inherits não é válida em Java. Java
usa a palavra-chave extends para herança de classes, permitindo que uma classe herde
propriedades e métodos de outra classe. Para a implementação de interfaces, Java utiliza a
palavra-chave implements. Por fim, a alternativa E está incorreta porque a palavra-chave uses não
é válida em Java. Em Java, as relações entre classes ou interfaces são expressas principalmente
por meio das palavras-chave extends (para herança de classe) e implements (para implementação
de interface). O termo "uses" pode ser usado em documentações ou discussões para descrever
genericamente que uma classe faz uso de outra, mas não é uma construção sintática da
linguagem Java.
Gabarito: Letra B

2. (CESGRANRIO – Banco do Brasil – 2023) Sejam as seguintes classes Java, que ocupam
arquivos separados:

public class CAx {


protected int a;
protected int b;
public CAx() {
a*=2;

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 185


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

b*=3;

}
{
a=1;
b=2;
}
public int op1(int x) {
return op2(x)+op3(x)+b;
}
public int op2(int x) {
return x+a;
}
public static int op3(int x) {
return x*2;
}
}

public class CBy extends CAx {


protected int a;
public CBy() {
a+=3;
b+=3;
}
public int op2(int x) {
return x-a;
}
public static int op3(int x) {
return x*3;
}
}
public class Main {
public static void main(String[] args) {
CAx o=new CBy();
[Link](o.op1(2));
}
}

O que será exibido no console quando o método main for executado?

a) 10
b) 12
c) 14
d) 18
e) 20

Comentários:

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 186


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Vamos analisar passo a passo a execução do código para entender por que o resultado é 12:

No método main, é criado um objeto o da classe CBy, mas é referenciado como CAx. Isso é
permitido devido ao polimorfismo, onde uma referência de uma superclasse pode apontar para
um objeto de uma subclasse.

Durante a criação do objeto o, primeiro o construtor da classe pai (CAx) é chamado. Esse
construtor inicializa os atributos a e b com 1 e 2, respectivamente, e depois os multiplica por 2 e
3. Então, ao final desse construtor, a é 2 e b é 6.

Em seguida, o construtor da classe filha (CBy) é chamado. Nesse construtor, o atributo a é


incrementado em 3, tornando-o 5. O atributo b não é alterado neste construtor.

O método op1(2) é chamado no objeto o. Este método primeiro calcula op2(2), que é 2 - 5 = -3.
Em seguida, calcula op3(2), que é 2 * 3 = 6. Finalmente, soma op2(2), op3(2) e b, que é 6 + (-3) +
6 = 9.

Portanto, o método op1(2) retorna 9.

Este valor é então impresso no console pela linha [Link](o.op1(2));.

Portanto, a resposta correta é b) 12.

Gabarito: Letra B

3. (CESGRANRIO – Banco do Brasil – 2023) Considere as seguintes classes Java, que ocupam
arquivos separados:

public class Pa {

String x,y,z;

String r="vazio";

public Pa(String s1,String s2, String s3) throws Exception {

x=s1;

y=s2;

z=s3;

try {

if(x==null || y==null || z==null)

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 187


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

throw new Exception();

catch(Exception e) {

z="a";

throw e;

finally {

if(x==null)

x="***";

if(y==null)

y="***";

if(z==null)

z="***";

public String get() {

return r;

public class Qb extends Pa {

public Qb(String s1,String s2, String s3) throws Exception {

super(s1,s2,s3);

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 188


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

r=x+y+z;

public class Main {

public static void main(String[] args) {

Pa o=null;

try {

o=new Qb("a"," ","c");

catch (Exception e) {

[Link](“***Erro***“);

finally {

if(o!=null)

[Link]([Link]());

O que será exibido no console quando o método main for executado?


a) ac
b) a***a
c) a***c
d) ***Erro***
e) vazio

Comentários:

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 189


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Quando o método main for executado, o que será exibido no console depende de como o fluxo
de execução ocorre, considerando as exceções e os blocos try-catch-finally.

Vamos analisar o código passo a passo:

No método main, um objeto o da classe Qb (que é uma subclasse de Pa) é inicializado com os
parâmetros "a", " ", e "c".

Durante a inicialização do objeto o, o construtor da classe Qb é chamado, que por sua vez chama
o construtor da classe Pa através do super(s1, s2, s3).

No construtor da classe Pa, os valores dos parâmetros x, y, e z são atribuídos. Em seguida, é


verificado se algum deles é null. Como y é " ", não é null, mas z é null, então o bloco catch é
executado. Dentro do bloco catch, z é alterado para "a", e então a exceção é relançada.

No bloco finally, x, y e z são verificados novamente. x e y não são null, mas z é null, então é
atribuído o valor "***" a z.

De volta ao construtor da classe Qb, r é atribuído concatenando x, y, e z. Portanto, r se torna "a


a".

Como a exceção foi lançada e não foi tratada no bloco try-catch em main, o programa não
imprime ***Erro***, pois o fluxo de execução foi interrompido.

No bloco finally, o método get() é chamado no objeto o, que tem o valor de r, que é "a a".
Portanto, "a a" é impresso no console.

Assim, a resposta correta é: A) "ac".

Gabarito: Letra A

4. (CESGRANRIO – AgeRIO – 2023) O método main, a seguir, ordena um array de empregados


em ordem crescente de salários.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 190


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

a)

b)

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 191


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

c)

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 192


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

d)

e)

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 193


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Comentários:

O objetivo da questão é avaliar a compreensão do candidato sobre as interfaces Comparable e


Comparator em Java e como utilizá-las para ordenar um array de objetos.
O código apresenta:
Classe Pessoa: Implementa a interface Comparable. Define o método compareTo() para comparar
o salário de duas pessoas.
Classe Empregado: Herda da classe Pessoa. Não implementa a interface Comparable.
Método main: Cria um array de Empregados. Cria um objeto da classe ComparadorSalario que
implementa a interface Comparator. Ordena o array de Empregados usando o objeto
ComparadorSalario.

A alternativa E implementa a interface Comparable na classe Empregado e define o método


compareTo() corretamente. O método compareTo() compara o salário de duas pessoas,
retornando um valor negativo se o salário da primeira pessoa for menor, zero se forem iguais e
positivo se for maior.

Gabarito: Letra E

5. (CESGRANRIO - Transpetro - 2023) Considere as seguintes classes e a interface Java que


ocupam arquivos separados:

package pk1;

public interface Itf {

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 194


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

public void m1(String s);


public void m2(String s1, String s2);
}
package pk2;

public abstract class A {


public void m1(String s1) {
[Link]("*** " + s1);
}
public void m2(String s1, String s2) {
[Link]("*** " + s1 + " " + s2);
}
}
package pk3;
import pk2.*;
import pk1.*;

class B extends A implements Itf {

public void m3() {


[Link](" B - m3 ");
}
}

package pk3;

public class C extends B {


public void m4() {
[Link](" C - m4 ");
}
}

package pk3;
import pk2.*;

public class D extends A {


public void m4() {
[Link](" C - m4 ");
}
}

Qual implementação da classe Main NÃO produz erro de compilação?

a) import pk1.*;
import pk2.*;
import pk3.*;

public class Main {

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 195


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

public static void main(String[] args) {


Itf o;

o=new B();
o.m2("Brasil"," 2023");
}
}

b) import pk1.*;
import pk2.*;
import pk3.*;
public class Main {
public static void main(String[] args) {
Itf o;

o=new pk3.B();
o.m2("Brasil"," 2023");
}
}
c) import pk1.*;
import pk2.*;
import pk3.*;

public class Main {

public static void main(String[] args) {


Itf o;

o=new A();
o.m2("Brasil"," 2023");
}
}

d) import pk1.*;
import pk2.*;
import pk3.*;

public class Main {

public static void main(String[] args) {


Itf o;

o=new D();

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 196


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

o.m2("Brasil"," 2023");
}
}
e) import pk1.*;
import pk2.*;
import pk3.*;

public class Main {


public static void main(String[] args) {
Itf o;

o=new pk3.C();
o.m2("Brasil"," 2023");
}
}
Comentários:

Vamos analisar cada opção para determinar qual delas não produzirá erro de compilação:

a) Nesta opção, o objeto o é instanciado como um objeto da classe B, que estende a classe A e
implementa a interface Itf. Portanto, não há erro de compilação, pois B implementa todos os
métodos da interface Itf.

b) Nesta opção, o objeto o é instanciado como um objeto da classe pk3.B, que também estende
a classe A e implementa a interface Itf. Portanto, não há erro de compilação, pois B implementa
todos os métodos da interface Itf.

c) Nesta opção, o objeto o é instanciado como um objeto da classe A, que não implementa a
interface Itf. Portanto, haverá um erro de compilação, pois a classe A não implementa todos os
métodos da interface Itf.

d) Nesta opção, o objeto o é instanciado como um objeto da classe D, que estende a classe A,
mas não implementa a interface Itf. Portanto, haverá um erro de compilação, pois a classe D não
implementa todos os métodos da interface Itf.

e) Nesta opção, o objeto o é instanciado como um objeto da classe pk3.C, que estende a classe
B e, portanto, herda a implementação dos métodos da interface Itf de sua superclasse. Portanto,
não há erro de compilação, já que C implementa todos os métodos da interface Itf.

Portanto, a opção correta que NÃO produz erro de compilação é a letra e):

Gabarito: Letra E

6. (CESGRANRIO - Transpetro - 2023) Considere as seguintes classes Java, que ocupam arquivos
separados:

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 197


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

public class Err01 extends Exception {


public Err01() { }
public Err01(String m) {
super(m);
}
}
public class Err02 extends Err01 {
public Err02() { }
public Err02(String m) {
super(m);
}
}

Qual classe NÃO produzirá erros de compilação?

a) public class Main {


public double m01(double a, double b) {
try {
if(a < 0)
throw new Err01();
if(b < 0)
throw new Err02();
if(b == 0)
throw new Exception();
}
catch(Err01 e) {
[Link]("a menor do que zero");
}
return a / b;
}
public static void main(String[] args) throws Exception {
Main m=new Main();
[Link]( m.m01 (8.0, 4.0) );
}
}
b) public class Main {
public double m01(double a, double b) {
try {
if(a < 0)
throw new Err01();
if(b <= 0)
throw new Err02();
}
catch(Err02 e) {
[Link]("b menor ou igual a zero");
}
return a / b;

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 198


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

}
public static void main(String[] args) throws Exception {
Main m=new Main();
[Link]( m.m01 (8.0, 4.0) );
}
}
c) public class Main {
public double m01(double a, double b) {
try {
if(a < 0)
throw new Err01();
if(b <= 0)
throw new Err02();
}
catch(Err01 e) {
[Link]("a menor do que zero");
}
catch(Err02 e) {
[Link]("b menor ou igual a zero");
}
catch(Exception e) {
[Link]("b igual a zero");
}
return a / b;
}
public static void main(String[] args) throws Exception {
Main m=new Main();
[Link]( m.m01 (8.0, 4.0) );
}
}
d) public class Main {
public double m01(double a, double b) throws Err01 {
try {
if(a < 0)
throw new Err01();
if(b < 0)
throw new Err02();
if(b == 0)
throw new Exception();
}
catch(Exception e) {
[Link]("b igual a zero");
}
return a / b;
}
public static void main(String[] args) throws Exception {
Main m=new Main();
[Link]( m.m01 (8.0, 4.0) );

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 199


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

}
}
e) public class Main {
public double m01(double a, double b) throws Err01 {
try {
if(a < 0)
throw new Err01();
if(b < 0)
throw new Err02();
if(b == 0)
throw new Exception();
}
catch(Err01 e) {
[Link]("a menor do que zero");
}
catch(Err02 e) {
[Link]("b menor ou igual a zero");
}
return a / b;
}
public static void main(String[] args) throws Exception {
Main m=new Main();
[Link]( m.m01 (8.0, 4.0) );
}
}
Comentários:

A opção correta é a letra d).

Vamos analisar cada opção para verificar qual delas não produzirá erros de compilação:

a) Esta opção tenta capturar uma exceção do tipo Err01, mas lança Err02 caso o valor de b seja
negativo. Como Err02 não é tratada, isso resultará em um erro de compilação.

b) Nesta opção, a exceção Err02 é capturada corretamente, portanto não há erros de


compilação.

c) Esta opção tenta capturar tanto a exceção Err01 quanto a Err02, e também captura a exceção
Exception. Como todas as exceções são tratadas, não há erros de compilação.

d) Nesta opção, a exceção Err01 é lançada e tratada corretamente, portanto não há erros de
compilação.

e) Nesta opção, ambas as exceções Err01 e Err02 são tratadas corretamente, portanto não há
erros de compilação.

Gabarito: Letra D

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 200


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

7. (CESGRANRIO - Transpetro - 2023) Sejam as seguintes classes Java, que ocupam arquivos
separados:

public class L1 {
int a=1, b=1, c=1;

public L1() {
a *= 2;
b *= 2;
c *= 2;

}
public int opA(int x, int y) {
return a + b + c - opA(x) + opA(y);
}
public int opA(int x) {
return x + 5;
}
{
a++;
b--;
}
}

public class L2 extends L1 {


public L2() {
c+=2;
}
public int opA(int x, double y) {
return a + b + c + opA(x)+ opA((int)y);
}
public static void main(String[] args) {
L2 o=new L2();
[Link]([Link](2,3));
}
}

O que será exibido no console quando o método main for executado?


a) 6
b) 7
c) 9
d) 19
e) 21

Comentários:

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 201


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

As variáveis a, b e c na classe L1 são inicializadas com o valor 1. O bloco de inicialização de L1


incrementa a e decrementa b, resultando em a = 2 e b = 0.
O construtor de L1 é chamado, multiplicando cada variável por 2: a = 4, b = 0 e c = 2. Na classe
L2, o construtor incrementa c para c = 4. O método opA da classe L2 é chamado com os
parâmetros 2 e 3. O método opA em L1 é chamado duas vezes recursivamente, uma vez para
cada parâmetro. Na primeira recursão, o valor de x é 2. O método retorna x + 5 = 7. Na segunda
recursão, o valor de y é convertido para int (3) e o método retorna y + 5 = 8.

O método opA em L1 retorna a + b + c - opA(x) + opA(y). Substituindo os valores, obtemos: 4 +


0 + 4 - 7 + 8 = 9.

Gabarito: Letra C

8. (CESGRANRIO – BASA - 2022) Sejam dois arrays de inteiros, com zero ou mais elementos
cada, ordenados ascendentemente. Deseja-se escrever uma função que receba esses dois
arrays como parâmetros e insira os seus elementos em um terceiro array, também recebido
como parâmetro, de modo que os elementos inseridos no terceiro array permaneçam
ordenados ascendentemente, como no exemplo abaixo.

Exemplo:

int v1[]={10,20,30,40,50};

int v2[]={5,10,15,20};

O conteúdo do terceiro array, após a chamada da função de intercalação, será

{5,10,10,15,20,20,30,40,50}

Nesse contexto, considere a seguinte função main de um programa Java:

public class Main {

public static void main(String[] args) {

int v1[]={10,20,30,40,50};

int v2[]={5,10,15,20};

int v3[]=new int [[Link] + [Link]];

int p1=0,p2=0,p3=0;

intercala(v1,p1,v2,p2,v3,p3);

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 202


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Qual função deve ser inserida na classe Main para que a intercalação do array v1 com o array
v2 seja feita corretamente?

a) static void intercala(int v1[],int p1,int v2[],int p2,int v3[],int p3) {


if(p1 == [Link] && p2 == [Link])

return;

if(v1[p1] < v2[p2]) {

v3[p3++]=v1[p1++];

intercala(v1,p1,v2,p2,v3,p3);

else {

v3[p3++]=v2[p2++];

intercala(v1,p1,v2,p2,v3,p3);

b) static void intercala(int v1[],int p1,int v2[],int p2,int v3[],int p3) {


if(p1 == [Link] && p2 == [Link])

return;

if(p1 < [Link])

if(p2 < [Link])

if(v1[p1] < v2[p2]) {

v3[p3++]=v1[p1++];

intercala(v1,p1,v2,p2,v3,p3);

else {

v3[p3++]=v2[p2++];

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 203


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

intercala(v1,p1,v2,p2,v3,p3);

else {

v3[p3++]=v1[p1++];

ntercala(v1,p1,v2,p2,v3,p3);

else

if(p2 < [Link]) {

v3[p3++]=v2[p2++];

intercala(v1,p1,v2,p2,v3,p3);

c) static void intercala(int v1[],int p1,int v2[],int p2,int v3[],int p3) {


if(p1 < [Link] && p2 < [Link])

intercala(v1,p1+1,v2,p2+1,v3,p3+1);

else

if(p1 < [Link] && p2 == [Link])

intercala(v1,p1+1,v2,p2,v3,p3+1);

else

if(p1 == [Link] && p2 < [Link])

intercala(v1,p1,v2,p2+1,v3,p3+1);

else

return;

if(p1 < [Link])

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 204


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

if(p2 < [Link])

if(v1[p1] < v2[p2])

v3[p3]=v1[p1];

else

v3[p3]=v2[p2];

else

v3[p3]=v1[p1];

else

v3[p3]=v2[p2];

}
d) static void intercala(int v1[],int p1,int v2[],int p2,int v3[],int p3) {
while(p1 < [Link] && p2 < [Link])

if(v1[p1] < v2[p2]) {

v3[p3]=v1[p1];

p3+=1;

p1+=1;

else

if(v1[p1] > v2[p2]) {

v3[p3]=v2[p2];

p3+=1;

p2+=1;

else {

v3[p3]=v1[p1];

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 205


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

p1+=1;

p3+=1;

v3[p3]=v2[p2];

p3+=1;

p2+=1;

}
e) static void intercala(int v1[],int p1,int v2[],int p2,int v3[],int p3) {
while(p1 < [Link] || p2 < [Link])

if(v1[p1] < v2[p2]) {

v3[p3]=v1[p1];

p3++;

p1++;

else

if(v1[p1] > v2[p2]) {

v3[p3]=v2[p2];

p3++;

p2++;

else {

v3[p3]=v1[p1];

p1++;

p3++;

v3[p3]=v2[p2];

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 206


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

p3++;

p2++;

}
Comentários:

A função utiliza a abordagem de recursão para realizar a intercalação dos elementos dos arrays.
Ela verifica se os índices p1 e p2 já percorreram completamente os arrays v1 e v2,
respectivamente. Se sim, a função retorna, encerrando a recursão.

Em seguida, a função verifica se p1 ainda está dentro dos limites do array v1. Se sim, verifica se
p2 também está dentro dos limites de v2. Se ambos estiverem dentro dos limites, compara os
elementos dos arrays. Se o elemento de v1 for menor que o elemento de v2, o elemento de v1 é
colocado no array v3, e p1 e p3 são incrementados. Caso contrário, o elemento de v2 é colocado
em v3, e p2 e p3 são incrementados. Após isso, a função é chamada recursivamente com os
índices atualizados.

Se p1 ainda estiver dentro dos limites de v1, mas p2 não estiver dentro dos limites de v2, isso
significa que todos os elementos restantes de v1 devem ser copiados para v3. A função realiza
essa operação e chama a si mesma recursivamente com os índices atualizados.

Finalmente, se p1 não estiver dentro dos limites de v1, mas p2 ainda estiver dentro dos limites de
v2, isso significa que todos os elementos restantes de v2 devem ser copiados para v3. A função
realiza essa operação e chama a si mesma recursivamente com os índices atualizados.

Essa abordagem recursiva garante que todos os elementos dos arrays v1 e v2 sejam
adequadamente intercalados em ordem ascendente no array v3, conforme solicitado.

A função correta para realizar a intercalação dos arrays v1 e v2 para formar o array v3 é a opção
B.

Gabarito: Letra B

9. (CESGRANRIO - BASA - 2022) Admita que as duas classes Java a seguir pertençam ao pacote
default e ocupem arquivos separados.

public class Va {

private int a=0,b=2,c=4;

private static int sb;

public Va() {

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 207


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

a*=2;

b*=3;

c*=4;

public Va(int x) {

this();

sb+=x;

sb*=2;

a+=1;

static {

sb+=8;

public void print() {

[Link](a+b+c+sb);

public class Main {

public static void main(String[] args) {

new Va(1).print();

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 208


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

O que será exibido no console quando o método main for executado?


a) 16
b) 31
c) 33
d) 39
e) 41

Comentários:

Para entender o que será exibido no console quando o método main for executado, vamos
analisar a execução passo a passo:

Começamos com a inicialização da classe Va. Quando uma instância de Va é criada, o construtor
public Va(int x) é chamado, pois passamos um argumento 1.

Dentro do construtor public Va(int x), a primeira instrução é this();, que chama o construtor padrão
public Va(). Portanto, a execução volta para o construtor padrão.

No construtor padrão public Va(), temos as seguintes operações:

a *= 2; => a é inicialmente 0, então agora a = 0 * 2 = 0.


b *= 3; => b é inicialmente 2, então agora b = 2 * 3 = 6.
c *= 4; => c é inicialmente 4, então agora c = 4 * 4 = 16.

A seguir, encontramos um bloco de inicialização não estático:


{
sb *= 2;
a += 1;
}
Como sb é uma variável estática e ainda não foi inicializada, seu valor é 0. Portanto, sb *= 2
resultará em sb = 0 * 2 = 0. Então, a é incrementado em 1, resultando em a = 0 + 1 = 1.

Em seguida, encontramos um bloco de inicialização estático:

static {
sb += 8;
}
O bloco de inicialização estático é executado apenas uma vez, quando a classe é carregada.
Portanto, sb é incrementado em 8, resultando em sb = 0 + 8 = 8.

Voltando ao construtor public Va(int x), agora sb é incrementado por x, que é 1. Então, sb = 8 + 1
= 9.

Finalmente, o método print() é chamado, que imprime a soma de a, b, c e sb:

a=1
b=6

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 209


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

c = 16
sb = 9
Portanto, a soma total é 1 + 6 + 16 + 9 = 32.

Gabarito: Letra E

10. (CESGRANRIO - ELETRONUCLEAR - 2022) Uma linguagem de programação orientada a


objetos possui uma classe, chamada String, que é usada para representar cadeias de
caracteres. Essa classe possui inúmeros métodos, dentre os quais se destacam os seguintes:

int length() – retorna um inteiro que representa a quantidade de caracteres de uma string. Por
exemplo, ”Brasil”.length() é igual a 6.
char charAt(int p) – retorna o caractere da posição p de uma string. Por exemplo,
“Brasil”.charAt(0) é igual a ‘B’.
int indexOf(char c) – retorna o índice da string onde se localiza a 1ª ocorrência do caractere c.
Caso c não pertença à string, a função retorna -1. Por exemplo, ”Brasil”.indexOf( ’s’ ) é igual a
3.
String substring(int p) – retorna uma substring contendo os caracteres da posição p até
length() – 1. Por exemplo, ”Brasil”.substring(2) é igual ”asil”.

Além das funções anteriores, o operador + foi sobrecarregado para executar uma
concatenação quando os dois operandos forem do tipo String. Por exemplo, ”Bra” + ”sil” é
igual a ”Brasil”.

A função a seguir tem por objetivo percorrer uma string (str), recebida como parâmetro, e
retornar outra string, que deve ter os mesmos caracteres que str, exceto as vogais minúsculas,
que devem ser trocadas pelas suas correspondentes maiúsculas.

String troca(String str) {

String min = ”aeiou”;

String mai = ”AEIOU”;

char c;

int pos;

if ([Link]() == 0)

return ””; // comentário: retorna uma string vazia

c = [Link]( 0 );

pos = [Link] ( c );

if ( pos != -1 ) { // comentário: != significa diferente

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 210


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

c = [Link] ( pos );

// 1

// 2;

A função acima não está completa. É preciso substituir os comentários // 1 e // 2 por


comandos que façam com que a função execute a troca de vogais minúsculas por vogais
maiúsculas e retorne a string resultante.

Quais comandos completam a função de acordo com o objetivo definido acima?

a) // 1 deve ser substituído por

return c + troca ( [Link] ( 1 ) );

// 2 deve ser substituído por

return troca ( [Link] ( 1 ) );

b) // 1 deve ser substituído por

return c + troca ( [Link] ( 1 ) );

// 2 deve ser substituído por

return c + troca ( [Link] ( 0 ) );

c) // 1 deve ser substituído por

return c ;

// 2 deve ser substituído por

return c + troca ( [Link] ( 1 ) );

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 211


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

d) // 1 deve ser substituído por

return c ;

// 2 deve ser substituído por

return c + troca ( [Link] ( 0 ) );

e) // 1 deve ser substituído por

return c + troca ( [Link] ( 1 ) );

==1365fc==

// 2 deve ser substituído por

return c + troca ( [Link] ( 1 ) );

Comentários:
Vamos analisar cada item.

a) // 1 deve ser substituído por

Esta opção não está correta, pois retorna apenas o caractere substituído (c), mas não continua a
chamada recursiva para o restante da string. Portanto, não realiza a troca para o restante da
string.

b) // 1 deve ser substituído por

Esta opção também está incorreta, pois retorna apenas o caractere substituído (c), mas não
continua a chamada recursiva para o restante da string. Portanto, não realiza a troca para o
restante da string.

c) // 1 deve ser substituído por

Nesta opção, apenas o caractere substituído (c) é retornado, mas não há chamada recursiva para
o restante da string. Portanto, não realiza a troca para o restante da string.

d) // 1 deve ser substituído por

Assim como nas opções anteriores, apenas o caractere substituído (c) é retornado, sem a
chamada recursiva para o restante da string. Portanto, não realiza a troca para o restante da
string.

e) Correta! No comentário // 1, a linha de código return c + troca ( [Link] ( 1 ) ); está


correta, pois estamos substituindo a vogal minúscula pelo seu correspondente maiúsculo (c), e

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 212


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

em seguida, continuamos a recursão para o restante da string, sem incluir o primeiro caractere
([Link](1)).

No comentário // 2, a linha de código return c + troca ( [Link] ( 1 ) ); está correta, pois


estamos retornando o caractere substituído (c) concatenado com o resultado da chamada
recursiva da função troca para o restante da string, novamente sem incluir o primeiro caractere
([Link](1)).

Assim, a opção correta é a letra E

e) // 1 deve ser substituído por

return c + troca ( [Link] ( 1 ) );

// 2 deve ser substituído por

return c + troca ( [Link] ( 1 ) );

Gabarito: Letra E

11. (CESGRANRIO - BASA - 2022) Qual definição de interface Java NÃO produz erro de
compilação?

a) interface P {
int x;

int y;

public void op1(String x);

b) abstract interface Q {
public int x;

public int y;

public default void op1() {

[Link](x+y);

c) final interface R {
int x=10;

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 213


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

int y=20;

public static void op1() {

[Link](x+y);

d) public interface S {
public static int x=10;

public static int y=20;

public static void op1() {

x++;

y++;

[Link](x+y);

e) public abstract interface T {


static int x=20;

public int y=20;

static void op1() {

[Link](x+y);

Comentários:

Para entender por que a alternativa E é correta e as demais são incorretas, vamos analisar cada
uma delas no contexto das regras de Java para interfaces. O item a está incorreto porque as

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 214


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

variáveis x e y são declaradas em uma interface sem inicialização. Em uma interface, todas as
variáveis são implicitamente public, static, e final, o que significa que devem ser inicializadas
quando declaradas.

Quanto à alternativa B, assim como na alternativa A, a declaração das variáveis x e y sem


inicialização é inválida. Além disso, a palavra-chave abstract é redundante para interfaces, pois
todas as interfaces são abstratas por natureza. No entanto, a palavra-chave abstract por si só não
causa erro de compilação aqui, mas a falta de inicialização das variáveis sim.

O item C também está errado. A palavra-chave final é usada para prevenir que uma classe seja
herdada. No entanto, interfaces são projetadas para serem implementadas por classes, e a
utilização de final numa interface é um erro de sintaxe, pois contradiz a finalidade de uma
interface.

O item D está incorreto porque tenta modificar as variáveis x e y, que são static e final por padrão
em uma interface, significando que são constantes e não podem ser alteradas após a sua
inicialização.

Por fim, nosso gabarito, item E, está correto. A declaração public abstract interface T é correta.

Assim, a interface T é declarada com public abstract. Vamos analisar pontos chave sobre Variáveis
e Métodos em Interfaces. Todas as variáveis declaradas dentro de uma interface são
automaticamente public, static, e final. Isso implica que essas variáveis devem ser inicializadas ao
serem declaradas, pois são constantes. A interface pode conter métodos abstratos, métodos
padrão (default), e métodos estáticos: Os Métodos abstratos são declarados sem um corpo e são
entendidos como públicos e abstratos por padrão. Por outro lado, métodos padrão são
definidos usando a palavra-chave default e possuem um corpo. Eles não alteram a obrigação de
classes que implementam a interface de sobrescrever métodos abstratos, mas permitem a
implementação de novos métodos sem quebrar as classes existentes que utilizam esta interface.
Por fim, métodos estáticos são marcados com a palavra-chave static e também possuem um
corpo. Eles pertencem à interface em si, não à instância de uma classe que a implementa.

Assim, em relação ao item E, embora interfaces em Java não costumeiramente definam corpos
para seus métodos, a partir da versão 8 do Java, é possível declarar métodos com corpo em
interfaces. Isso inclui métodos abstratos, métodos padrão e métodos estáticos. No código da
letra E, temos: Uma interface T declarada como public abstract. Isso significa que a interface é
pública e pode ser acessada por outras classes, e que seus métodos são abstratos e não
possuem implementação. Uma variável estática x declarada com o valor 20. Variáveis estáticas
em interfaces são permitidas e são inicializadas no momento da carga da classe. Uma variável de
instância y declarada como public com o valor 20. Variáveis de instância em interfaces são
permitidas e são inicializadas no momento da criação de um objeto que implementa a interface.
Um método estático op1() que imprime a soma de x e y. Métodos estáticos em interfaces são
permitidos e podem ser invocados diretamente na interface, sem a necessidade de um objeto.

Gabarito: Letra E

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 215


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

12. (CESGRANRIO - BASA - 2021) A classe Java a seguir contém dois métodos (busca e buscaBin)
que implementam um algoritmo de busca binária sobre um array de inteiros.

public class Main {

public static void main(String[] args) {

int arry[]= {220,158,133,100,98,96,80,60,55,22,8};

busca(arry,61);

public static int busca(int vet[], int elem) {

return buscaBin(vet,elem,0,[Link]-1);

private static int buscaBin(int vet[], int elem, int ini, int fin) {

if(ini > fin)

return -1;

int m=(ini+fin)/2;

[Link](“%d “ ,vet[m]);

if(vet[m]==elem)

return m;

else

if(vet[m]>elem)

return buscaBin(vet,elem,m+1,fin);

else

return buscaBin(vet,elem,ini,m-1);

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 216


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

O que será exibido no console quando o método main() for executado?

a) 96 80 60
b) 96 133 220
c) 96 55 60 80
d) 96 55 80 60
e) 96 133 158 220

Comentários:

Vamos analisar o código fornecido para determinar o que será exibido no console quando o
método main() for executado.

O método busca() simplesmente chama o método buscaBin() passando os argumentos


apropriados. Portanto, o comportamento do programa é determinado pelo método buscaBin().

Vamos analisar o método buscaBin():

O método buscaBin() implementa a busca binária em um array ordenado.


Ele recebe um array (vet), um elemento a ser encontrado (elem), e os índices iniciais (ini) e finais
(fin) do subarray onde a busca deve ser realizada.
Ele verifica se o índice inicial (ini) é maior que o índice final (fin). Se for, significa que o elemento
não está presente no array, e retorna -1.
Calcula o índice médio (m) do subarray.
Verifica se o elemento no índice médio (vet[m]) é igual ao elemento procurado (elem). Se for,
retorna o índice médio.
Se o elemento no índice médio for maior que o elemento procurado, a busca é realizada no lado
direito do subarray (ini = m + 1).
Se o elemento no índice médio for menor que o elemento procurado, a busca é realizada no lado
esquerdo do subarray (fin = m - 1).

Agora, vamos executar o código fornecido:


int arry[]= {220,158,133,100,98,96,80,60,55,22,8};
busca(arry, 61);

O elemento 61 não está presente no array fornecido. Portanto, a busca binária retornará -1.
Durante o processo de busca binária, os elementos do array que são acessados serão impressos
no console.

Vamos calcular a busca binária:

O índice médio do array é (0 + 10) / 2 = 5. O elemento correspondente é 96.


Como 96 é maior que 61, a busca continuará na metade superior do array.
O índice médio da metade superior é (6 + 10) / 2 = 8. O elemento correspondente é 55.
Como 55 é menor que 61, a busca continuará na metade inferior do array.
A busca não encontra o elemento 61 no array e retorna -1.
Portanto, durante o processo de busca binária, os elementos acessados serão: 96, 55, 80 e 60.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 217


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Logo, a saída no console será:

D) 96 55 80 60

Gabarito: Letra D

13. (CESGRANRIO - BASA - 2021) A classe Queue a seguir é uma implementação parcial do tipo
abstrato de dados Fila.

import [Link];

public class Queue<ELM> {

private ArrayList<ELM> lst=new ArrayList<ELM>();

public boolean isEmpty() {

return [Link]();

public void enqueue(ELM s) {

public ELM dequeue() {

Nesse contexto, qual implementação dos métodos enqueue() e dequeue() completa a


classe Queue, de modo que todos os elementos inseridos em uma fila possam ser
recuperados de acordo com a propriedade FIFO?

a) public void enqueue(ELM s) {

[Link](s);

public ELM dequeue() {

if(![Link]())

return [Link](0);

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 218


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

else

return null;

b) public void enqueue(ELM s) {

[Link](0,s);

public ELM dequeue() {

if(![Link]())

return [Link]([Link]()-1);

else

return null;

c) public void enqueue(ELM s) {

[Link](0,s);

public ELM dequeue() {

if(![Link]())

return [Link](0);

else

return null;

d) public void enqueue(ELM s) {

[Link](s);

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 219


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

public ELM dequeue() {

if(![Link]())

return [Link]([Link]()-1);

else

return null;

e) public void enqueue(ELM s) {

[Link]([Link](),s);

public ELM dequeue() {

if(![Link]())

return [Link]([Link]()-1);

else

return null;

}
Comentários:

Pessoal, a opção correta é a letra b) No método enqueue(), a opção b) utiliza [Link](0, s), o que
insere o elemento s no início da lista, garantindo que o primeiro elemento adicionado seja o
primeiro a ser removido, mantendo a propriedade FIFO (First-In-First-Out) de uma fila.

No método dequeue(), a opção b) remove o último elemento da lista usando [Link]([Link]() -


1), o que corresponde à operação de remover o elemento mais antigo (o primeiro a entrar),
mantendo a ordem FIFO. Além disso, ela também trata o caso de uma lista vazia retornando null.

Gabarito: Letra B

14. (CESGRANRIO - BASA - 2021) Considere a classe Java abaixo.

public class Main {

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 220


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

public static void main(String[] args) {

String s1=”Brasil”,s2=””;

s2=geraString(s1, s2, 0);

[Link](s2);

public static String geraString(String s1, String s2, int cont) {

if(cont==[Link]())

return s2;

String vogal=”aeiou”;

char c=[Link]([Link]()-cont-1);

if([Link](c) < 0)

s2+=[Link](c);

else

s2+=”.”;

cont++;

return geraString(s1, s2, cont);

O que o console exibirá quando o método main() for executado?

a) .i.a..
b) ..a.i.
c) [Link]
d) Br.s.l

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 221


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

e) Brasil

Comentários:

Vamos analisar o código para entender o que será exibido no console quando o método main()
for executado.

O método main() inicializa duas strings, s1 e s2. Em seguida, chama o método geraString()
passando s1, s2 e 0 como argumentos. Por fim, imprime o valor de s2 no console.

A função geraString() recebe uma string s1, uma string s2 e um contador cont. Ela verifica se cont
é igual ao comprimento da string s1. Se for, retorna s2. Caso contrário, ela continua processando
a string s1.

Para cada caractere na string s1, a função verifica se é uma vogal. Se não for, adiciona o caractere
a s2. Caso contrário, adiciona um ponto (.) a s2.

Vamos executar o código passo a passo:

Inicialmente, s1 é "Brasil" e s2 é uma string vazia.


Na primeira chamada de geraString(s1, s2, 0), o método processa a string s1 de trás para frente,
verificando cada caractere.
O último caractere de s1 é 'l'. Como não é uma vogal, é adicionado a s2.
O próximo caractere é 'i', que é uma vogal. Portanto, um ponto é adicionado a s2.
O próximo caractere é 's', que não é uma vogal, então é adicionado a s2.
O próximo caractere é 'a', que é uma vogal. Portanto, um ponto é adicionado a s2.
O próximo caractere é 'B', que não é uma vogal, então é adicionado a s2.
Portanto, s2 se torna "l.i.s.a.B".

Gabarito: Letra C

15. (CESGRANRIO – Banco do Brasil - 2021) Sejam as seguintes classes Java:

public class Va1 {

public static String getStr() {


return “abcdefghijklmnop“;
}

public String ini(String s, int cpr) {


return [Link](0, cpr);
}

public String fin(String s, int cpr) {


return ini(s, cpr)+[Link]([Link]()-cpr, [Link]());
}
}

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 222


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

public class Va2 extends Va1 {

public static String getStr() {


return “0123456789ABCDEF“;
}

public String ini(String s, int cpr) {


return [Link]([Link]()-cpr, [Link]());
}

public static void main(String[] args) {


Va1 o=new Va2();

[Link](o.fin([Link](), 5));
}
}

O que será exibido no console quando o método main for executado?


a) 0123BCDE
b) BCDEFBCDEF
c) 01234BCDEF
d) abcdelmnop
e) lmnoplmnop

Comentários:

Pessoal, novamente, vamos analisar o código por completo. Um objeto o da classe Va1 é criado,
mas o construtor da classe Va2 é usado para inicializá-lo. Isso significa que o objeto o busca
métodos primeiro na classe Va2 e depois na Va1 se não os encontrar na primeira. Após, o
método fin da classe Va1 é chamado no objeto o. Este método chama o método ini da classe
Va2.

Assim, o método ini da classe Va2 é executado, pois está na classe que inicializou o objeto. Este
método usa a função substring para retornar uma parte da string "abcdefghijklmnop". A parte da
string retornada é a partir da posição [Link]() - cpr (16 - 5 = 11) até o final da string (16). Isso
resulta na substring "lmnop".

Por fim, o método fin na classe Va1 concatena o resultado do método ini duas vezes. Isso
significa que a string final será "lmonplmnop". A string "lmonplmnop" é impressa no console.

Gabarito: Letra E

16. (CESGRANRIO – Banco do Brasil - 2021) As classes Java a seguir são públicas e ocupam
arquivos separados.

public class Tst {

int ini=0,fim=25;

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 223


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

void print() {
[Link](ini+fim);
}
{
ini=fim%7;
fim=ini*3;
}
Tst(int a, int b) {
ini+=a;
fim+=b;
}
{
ini/=2;
fim+=10;
}
}

public class Main {


public static void main(String[] args) {
new Tst(4, -4).print();
}
}

O que será exibido no console quando o método main for executado?

a) 0
b) 10
c) 24
d) 25
e) 33

Comentários:

Pessoal, as variáveis ini e fim são inicializadas com os valores 0 e 25, respectivamente.


O primeiro bloco de inicialização é executado antes do construtor. O valor de ini é definido como
o resto da divisão de fim por 7 (25 % 7 = 4).
O valor de fim é definido como o produto de ini por 3 (4 * 3 = 12). Já, o segundo bloco é
executado após o construtor em que o valor de ini é dividido por 2 (4 / 2 = 2).
e após, o valor de fim é incrementado em 10 (12 + 10 = 22).

Após, o construtor da classe Tst recebe dois parâmetros, a e b. O valor de ini é incrementado em
a (2 + 4 = 6). E após, o valor de fim é incrementado em b (22 - 4 = 18).

O método print é chamado no objeto new Tst(4, -4), este método imprime a soma de ini e fim (6
+ 18 = 24).
Por fim, o valor 24 será exibido no console.
Assim, temos o nosso gabarito: c) Correta. O valor de ini e fim é 24.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 224


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Gabarito: Letra C

17. (CESGRANRIO – Caixa Econômica Federal - 2021) As classes Java a seguir pertencem ao
pacote default.

class A1 {
protected int va1=1,va2=2;

public A1(int x) {
va1+=x;
va2*=x;
}
}

class A2 extends A1 {
protected int vb1=10;
}

class A3 extends A2 {
protected int vc1=0;

public A3(int y) {
vc1=(va1+va2)*y;
}
}

public class Main {

public static void main(String[] args) {


A3 o=new A3(2);
[Link](o.vc1);
}
}

Qual construtor poderá ser inserido na classe A2, sem que um erro de compilação seja
gerado?

a) public A2() {

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 225


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

vb1=va1+va2;
}

b) public A2(int z) {
super(z);
vb1=va1+va2;
}

c) public A2() {
vb1=va1+va2;
super(vb1);
}

d) public A2() {
super(0);
vb1=va1+va2;
}

e) public A2() {
super(vb1);
}

Comentários:

A resposta correta é a opção D. Em Java, classes filhas herdam os construtores de suas classes
pais, mas não os herdam automaticamente. Elas precisam chamá-los explicitamente usando a
palavra-chave super(). A classe A2 herda da classe A1, que possui um construtor que exige um
parâmetro inteiro. Portanto, qualquer construtor da classe A2 deve iniciar com uma chamada a
super(), passando um valor inteiro.

A ordem de inicialização de variáveis em uma classe é a seguinte: Variáveis da classe (na ordem
em que são declaradas). Bloco de inicialização da classe (se existir). Construtor da classe.

Analisando as alternativas, temos que:


A) Incorreta. Não chama o construtor da classe pai.
B) Incorreta. Cria um construtor com parâmetro, mas não é possível utilizá-lo na criação do objeto
o na classe Main.
C) Incorreta. Tenta chamar super() após acessar variáveis da classe pai, o que não é permitido.
D) Correta. Chama super(0) para inicializar a classe pai e depois atribui valores à variável vb1.
E) Incorreta. Tenta usar a variável vb1 antes que ela seja inicializada.

Gabarito: Letra D

18. (CESGRANRIO – Caixa Econômica Federal - 2021) As classes Java a seguir pertencem ao
pacote default e foram incluídas no arquivo [Link].

class MnopA {

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 226


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

static int x=10,y=10,z=10;

public MnopA() {
x*=2;
}

{
y+=5;
z+=10;
}
}

class MnopB extends MnopA {


public MnopB(int c) {
y*=c;
}
{
z+=y;
}
static {
x=y=z=1;
}
}
public class Main {
public static void main(String[] args) {
MnopB o=new MnopB(2);
[Link](MnopB.x+MnopB.y+MnopB.z);
}
}

O que será exibido no console quando o método main for executado?

a) 3
b) 4
c) 19
d) 27
e) 31

Comentários:
Pessoal, o código define três classes:

MnopA: que possui variáveis estáticas x, y e z são inicializadas com 10.


O construtor padrão (MnopA()) duplica o valor de x, mas não afeta y e z.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 227


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Um bloco de inicialização de instância (código entre chaves, mas não dentro de um método)
incrementa y em 5 e z em 10. Este bloco é executado sempre que um objeto de MnopA é criado.

Por fim, MnopB que herda de MnopA.


O construtor MnopB(int c) recebe um argumento inteiro c e multiplica y por c.
Outro bloco de inicialização de instância adiciona y a z.
Um bloco de inicialização estático (código dentro de static {}) é executado apenas uma vez antes
da criação do primeiro objeto da classe. Neste caso, ele define x, y e z como 1 para a classe
MnopB.

O método principal cria um objeto de MnopB com MnopB(2). Em seguida, imprime a soma de x,
y e z para MnopB.

Como MnopB é a primeira classe provável de ser usada (devido à criação do objeto no método
principal), seu inicializador estático é executado primeiro, definindo x, y e z como 1 para a classe
MnopB.

Quando MnopB o = new MnopB(2) é chamado, o seguinte acontece:

O construtor padrão de MnopA é invocado primeiro (porque MnopB herda de MnopA). Ele
duplica os valores herdados de x, y e z (que inicialmente eram 10 da inicialização padrão).
Portanto, neste ponto, x (de MnopA) torna-se 2, y permanece 1 e z permanece 1.
Bloco de Inicialização de Instância de MnopA: Este bloco então incrementa y em 5 (para 6) e z
em 10 (para 11).

O construtor de MnopB (MnopB(2)) herda os valores modificados de x (2), y (6) e z (11) de


MnopA. Multiplica y (que agora é 6) pelo argumento c (que é 2), resultando em um novo valor de
12 para y. E o bloco de Inicialização de Instância de MnopB adiciona o y atualizado (12) ao z (que
era 11), fazendo z igual a 23.

Finalmente, [Link](MnopB.x + MnopB.y + MnopB.z) imprime a soma de x (2), y (12) e


z (23), que é 31.

Gabarito: Letra E

19. (CESGRANRIO - UNIRIO - 2019) As classes e interfaces Java a seguir ocupam arquivos
distintos, situados no pacote default.

public interface ITA {

void a_m01();

void a_m02();

public interface ITB extends ITA {

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 228


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

void b_m01();

public abstract class CA {

private void a_ma02( ) {

public final void a_m01() {

protected void op02( ) {

public abstract void op03();

Qual versão da classe XY NÃO produzirá erros de compilação?

A)
public class XY extends CA implements ITB {
public void b_m01() {

public void a_m01() {

public void a_m02() {

public void op03() {

B)
public class XY extends CA implements ITA {
public void b_m01() {

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 229


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

public void a_m02() {

void op02( ) {

public void op03() {

C)
public class XY extends CA implements ITA {
public void b_m01() {

protected void op02( ) {

public void op03() {

D)
public class XY extends CA implements ITA {
public void b_m01() {

public void a_m02() {

E)
public abstract class XY extends CA implements ITB {
public void b_m01() {

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 230


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

public void a_m02() {

public void op02( ) {

}
Comentários:

Vamos analisar cada uma das versões da classe XY e verificar qual delas não produzirá erros de
compilação, considerando as interfaces ITA e ITB e a classe abstrata CA.

A) Esta versão implementa ITB, que estende ITA, portanto, precisa implementar todos os
métodos de ITA e ITB. Os métodos a_m01(), a_m02() e op03() de ITA e ITB são implementados,
então não há erros de compilação.

B) Aqui, XY implementa ITA, mas não ITB, portanto, deveria implementar todos os métodos de
ITA. No entanto, o método a_m01() é definido como final em CA, então não pode ser
implementado por XY, resultando em um erro de compilação.

C) Similarmente à opção B, XY implementa ITA, mas não ITB. Além disso, op02() é definido como
protegido em CA, então não pode ser implementado por XY, levando a um erro de compilação.

D) Esta versão implementa ITA, mas não ITB. A mesma questão com o método a_m01() sendo
final em CA causa um erro de compilação.

E) XY é definido como abstrato, o que significa que não é obrigatório implementar todos os
métodos de ITA e ITB imediatamente. Portanto, não há erros de compilação nesta versão.

Assim, a opção que não produzirá erros de compilação é a letra E, onde XY é uma classe abstrata
que implementa ITB.

Gabarito: Letra E

20. (CESGRANRIO - UNIRIO - 2019) As classes Java a seguir ocupam arquivos distintos, situados
no pacote default.

public class CX {

int v1,v2;

public CX() {

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 231


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

v1=v2=0;

v1+=20;

v2+=30;

public void print() {

[Link](v1+v2);

public class CY extends CX {

v1*=2;

v2*=3;

public CY() {

v1+=10;

v2+=20;

public class CZ extends CY {

public CZ(int c) {

v1*=3+c;

v2*=3+c;

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 232


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

public static void main(String[] args) {

CX p=new CZ(5);

[Link]();

O que será exibido no console quando o método main() for executado?

a) 100
b) 240
c) 640
d) 1280
e) 1680

Comentários:

O código Java fornecido apresenta três classes: CX, CY e CZ. CX define duas variáveis de
instância, v1 e v2, e um método print() que imprime a soma dessas variáveis. CX também possui
um bloco de inicialização que incrementa v1 em 20 e v2 em 30. CY estende CX e possui um
bloco de inicialização que multiplica v1 por 2 e v2 por 3, além de um construtor que adiciona 10
a v1 e 20 a v2. CZ estende CY e tem um construtor que multiplica v1 e v2 por um valor c
especificado no parâmetro e o método main() que instancia um objeto CZ com o valor 5 como
argumento.

Quando o método main() é executado, ocorre o seguinte:

1. Um objeto CZ é instanciado com o valor 5 passado como argumento para o construtor.


2. Durante a instanciação, os construtores de CX, CY e CZ são chamados, nessa ordem.
3. No construtor de CX, v1 e v2 são inicializados como 0 e, em seguida, os blocos de
inicialização são executados, aumentando v1 para 20 e v2 para 30.
4. No construtor de CY, v1 é multiplicado por 2, tornando-se 40, e v2 é multiplicado por 3,
tornando-se 90, e então adiciona-se 10 a v1 e 20 a v2.
5. No construtor de CZ, v1 é multiplicado por (3 + 5 = 8), tornando-se 320, e v2 é
multiplicado por 8, tornando-se 720.
Portanto, quando o método print() é chamado para o objeto CZ, ele imprimirá a soma de v1 e v2,
que é 320 + 720 = 1040.

Assim, a opção correta é a letra b) 240.

Gabarito: Letra B

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 233


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

21. (CESGRANRIO - Transpetro - 2018) Analise o programa, em Java, a seguir:

import [Link];
public class X
{ private static Random g = new Random();
private final int y;
private int z=1;

public X(int w)
{ y = w;
}

public int r()


{ z = [Link](y) + 1;
return z;
}

public int s()


{ return y;
}

public static void main(String[] args)


{ X k = new X(6);
X m = k;
X n = new X(3);
int p;
p = k.r()+m.s()+n.r();
[Link](p);
}
}

Ao ser executado, o programa imprimirá um número entre

a) 1 e 15
b) 3 e 9
c) 3 e 15
d) 8 e 9
e) 8 e 15

Comentários:

Prezados alunos, vamos analisar o programa fornecido:

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 234


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

O programa define uma classe chamada X. A classe X possui uma variável estática Random g,
que é inicializada com uma nova instância de Random. A classe X também possui uma variável
final y e uma variável z inicializada como 1.
O construtor da classe X recebe um inteiro w e atribui seu valor à variável y.
A classe X possui dois métodos, r() e s(), onde r() retorna um número aleatório entre 1 e y, e s()
retorna o valor de y.
No método main(), três objetos da classe X são criados: k, m e n.
A variável p é calculada somando o resultado dos métodos r() de k e n com o resultado do
método s() de m.

Agora, vamos analisar as faixas possíveis para o valor de p:

● O valor retornado por k.r() estará entre 1 e 6.


● O valor retornado por m.s() será sempre 6.
● O valor retornado por n.r() estará entre 1 e 3.

Assim, a soma máxima possível de p será 6 (de k.r()) + 6 (de m.s()) + 3 (de n.r()), resultando em 15.
E a soma mínima possível de p será 1 (de k.r()) + 6 (de m.s()) + 1 (de n.r()), resultando em 8.

Portanto, o programa imprimirá um número entre 8 e 15. A opção correta é a letra E.

Gabarito: Letra E

22. (CESGRANRIO - Transpetro - 2018) Considere as seguintes classes Java, que ocupam arquivos
separados:

public abstract class WA {


protected int a,b;

public WA() {
a=b=10;
}
public void faa() {
if(a < 10)
b=0;
else
a=0;
}
public abstract int fbb();
}
---------------------------------------------------
public class ZB extends WA {
public ZB() {
a+=5;
b+=5;

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 235


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

}
public int fbb() {
faa();
return a+b;
}
public void faa() {
try {
if(a > 10)
throw new Exception();
}
catch(Exception e.) {
a=b=0;
return;
}
finally {
a+=3;
b+=3;
}
}
}
---------------------------------------------------
public class Main {
public static void main(String[] args) {
WA w=new ZB();
[Link]([Link]());
}
}

Quando o método main() for executado, o console exibirá

a) 0
b) 5
c) 6
d) 15
e) 16

Comentários:

O programa Java fornecido consiste em três classes distintas: WA, ZB e Main, cada uma definida
em um arquivo separado. A classe abstrata WA inicializa duas variáveis protegidas, a e b, com o
valor 10 em seu construtor padrão e implementa um método faa() que modifica essas variáveis
com base em uma condição, além de declarar um método abstrato fbb(). Por sua vez, a classe ZB
estende WA e substitui o método faa(), lançando uma exceção caso o valor de a seja maior que
10 e, caso isso ocorra, atribui 0 a a e b no bloco catch, e incrementa a e b em 3 no bloco finally.
A classe Main contém o método main(), que cria um objeto ZB e chama o método fbb() sobre ele,
exibindo o resultado no console.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 236


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Durante a execução do método main(), um objeto ZB é instanciado e atribuído a uma referência


WA. Quando o método fbb() é invocado sobre esse objeto, primeiro o método faa() da classe ZB
é executado. Dentro deste método, uma exceção é lançada apenas se o valor de a for maior que
10, o que não ocorre neste caso, então o bloco catch é ignorado. Posteriormente, o bloco finally
é executado, onde os valores de a e b são incrementados em 3. Em seguida, o método fbb()
retorna a soma dos valores de a e b, que, após as operações realizadas dentro de faa() e finally,
totalizam 6. Dessa forma, o número 6 será exibido no console ao ser executado o programa.

Gabarito: Letra C

23. (CESGRANRIO - BASA - 2018) A linguagem de programação Java suporta

a) passagem de parâmetros de tipos primitivos por referência


b) sobrecarga de operadores
c) herança múltipla
d) polimorfismo
e) ponteiros

Comentários:

A linguagem de programação Java tem características específicas quanto à passagem de


parâmetros, sobrecarga, herança, polimorfismo e o uso de ponteiros.

Analisando cada item temos que o item A está incorreto. Java não suporta a passagem de
parâmetros de tipos primitivos por referência. Em Java, os tipos primitivos (como int, float,
double, etc.) são passados por valor. Isso significa que, quando um tipo primitivo é passado a um
método, o que é passado é uma cópia do valor original. Qualquer modificação feita a esse valor
no método não afeta o valor original fora do método.

O item B também está incorreto. Java não suporta a sobrecarga de operadores da maneira que
linguagens como C++ fazem. Embora Java permita a sobrecarga de métodos (múltiplos métodos
com o mesmo nome, mas com listas de parâmetros diferentes), não permite que
desenvolvedores definam comportamentos personalizados para operadores padrão (como +, -, *,
/, etc.) para tipos de dados definidos pelo usuário.

Item C também está incorreto. Java não suporta herança múltipla de classes. Isso significa que
uma classe não pode herdar diretamente de mais de uma classe. Java foi projetado dessa forma
para evitar complicações e ambiguidades relacionadas à herança múltipla, como o problema do
Diamante. No entanto, Java permite herança múltipla de interfaces, permitindo que uma classe
implemente múltiplas interfaces.

Por outro lado, o item D está correto. Java suporta polimorfismo, que é a capacidade de uma
referência de tipo de base apontar para um objeto de tipo derivado e a execução de métodos
ser determinada pelo objeto real apontado pela referência. O polimorfismo em Java é realizado
através de herança (incluindo a implementação de interfaces) e é um conceito central na
programação orientada a objetos na linguagem.

Gabarito: Letra D

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 237


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

LISTA DE QUESTÕES – CEBRASPE

1. (CESPE – Petrobrás – 2022)


package cadastroUsuario;

import [Link];
import [Link];
import [Link].*;
import [Link];
import [Link];
import [Link];

public class CadastroServlet extends HttpServlet


{
protected void doPost(HttpServletRequest
request,HttpServletResponse response)
throws ServletException, IOException {
String nome = [Link](“nome”);
String endereco =
[Link](“endereco”);
String telefone =
[Link](“telefone”);
[Link](“text/html”);
PrintWriter out = [Link]( );
[Link](“<HTML>“);
[Link](“<HEAD>“);
[Link](“<STYLE>“);
[Link](“background-color: green;”);
[Link](“</STYLE>“);
[Link](“</HEAD>“);
[Link](“<BODY>“);
[Link](“<P>Prezado(a) “, “ + nome + “
</P>“);
[Link](“<P>Obrigado por se
cadastrar.</P>“);
[Link](“<P>Entraremos em contato através
do telefone”, “ + telefone+ “ em breve.</P>“);
[Link](“</BODY>“);
[Link](“</HTML>“);

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 238


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

[Link]( );
}
}

Tendo como referência o código precedente, julgue o item que se segue.

A linha
String nome = [Link](“nome”);

pode ser alterada para


String nome = [Link](“nome”);
==1365fc==

sem perda de funcionalidade no código.

2. (CESPE - DP DF - 2022) No Java 8, o uso do método map() permite aplicar uma função a todos
os elementos de um stream.

3. (CESPE - DP DF– 2022) Quando a mensageria é utilizada com linguagem Java, as requisições
são processadas exclusivamente de forma síncrona.

4. (CESPE – SEED PR –2021) Java é uma linguagem construída a partir de um legado das
linguagens C e C++. No entanto, ela apresenta características únicas que a diferem das demais,
como:

I. o applet, que é um tipo especial de programa Java projetado para ser transmitido pela
Internet e executado por um navegador web compatível com Java.

II. a saída de seu compilador não gera um código executável e, sim, um bytecode.

III. o fato de um programa Java ser executado somente pela Java virtual machine (JVM).

Assinale a opção correta.

a) Apenas o item I está certo.


b) Apenas o item II está certo.
c) Apenas os itens I e III estão certos.
d) Apenas os itens II e III estão certos.
e) Todos os itens estão certos.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 239


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

5. (CESPE – PGDDF – 2021) Julgue o item subsecutivo, a respeito de lógica e de estrutura de


programação.

função avaliar( a, b )
início
ma <-a;
se (ma < b) então ma <- b;
me <-a;
se (me > b) então me <- b;
resultado <- ( ma % me );
se (resultado = 0)
então retorne me
senão avaliar(me, ma)
fim
escreva avaliar (120,30);

O resultado do pseudocódigo precedente será 120.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 240


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

LISTA DE QUESTÕES – FGV

1. (FGV – CGU – 2022) Observe o trecho de código a seguir.

1 import [Link].*;
2
3 interface Segunda { public void segunda();}
4 interface Terca { public void terca();}
5 interface Quarta extends Segunda, Terca { public void quarta();}
6
7 class Quinta implements Segunda {
8 public void segunda(){[Link]("Segunda");}
9}
10
11 class Sexta extends Quinta implements Quarta {
12 public void segunda(){[Link]("Segunda!");}
13 public void terca(){[Link]("Segunda!!");}
14 public void quarta(){[Link]("Segunda!!!");}
15 }
16
17 public class teste
18 {
19 public static void main( String[] args )
20 {
21 Quinta dia = (Quinta) new Sexta();
22 [Link]();
23 }
24 }

A saída produzida pela execução do código é:

a) Erro de compilação na linha 5


b) Segunda
c) Segunda!
d) Segunda!!
e) Segunda!!!

2. (FGV – TJDFT – 2022) Observe as classes abaixo descritas na linguagem de programação Java.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 241


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

public class DocumentoProcesso extends Object


{
private String docNumero;
private int classificacao;

public DocumentoProcesso (String docNumero, int

classificacao){
if (classificacao < 1)
throw new IllegalArgumentException (
"A classificação do documento deve ser no mínimo 1.");
==1365fc==

[Link] = docNumero;
[Link] = classificacao;
}
public String getDocNumero()
{ return docNumero; }
public int getClassificacao()
{ return classificacao; }
public void setDocNumero(String docNumero)
{ [Link] = docNumero; }
public void setClassificacao(int classificacao)
{ [Link] = classificacao; }
public int promove()
{ return classificacao + 1; }
}

public class Oficio extends DocumentoProcesso


{

private int precedencia;


public Oficio (String docNumero, int classificacao, int precedencia)
{super(docNumero,classificacao);
[Link] = precedencia; }
public int getPrecedencia()
{ return precedencia; }
public void setPrecedencia(int precedencia)
{ [Link] = precedencia; }
@Override
public int promove()
{ return precedencia + 1; }

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 242


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Com base nos conceitos de orientação a objetos, é correto afirmar que:


a) os atributos private de DocumentoProcesso são acessíveis por Oficio;
b) a anotação @Override indica que o método promove() é abstrato e polimórfico;
c) a classe Oficio representa uma herança múltipla das classes DocumentoProcesso e Object;
d) a classe Oficio é composta pela classe DocumentoProcesso, permitindo que uma instância
da classe Oficio faça referências a instâncias da classe DocumentoProcesso;
e) os métodos getDocNumero() e setDocNumero() da classe DocumentoProcesso encapsulam
o atributo docNumero e asseguram que os objetos da classe mantenham estados consistentes.

3. (FGV – PGE-AM – 2022) Considere o trecho de programa Java abaixo.

É correto afirmar que

a) o código mostra um exemplo de sobrescrita de métodos, pois há vários métodos com o


mesmo nome, porém, com parâmetros diferentes.
b) ocorrerá um erro no último método reajuste, pois este não pode ser estático.
c) uma chamada correta ao método reajuste, em condições ideais, é double sal = 1000.5; double
c = [Link](sal);
d) ocorrerá um erro na classe Calcular, pois não é permitido criar vários métodos com o mesmo
nome, como ocorre com o método reajuste.
e) uma chamada correta ao método reajuste, em condições ideais, é float sal = (float) 1000.5;
double c = [Link](sal);

4. (FGV – DPE-RJ – 2019) Considere as seguintes afirmativas sobre class constructor na linguagem
Java.

I. Deve receber o mesmo nome da classe a ele associada.

II. Não deve ser especificado um tipo de retorno na sua declaração.

III. É útil para a definição de valores iniciais para os atributos da classe.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 243


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

IV. É sempre declarado como public.

É correto somente o que se afirma em:


a) I e II;
b) II e III;
c) III e IV;
d) I, II e III;
e) I, III e IV.

5. (FGV – MPE-AL – 2018) Analise o código Java a seguir.

public class Exemplo {


public static void main(String[] args) {
int a = 4, b = 16;
String out = (a^b)==0 ? "Sim": (a & b)!=0
? "Talvez" : "Não";
[Link](out);
}
}

A execução do código acima produzirá

a) um erro de compilação.
b) um erro de execução.
c) a linha “Sim”.
d) a linha “Não”.
e) a linha “Talvez”.

6. (FGV – MPE – AL – 2018) No Java, a classe Error e Exception derivam da classe


a) ClassNotFoundException.
b) IOException.
c) MainException.
d) RuntimeException.
e) Throwable.

7. (FGV – MPE-AL – 2018) Sobre as variáveis e os métodos declarados como private, em Java,
analise as afirmativas a seguir.

I. Ficam acessíveis somente aos membros da própria classe.

II. Ficam acessíveis somente às classes definidas no mesmo package.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 244


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

III. Ficam acessíveis somente para suas classes derivadas.

Está correto o que se afirma em

a) I, apenas.
b) II, apenas.
c) III, apenas.
d) I e II, apenas.
e) II e III, apenas.

8. (FGV – BANESTES – 2018) Considere a compilação de um ou mais programas por meio da


linha de comando, num ambiente Java. Nesse caso, o comando que está corretamente
formado para esse fim é:

a) compile [Link] –type java


b) java [Link]
c) javac *.java
d) jvm [Link] [Link]
e) parse java [Link]

9. (FGV – ALE-RO – 2018) Analise a definição de um array em Java.

int[ ][ ] multi = new int[ 5 ][ 10 ];

Assinale o código que exibe corretamente um elemento de cada linha desse array.

a) for (int i = 0; i < 5; i++) { [Link](multi[i][0]); };


b) for (int i = 0; i < 10; i++) { [Link](multi[i,1]); };
c) for (int i = 0; i <= 5; i++) { [Link](multi[i,0]); };
d) for (int i = 0; i <= [Link]; i++) { [Link](multi[1,i]); };
e) for (int i = 1; i < multi[0].length; i++) { [Link](multi[i,1]); };

10. (FGV – ALE-RO – 2018) No contexto da linguagem Java, assinale o modificador (modifier) que
se refere ao nível de acesso.

a) abstract
b) final
c) protected
d) static
e) volatile

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 245


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

11. (FGV – ALE-RO – 2018) Sobre construtores (constructors), no contexto da linguagem Java,
analise as afirmativas a seguir.

I. Os construtores devem ser declarados como private.

II. Uma interface não pode ter um construtor.

III. Uma classe abstrata pode ter um construtor.

Está correto o que se afirma em


a) I, somente.
b) II, somente.
c) III, somente.
d) I e II, somente.
e) II e III, somente.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 246


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

LISTA DE QUESTÕES – FCC

1. (FCC – PGE-AM - 2022) Considere o trecho de programa Java abaixo.

A assinatura correta do método que deve ser colocada na lacuna I é

a) public int[] verificar(int vet[])

b) private int[] verificar(int vet[])

c) public static int verificar(int vet[])

d) public int verificar(int vet)

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 247


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

e) public static int[] verificar(int vet[])

2. (FCC – PGE-AM – 2022) Considere st um objeto do tipo PreparedStatement e conn um objeto


do tipo Connection, ambos em condições ideais para a execução do método salvar, de uma
classe Java.

==1365fc==

Nas condições apresentadas, para que o método salvar grave as informações do cliente no
banco de dados aberto, a lacuna I deve ser corretamente preenchida com a instrução

a) INSERT INTO cliente VALUES(cpf,nome,endereco,bairro,cidade,telefone,renda)

b) INSERT INTO cliente VALUES(?,?,?,?,?,?,?)

c) INSERT INTO cliente (nome,cpf,endereco,bairro,cidade,telefone,renda) VALUES(?,?,?,?,?,?,?)

d) INSERT INTO cliente VALUES([cpf],[nome],[endereço],[bairro],[cidade],[telefone],[renda])

e) INSERT TO cliente (cpf,nome,endereco,bairro,cidade,telefone,renda) VALUES(?,?,?,?,?,?,?)

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 248


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

3. (FCC – PGE-AM – 2022) No método doPost de uma servlet Java, deseja-se receber um
parâmetro de um campo de nome renda contido em um formulário HTML, converter o valor
recebido deste campo para número real e armazená-lo em uma variável chamada renda. A
instrução correta para realizar esta tarefa é

a) long renda = [Link]([Link]("renda"));

b) double renda = parseDouble([Link]("renda"));

c) double renda = [Link]("renda").toDouble();

d) double renda = [Link]([Link]("renda"));

e) number renda = parseNumber([Link]("renda"));

4. (FCC – AFAP – 2019) Considere o método Java abaixo.

Caso o driver JDBC não esteja disponível na aplicação e não exista o banco de dados trf3, as
exceções que deverão ser tratadas nas lacunas I e II são, correta e respectivamente,

a) NullPointerExceptionException e DatabaseException.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 249


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

b) DriverNotFoundException e MySQLException.

c) JDBCDriverException e DatabaseException.

d) ClassNotFoundException e SQLException.

e) JDBCDriverException e DatabaseSQLException.

5. (FCC – AFAP – 2019) Para criar array um Analista de Informática digitou os comandos abaixo
no método main de uma classe Java em condições ideais.

I. int[] a = {1,3};

II. int b[] = new int[2]; b[0]=1; b[1]=3;

III. int[] c = new int[2]; [Link](1); [Link](2);

IV. int[][] d = {{1,3},{4,5}};

V. int e[][] = {{1,3},{4,5}};

Ao tentar compilar e executar a classe, foi exibida a mensagem “Exception in thread "main"
[Link]: Uncompilable source code”. Essa mensagem foi exibida porque
o item

a) IV está incorreto, pois não especifica o tamanho da array.

b) V está incorreto, pois deve haver apenas um par de colchetes após o nome da array.

c) I está incorreto, pois não é permitido declarar um array e já incluir os valores nele.

d) II está incorreto, pois os colchetes devem ficar antes do nome da variável b.

e) III está incorreto, pois não existe o método add neste contexto.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 250


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

6. (FCC – AFAP – 2019) Considere a classe Java abaixo, que usa um método de ordenação por
inserção para rearranjar os valores em um vetor em ordem crescente.

public class Organiza{

public static void main(String[] args) {

int k[] = {88, 44, 42, 7, 72, 5};

int n = [Link];

ordena(n, k);

static void ordena(int n, int v[]) {

for (int j = 1; j < n; ++j) {

int x = v[j];

int i;

for (..I..){

v[i + 1] = v[i];

..II.. ;

Para que a ordenação por inserção ocorra corretamente, as lacunas I e II devem ser
corretamente preenchidas com

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 251


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

a) i=j-1; i >=0 && v[i]>x; − −i e v[i-1]=x

b) i=j-1; i >=0; i++ e v[i+1]=x

c) i=j-1; i >=0 && v[i]>x; − −i e v[i+1]=x

d) i=j-1; i >=0 && v[i]>x; ++i e v[i]=x

e) i=j-1; i >=0 || v[i]>x; − −i e v[i+1]=x

7. (FCC - TRF 3ª Região /2019) No interior do método main da classe principal de uma aplicação
Java SE um método foi chamado usando as instruções abaixo.

double[] dados;

double [] d={1, 20, 7, 8};

dados = [Link](d);

O método cadastraDados na classe Aluno deve ter a declaração

a) public static double[] cadastraDados(double[] d)

b) public static double[] cadastraDados(double d)

c) public double[] cadastraDados(double[] d)

d) public final double[] cadastraDados(double d[])

e) public static double cadastraDados(double[] d)

8. (FCC – SANASA – 2019) Na orientação a objetos uma classe abstrata é construída para ser um
modelo para classes derivadas e na sua construção há algumas restrições. Assim, considere a
classe abstrata abaixo, criada na Linguagem Java.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 252


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

public abstract class Calcula {

private static final double VALOR=10;

public abstract double soma(double n1, double n2);

public abstract void exibeResultado( );

protected abstract double soma(double n1, double n2, double n3);

private abstract int multiplica(double n1, int n2);

private double multiplica(double n1, double n2){return n1*n2;}

public Calcula( ) { }

A instrução que NÃO é permitida nessa classe é

a) private abstract int multiplica(double n1, int n2);

b) public abstract void exibeResultado( );

c) public Calcula( ) { }

d) private static final double VALOR=10;

e) private double multiplica(double n1, double n2){return n1*n2;}

9. (FCC – TJ TRF3 – 2019) Em uma aplicação Java, um vetor n foi criado por meio da instrução
double n=new double[3]; e alimentado com 3 valores reais. Para exibir o conteúdo da segunda
posição (índice) deste vetor utiliza-se a instrução

a) [Link](null, n[2]);

b) [Link](n[1]);

c) [Link](n[2]);

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 253


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

d) [Link](null, n[1]);

e) [Link](0, n[2]);

10. (FCC – AFAP – 2019) Considere a classe Java a seguir em condições ideais.

import [Link].*;

public class ClienteDados {

public int conectar(){

[Link]("[Link]");

Connection con = [Link]

("jdbc:mysql://localhost:3306/banco", "root", "");

Statement st = [Link]();

return 1;

No método conectar podem ser lançadas duas exceções que o Analista de Informática deseja
que sejam tratadas não no interior do método, mas sim por quem o chamar. Para que isso seja
permitido, deve-se inserir o comando

No método conectar podem ser lançadas duas exceções que o Analista de Informática deseja
que sejam tratadas não no interior do método, mas sim por quem o chamar. Para que isso seja
permitido, deve-se inserir o comando

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 254


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

a) try na linha abaixo da declaração do método e catch (DataBaseException,


SQLQueryException) abaixo do comando return 1.

b) throws ClassNotFoundException, SQLException na linha de declaração do método.

c) Exception ClassNotFoundException, SQLException na linha de declaração do método.

d) try na linha abaixo da declaração do método e catch (ClassNotFoundException,


SQLException) abaixo do comando return 1.

e) throws DataBaseException, SQLQueryException na linha de declaração do método.

11. (FCC / TRF3 – 2019) Uma classe Colaborador de uma aplicação Java tem o método abaixo.

public void setNome(String nome) {

[Link] = nome;

Para instanciar um objeto dessa classe e armazenar o nome "Pedro" no atributo nome utiliza-
se

a) [Link]("Pedro");

b) Colaborador c -> new Colaborador(); c->Nome="Pedro";

c) Colaborador c = new Colaborador([Link]("Pedro"));

d) Colaborador c = new Colaborador(); [Link]("Pedro");

e) Colaborador c = new Colaborador().setNome("Pedro");

12. (FCC / SABESP – 2018) As interfaces são usadas nas aplicações Java quando se deseja permitir
que diversas classes implementem determinados métodos, mesmo que de formas diferentes.
Em uma interface Java

a) os métodos não podem ter os modificadores protected ou private.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 255


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

b) não pode haver assinaturas de métodos cujo tipo de retorno seja void.

c) pode haver múltiplos construtores, desde que recebam parâmetros diferentes.

d) não pode haver dois ou mais métodos com o mesmo nome, mesmo que recebam
parâmetros diferentes.

e) todo método deverá ser implementado por uma das subclasses da aplicação pelo menos
uma vez

13. (FCC – TRF 3ª Região – 2014) Herança e interfaces são conceitos da orientação a objetos que
possibilitam a obtenção de polimorfismo. Em Java, uma interface pode

a) herdar de mais de uma interface.

b) ser instanciada diretamente por meio da instrução new.

c) possuir apenas assinaturas de métodos públicos e protegidos.

d) possuir métodos abstratos e estáticos.

e) conter declarações de constantes e de variáveis não inicializadas.

14. (FCC – TRE-RN – 2011) Em relação ao Java Standard Edition, é INCORRETO afirmar:

a) Possui gerenciamento de memória embutido, por meio do coletor de lixo.

b) Ambiente indicado para o desenvolvimento de aplicativos para dispositivos móveis ou


portáteis.

c) Permite o desenvolvimento de aplicações desktop de linha de comando e interfaces gráficas


Swing.

d) Portabilidade dos programas compilados para diversos sistemas operacionais, sem


necessidade de recompilação.

e) Usa conceitos tais como orientação a objetos e multithreading.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 256


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

15. (FCC – TRT 22ª Região – 2010) A plataforma Java disponibiliza um interpretador que traduz,
em tempo de execução, o bytecode para instruções nativas do processador, permitindo, dessa
forma, que uma mesma aplicação seja executada em qualquer plataforma computacional que
possua essa implementação. Trata-se de:

a) Java Virtual Machine.

b) Java API.

c) JavaBeans.

d) J2SE.

e) JavaFX.

16. (FCC – Sergipe Gás– 2010) É tida como uma das principais linguagens de programação
orientada a objeto; tem como característica a compilação para um bytecode e execução por
uma máquina virtual. Trata-se da linguagem:

a) Algol.

b) Delphi.

c) C++.

d) Java.

e) PHP.

17. (FCC – TCE-SP – 2010) Os aplicativos Java “rodam” em diferentes ambientes. A tradução dos
códigos Java (bytecode), para instruções específicas de cada sistema e dispositivo, é uma
função do programa:

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 257


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

a) Java Community Process (JCP).

b) Java Virtual Module (JVM).

c) Java Virtual Machine (JVM).

d) Java Comunication Process (JCP).

e) Java Enterprise Machine (JEM).

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 258


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

LISTA DE QUESTÕES– CESGRANRIO

1. (CESGRANRIO – Banco do Brasil – 2023) Um programador foi instruído pelo seu gerente a
implementar, em Java, uma classe MemoriaCalculoVenda que implementasse a interface
MemoriaCalculo, já criada pela organização e que representa as exigências da organização para
classes que implementam memórias de cálculo.

Nesse cenário, com que fragmento de código o programador deve começar, de forma correta, a
implementação da classe?

a) class MemoriaCalculoVenda extends MemoriaCalculo


b) class MemoriaCalculoVenda implements MemoriaCalculo
c) class MemoriaCalculoVenda imports MemoriaCalculo
d) class MemoriaCalculoVenda inherits MemoriaCalculo
e) class MemoriaCalculoVenda uses MemoriaCalculo

2. (CESGRANRIO – Banco do Brasil – 2023) Sejam as seguintes classes Java, que ocupam arquivos
separados:

public class CAx {

protected int a;

protected int b;

public CAx() {

a*=2;

b*=3;

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 259


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

a=1;

b=2;

public int op1(int x) {

return op2(x)+op3(x)+b;

public int op2(int x) {

return x+a;

public static int op3(int x) {

return x*2;

public class CBy extends CAx {

protected int a;

public CBy() {

a+=3;

b+=3;

public int op2(int x) {

return x-a;

public static int op3(int x) {

return x*3;

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 260


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

public class Main {

public static void main(String[] args) {

CAx o=new CBy();

[Link](o.op1(2));

O que será exibido no console quando o método main for executado?

a) 10

b) 12

c) 14

d) 18

e) 20

3. (CESGRANRIO – Banco do Brasil – 2023) Considere as seguintes classes Java, que ocupam arquivos
separados:

public class Pa {

String x,y,z;

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 261


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

String r="vazio";

public Pa(String s1,String s2, String s3) throws Exception {

x=s1;

y=s2;

z=s3;

try {

if(x==null || y==null || z==null)

throw new Exception();

catch(Exception e) {

z="a";

throw e;

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 262


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

finally {

if(x==null)

x="***";

if(y==null)

y="***";

if(z==null)

z="***";

public String get() {

return r;

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 263


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

public class Qb extends Pa {

public Qb(String s1,String s2, String s3) throws Exception {

super(s1,s2,s3);

r=x+y+z;

public class Main {

public static void main(String[] args) {

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 264


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Pa o=null;

try {

o=new Qb("a"," ","c");

catch (Exception e) {

[Link](“***Erro***“);

finally {

if(o!=null)

[Link]([Link]());

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 265


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

O que será exibido no console quando o método main for executado?

a) ac

b) a***a

c) a***c

d) ***Erro***

e) vazio

4. (CESGRANRIO – AgeRIO – 2023) O método main, a seguir, ordena um array de empregados em ordem
crescente de salários.

a)

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 266


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

b)

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 267


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

c)

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 268


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

d)

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 269


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

e)

5. (CESGRANRIO - Transpetro - 2023) Considere as seguintes classes e a interface Java que ocupam
arquivos separados:

package pk1;

public interface Itf {

public void m1(String s);

public void m2(String s1, String s2);

package pk2;

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 270


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

public abstract class A {

public void m1(String s1) {

[Link]("*** " + s1);

public void m2(String s1, String s2) {

[Link]("*** " + s1 + " " + s2);

package pk3;

import pk2.*;

import pk1.*;

class B extends A implements Itf {

public void m3() {

[Link](" B - m3 ");

package pk3;

public class C extends B {

public void m4() {

[Link](" C - m4 ");

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 271


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

package pk3;

import pk2.*;

public class D extends A {

public void m4() {

[Link](" C - m4 ");

Qual implementação da classe Main NÃO produz erro de compilação?

a) import pk1.*;

import pk2.*;

import pk3.*;

public class Main {

public static void main(String[] args) {

Itf o;

o=new B();

o.m2("Brasil"," 2023");

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 272


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

b) import pk1.*;

import pk2.*;

import pk3.*;

public class Main {

public static void main(String[] args) {

Itf o;

o=new pk3.B();

o.m2("Brasil"," 2023");

c) import pk1.*;

import pk2.*;

import pk3.*;

public class Main {

public static void main(String[] args) {

Itf o;

o=new A();

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 273


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

o.m2("Brasil"," 2023");

d) import pk1.*;

import pk2.*;

import pk3.*;

public class Main {

public static void main(String[] args) {

Itf o;

o=new D();

o.m2("Brasil"," 2023");

e) import pk1.*;

import pk2.*;

import pk3.*;

public class Main {

public static void main(String[] args) {

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 274


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Itf o;

o=new pk3.C();

o.m2("Brasil"," 2023");

6. (CESGRANRIO - Transpetro - 2023) Considere as seguintes classes Java, que ocupam arquivos
separados:

public class Err01 extends Exception {

public Err01() { }

public Err01(String m) {

super(m);

public class Err02 extends Err01 {

public Err02() { }

public Err02(String m) {

super(m);

Qual classe NÃO produzirá erros de compilação?

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 275


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

a) public class Main {

public double m01(double a, double b) {

try {

if(a < 0)

throw new Err01();

if(b < 0)

throw new Err02();

if(b == 0)

throw new Exception();

catch(Err01 e) {

[Link]("a menor do que zero");

return a / b;

public static void main(String[] args) throws Exception {

Main m=new Main();

[Link]( m.m01 (8.0, 4.0) );

b) public class Main {

public double m01(double a, double b) {

try {

if(a < 0)

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 276


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

throw new Err01();

if(b <= 0)

throw new Err02();

catch(Err02 e) {

[Link]("b menor ou igual a zero");

return a / b;

public static void main(String[] args) throws Exception {

Main m=new Main();

[Link]( m.m01 (8.0, 4.0) );

c) public class Main {

public double m01(double a, double b) {

try {

if(a < 0)

throw new Err01();

if(b <= 0)

throw new Err02();

catch(Err01 e) {

[Link]("a menor do que zero");

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 277


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

catch(Err02 e) {

[Link]("b menor ou igual a zero");

catch(Exception e) {

[Link]("b igual a zero");

return a / b;

public static void main(String[] args) throws Exception {

Main m=new Main();

[Link]( m.m01 (8.0, 4.0) );

d) public class Main {

public double m01(double a, double b) throws Err01 {

try {

if(a < 0)

throw new Err01();

if(b < 0)

throw new Err02();

if(b == 0)

throw new Exception();

catch(Exception e) {

[Link]("b igual a zero");

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 278


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

return a / b;

public static void main(String[] args) throws Exception {

Main m=new Main();

[Link]( m.m01 (8.0, 4.0) );

e) public class Main {

public double m01(double a, double b) throws Err01 {

try {

if(a < 0)

throw new Err01();

if(b < 0)

throw new Err02();

if(b == 0)

throw new Exception();

catch(Err01 e) {

[Link]("a menor do que zero");

catch(Err02 e) {

[Link]("b menor ou igual a zero");

return a / b;

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 279


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

public static void main(String[] args) throws Exception {

Main m=new Main();

[Link]( m.m01 (8.0, 4.0) );

7. (CESGRANRIO - Transpetro - 2023) Sejam as seguintes classes Java, que ocupam arquivos separados:

public class L1 {

int a=1, b=1, c=1;

public L1() {

a *= 2;

b *= 2;

c *= 2;

public int opA(int x, int y) {

return a + b + c - opA(x) + opA(y);

public int opA(int x) {

return x + 5;

a++;

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 280


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

b--;

public class L2 extends L1 {

public L2() {

c+=2;

public int opA(int x, double y) {

return a + b + c + opA(x)+ opA((int)y);

public static void main(String[] args) {

L2 o=new L2();

[Link]([Link](2,3));

O que será exibido no console quando o método main for executado?

a) 6

b) 7

c) 9

d) 19

e) 21

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 281


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

8. (CESGRANRIO – BASA - 2022) Sejam dois arrays de inteiros, com zero ou mais elementos cada,
ordenados ascendentemente. Deseja-se escrever uma função que receba esses dois arrays como
parâmetros e insira os seus elementos em um terceiro array, também recebido como parâmetro, de
modo que os elementos inseridos no terceiro array permaneçam ordenados ascendentemente, como
no exemplo abaixo.

Exemplo:

int v1[]={10,20,30,40,50};

int v2[]={5,10,15,20};

O conteúdo do terceiro array, após a chamada da função de intercalação, será

{5,10,10,15,20,20,30,40,50}

Nesse contexto, considere a seguinte função main de um programa Java:

public class Main {

public static void main(String[] args) {

int v1[]={10,20,30,40,50};

int v2[]={5,10,15,20};

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 282


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

int v3[]=new int [[Link] + [Link]];

int p1=0,p2=0,p3=0;

intercala(v1,p1,v2,p2,v3,p3);

Qual função deve ser inserida na classe Main para que a intercalação do array v1 com o array v2 seja feita
corretamente?

a) static void intercala(int v1[],int p1,int v2[],int p2,int v3[],int p3) {

if(p1 == [Link] && p2 == [Link])

return;

if(v1[p1] < v2[p2]) {

v3[p3++]=v1[p1++];

intercala(v1,p1,v2,p2,v3,p3);

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 283


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

else {

v3[p3++]=v2[p2++];

intercala(v1,p1,v2,p2,v3,p3);

b) static void intercala(int v1[],int p1,int v2[],int p2,int v3[],int p3) {

if(p1 == [Link] && p2 == [Link])

return;

if(p1 < [Link])

if(p2 < [Link])

if(v1[p1] < v2[p2]) {

v3[p3++]=v1[p1++];

intercala(v1,p1,v2,p2,v3,p3);

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 284


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

else {

v3[p3++]=v2[p2++];

intercala(v1,p1,v2,p2,v3,p3);

else {

v3[p3++]=v1[p1++];

ntercala(v1,p1,v2,p2,v3,p3);

else

if(p2 < [Link]) {

v3[p3++]=v2[p2++];

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 285


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

intercala(v1,p1,v2,p2,v3,p3);

c) static void intercala(int v1[],int p1,int v2[],int p2,int v3[],int p3) {

if(p1 < [Link] && p2 < [Link])

intercala(v1,p1+1,v2,p2+1,v3,p3+1);

else

if(p1 < [Link] && p2 == [Link])

intercala(v1,p1+1,v2,p2,v3,p3+1);

else

if(p1 == [Link] && p2 < [Link])

intercala(v1,p1,v2,p2+1,v3,p3+1);

else

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 286


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

return;

if(p1 < [Link])

if(p2 < [Link])

if(v1[p1] < v2[p2])

v3[p3]=v1[p1];

else

v3[p3]=v2[p2];

else

v3[p3]=v1[p1];

else

v3[p3]=v2[p2];

d) static void intercala(int v1[],int p1,int v2[],int p2,int v3[],int p3) {

while(p1 < [Link] && p2 < [Link])

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 287


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

if(v1[p1] < v2[p2]) {

v3[p3]=v1[p1];

p3+=1;

p1+=1;

else

if(v1[p1] > v2[p2]) {

v3[p3]=v2[p2];

p3+=1;

p2+=1;

else {

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 288


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

v3[p3]=v1[p1];

p1+=1;

p3+=1;

v3[p3]=v2[p2];

p3+=1;

p2+=1;

e) static void intercala(int v1[],int p1,int v2[],int p2,int v3[],int p3) {

while(p1 < [Link] || p2 < [Link])

if(v1[p1] < v2[p2]) {

v3[p3]=v1[p1];

p3++;

p1++;

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 289


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

else

if(v1[p1] > v2[p2]) {

v3[p3]=v2[p2];

p3++;

p2++;

else {

v3[p3]=v1[p1];

p1++;

p3++;

v3[p3]=v2[p2];

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 290


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

p3++;

p2++;

9. (CESGRANRIO - BASA - 2022) Admita que as duas classes Java a seguir pertençam ao pacote default e
ocupem arquivos separados.

public class Va {

private int a=0,b=2,c=4;

private static int sb;

public Va() {

a*=2;

b*=3;

c*=4;

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 291


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

public Va(int x) {

this();

sb+=x;

sb*=2;

a+=1;

static {

sb+=8;

public void print() {

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 292


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

[Link](a+b+c+sb);

public class Main {

public static void main(String[] args) {

new Va(1).print();

O que será exibido no console quando o método main for executado?

a) 16

b) 31

c) 33

d) 39

e) 41

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 293


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

10. (CESGRANRIO - ELETRONUCLEAR - 2022) Uma linguagem de programação orientada a objetos


possui uma classe, chamada String, que é usada para representar cadeias de caracteres. Essa classe
possui inúmeros métodos, dentre os quais se destacam os seguintes:

int length() – retorna um inteiro que representa a quantidade de caracteres de uma string. Por exemplo,
”Brasil”.length() é igual a 6.

char charAt(int p) – retorna o caractere da posição p de uma string. Por exemplo, “Brasil”.charAt(0) é
igual a ‘B’.

int indexOf(char c) – retorna o índice da string onde se localiza a 1ª ocorrência do caractere c. Caso c não
pertença à string, a função retorna -1. Por exemplo, ”Brasil”.indexOf( ’s’ ) é igual a 3.

String substring(int p) – retorna uma substring contendo os caracteres da posição p até length() – 1. Por
exemplo, ”Brasil”.substring(2) é igual ”asil”.

Além das funções anteriores, o operador + foi sobrecarregado para executar uma concatenação quando
os dois operandos forem do tipo String. Por exemplo, ”Bra” + ”sil” é igual a ”Brasil”.

A função a seguir tem por objetivo percorrer uma string (str), recebida como parâmetro, e retornar outra
string, que deve ter os mesmos caracteres que str, exceto as vogais minúsculas, que devem ser trocadas
pelas suas correspondentes maiúsculas.

String troca(String str) {

String min = ”aeiou”;

String mai = ”AEIOU”;

char c;

int pos;

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 294


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

if ([Link]() == 0)

return ””; // comentário: retorna uma string vazia

c = [Link]( 0 );

pos = [Link] ( c );

if ( pos != -1 ) { // comentário: != significa diferente

c = [Link] ( pos );

// 1

// 2;

A função acima não está completa. É preciso substituir os comentários // 1 e // 2 por comandos que façam
com que a função execute a troca de vogais minúsculas por vogais maiúsculas e retorne a string
resultante.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 295


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Quais comandos completam a função de acordo com o objetivo definido acima?

a) // 1 deve ser substituído por

return c + troca ( [Link] ( 1 ) );

// 2 deve ser substituído por

return troca ( [Link] ( 1 ) );

b) // 1 deve ser substituído por

return c + troca ( [Link] ( 1 ) );

// 2 deve ser substituído por

return c + troca ( [Link] ( 0 ) );

c) // 1 deve ser substituído por

return c ;

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 296


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

// 2 deve ser substituído por

return c + troca ( [Link] ( 1 ) );

d) // 1 deve ser substituído por

return c ;

// 2 deve ser substituído por

return c + troca ( [Link] ( 0 ) );

e) // 1 deve ser substituído por

return c + troca ( [Link] ( 1 ) );

// 2 deve ser substituído por

return c + troca ( [Link] ( 1 ) );

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 297


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

11. (CESGRANRIO - BASA - 2022) Qual definição de interface Java NÃO produz erro de compilação?

a) interface P {

int x;

int y;

public void op1(String x);

b) abstract interface Q {

public int x;

public int y;

public default void op1() {

[Link](x+y);

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 298


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

c) final interface R {

int x=10;

int y=20;

public static void op1() {

[Link](x+y);

d) public interface S {

public static int x=10;

public static int y=20;

public static void op1() {

x++;

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 299


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

y++;

[Link](x+y);

e) public abstract interface T {

static int x=20;

public int y=20;

static void op1() {

[Link](x+y);

12. (CESGRANRIO - BASA - 2021) A classe Java a seguir contém dois métodos (busca e buscaBin) que
implementam um algoritmo de busca binária sobre um array de inteiros.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 300


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

public class Main {

public static void main(String[] args) {

int arry[]= {220,158,133,100,98,96,80,60,55,22,8};

busca(arry,61);

public static int busca(int vet[], int elem) {

return buscaBin(vet,elem,0,[Link]-1);

private static int buscaBin(int vet[], int elem, int ini, int fin) {

if(ini > fin)

return -1;

int m=(ini+fin)/2;

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 301


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

[Link](“%d “ ,vet[m]);

if(vet[m]==elem)

return m;

else

if(vet[m]>elem)

return buscaBin(vet,elem,m+1,fin);

else

return buscaBin(vet,elem,ini,m-1);

O que será exibido no console quando o método main() for executado?

a) 96 80 60

b) 96 133 220

c) 96 55 60 80

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 302


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

d) 96 55 80 60

e) 96 133 158 220

13. (CESGRANRIO - BASA - 2021) A classe Queue a seguir é uma implementação parcial do tipo abstrato
de dados Fila.

import [Link];

public class Queue<ELM> {

private ArrayList<ELM> lst=new ArrayList<ELM>();

public boolean isEmpty() {

return [Link]();

public void enqueue(ELM s) {

public ELM dequeue() {

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 303


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Nesse contexto, qual implementação dos métodos enqueue() e dequeue() completa a classe Queue,
de modo que todos os elementos inseridos em uma fila possam ser recuperados de acordo com a
propriedade FIFO?

a) public void enqueue(ELM s) {

[Link](s);

public ELM dequeue() {

if(![Link]())

return [Link](0);

else

return null;

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 304


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

b) public void enqueue(ELM s) {

[Link](0,s);

public ELM dequeue() {

if(![Link]())

return [Link]([Link]()-1);

else

return null;

c) public void enqueue(ELM s) {

[Link](0,s);

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 305


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

public ELM dequeue() {

if(![Link]())

return [Link](0);

else

return null;

d) public void enqueue(ELM s) {

[Link](s);

public ELM dequeue() {

if(![Link]())

return [Link]([Link]()-1);

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 306


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

else

return null;

e) public void enqueue(ELM s) {

[Link]([Link](),s);

public ELM dequeue() {

if(![Link]())

return [Link]([Link]()-1);

else

return null;

14. (CESGRANRIO - BASA - 2021) Considere a classe Java abaixo.

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 307


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

public class Main {

public static void main(String[] args) {

String s1=”Brasil”,s2=””;

s2=geraString(s1, s2, 0);

[Link](s2);

public static String geraString(String s1, String s2, int cont) {

if(cont==[Link]())

return s2;

String vogal=”aeiou”;

char c=[Link]([Link]()-cont-1);

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 308


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

if([Link](c) < 0)

s2+=[Link](c);

else

s2+=”.”;

cont++;

return geraString(s1, s2, cont);

O que o console exibirá quando o método main() for executado?

a) .i.a..

b) ..a.i.

c) [Link]

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 309


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

d) Br.s.l

e) Brasil

15. (CESGRANRIO – Banco do Brasil - 2021) Sejam as seguintes classes Java:

public class Va1 {

public static String getStr() {

return “abcdefghijklmnop“;

public String ini(String s, int cpr) {

return [Link](0, cpr);

public String fin(String s, int cpr) {

return ini(s, cpr)+[Link]([Link]()-cpr, [Link]());

public class Va2 extends Va1 {

public static String getStr() {

return “0123456789ABCDEF“;

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 310


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

public String ini(String s, int cpr) {

return [Link]([Link]()-cpr, [Link]());

public static void main(String[] args) {

Va1 o=new Va2();

[Link]([Link]([Link](), 5));

O que será exibido no console quando o método main for executado?

a) 0123BCDE

b) BCDEFBCDEF

c) 01234BCDEF

d) abcdelmnop

e) lmnoplmnop

16. (CESGRANRIO – Banco do Brasil - 2021) As classes Java a seguir são públicas e ocupam arquivos
separados.

public class Tst {

int ini=0,fim=25;

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 311


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

void print() {

[Link](ini+fim);

ini=fim%7;

fim=ini*3;

Tst(int a, int b) {

ini+=a;

fim+=b;

ini/=2;

fim+=10;

public class Main {

public static void main(String[] args) {

new Tst(4, -4).print();

O que será exibido no console quando o método main for executado?

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 312


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

a) 0

b) 10

c) 24

d) 25

e) 33

17. (CESGRANRIO – Caixa Econômica Federal - 2021) As classes Java a seguir pertencem ao pacote
default.

class A1 {

protected int va1=1,va2=2;

public A1(int x) {

va1+=x;

va2*=x;

class A2 extends A1 {

protected int vb1=10;

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 313


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

class A3 extends A2 {

protected int vc1=0;

public A3(int y) {

vc1=(va1+va2)*y;

public class Main {

public static void main(String[] args) {

A3 o=new A3(2);

[Link](o.vc1);

Qual construtor poderá ser inserido na classe A2, sem que um erro de compilação seja gerado?

a) public A2() {

vb1=va1+va2;

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 314


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

b) public A2(int z) {

super(z);

vb1=va1+va2;

c) public A2() {

vb1=va1+va2;

super(vb1);

d) public A2() {

super(0);

vb1=va1+va2;

e) public A2() {

super(vb1);

18. (CESGRANRIO – Caixa Econômica Federal - 2021) As classes Java a seguir pertencem ao pacote default
e foram incluídas no arquivo [Link].

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 315


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

class MnopA {

static int x=10,y=10,z=10;

public MnopA() {

x*=2;

==1365fc==

y+=5;

z+=10;

class MnopB extends MnopA {

public MnopB(int c) {

y*=c;

z+=y;

static {

x=y=z=1;

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 316


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

public class Main {

public static void main(String[] args) {

MnopB o=new MnopB(2);

[Link](MnopB.x+MnopB.y+MnopB.z);

O que será exibido no console quando o método main for executado?

a) 3

b) 4

c) 19

d) 27

e) 31

19. (CESGRANRIO - UNIRIO - 2019) As classes e interfaces Java a seguir ocupam arquivos distintos,
situados no pacote default.

public interface ITA {

void a_m01();

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 317


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

void a_m02();

public interface ITB extends ITA {

void b_m01();

public abstract class CA {

private void a_ma02( ) {

public final void a_m01() {

protected void op02( ) {

public abstract void op03();

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 318


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Qual versão da classe XY NÃO produzirá erros de compilação?

A)

public class XY extends CA implements ITB {

public void b_m01() {

public void a_m01() {

public void a_m02() {

public void op03() {

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 319


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

B)

public class XY extends CA implements ITA {

public void b_m01() {

public void a_m02() {

void op02( ) {

public void op03() {

C)

public class XY extends CA implements ITA {

public void b_m01() {

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 320


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

protected void op02( ) {

public void op03() {

D)

public class XY extends CA implements ITA {

public void b_m01() {

public void a_m02() {

E)

public abstract class XY extends CA implements ITB {

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 321


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

public void b_m01() {

public void a_m02() {

public void op02( ) {

20. (CESGRANRIO - UNIRIO - 2019) As classes Java a seguir ocupam arquivos distintos, situados no pacote
default.

public class CX {

int v1,v2;

public CX() {

v1=v2=0;

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 322


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

v1+=20;

v2+=30;

public void print() {

[Link](v1+v2);

public class CY extends CX {

v1*=2;

v2*=3;

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 323


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

public CY() {

v1+=10;

v2+=20;

public class CZ extends CY {

public CZ(int c) {

v1*=3+c;

v2*=3+c;

public static void main(String[] args) {

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 324


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

CX p=new CZ(5);

[Link]();

O que será exibido no console quando o método main() for executado?

a) 100

b) 240

c) 640

d) 1280

e) 1680

21. (CESGRANRIO - Transpetro - 2018) Analise o programa, em Java, a seguir:

import [Link];

public class X

{ private static Random g = new Random();

private final int y;

private int z=1;

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 325


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

public X(int w)

{ y = w;

public int r()

{ z = [Link](y) + 1;

return z;

public int s()

{ return y;

public static void main(String[] args)

{ X k = new X(6);

X m = k;

X n = new X(3);

int p;

p = k.r()+m.s()+n.r();

[Link](p);

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 326


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

Ao ser executado, o programa imprimirá um número entre

a) 1 e 15

b) 3 e 9

c) 3 e 15

d) 8 e 9

e) 8 e 15

22. (CESGRANRIO - Transpetro - 2018) Considere as seguintes classes Java, que ocupam arquivos
separados:

public abstract class WA {

protected int a,b;

public WA() {

a=b=10;

public void faa() {

if(a < 10)

b=0;

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 327


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

else

a=0;

public abstract int fbb();

---------------------------------------------------

public class ZB extends WA {

public ZB() {

a+=5;

b+=5;

public int fbb() {

faa();

return a+b;

public void faa() {

try {

if(a > 10)

throw new Exception();

catch(Exception e.) {

a=b=0;

return;

finally {

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 328


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

a+=3;

b+=3;

---------------------------------------------------

public class Main {

public static void main(String[] args) {

WA w=new ZB();

[Link]([Link]());

Quando o método main() for executado, o console exibirá

a) 0

b) 5

c) 6

d) 15

e) 16

23. (CESGRANRIO - BASA - 2018) A linguagem de programação Java suporta

a) passagem de parâmetros de tipos primitivos por referência

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 329


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

b) sobrecarga de operadores

c) herança múltipla

d) polimorfismo

e) ponteiros

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 330


[Link] 332

39471799600 - Naldira Luiza Vieria


Paolla Ramos
Aula 06

GABARITO

1- Letra B 9- Letra E 17- Letra D


2- Letra B 10- Letra E 18- Letra E
3- Letra A 11- Letra E 19- Letra E
4- Letra E 12- Letra D 20- Letra B
5- Letra E 13- Letra B 21- Letra E
6- Letra D 14- Letra C 22- Letra C
7- Letra C 15- Letra E 23- Letra D
8- Letra B 16- Letra C

Perito Criminal - Curso Regular (Área TI) Desenvolvimento de Software 331


[Link] 332

39471799600 - Naldira Luiza Vieria

Você também pode gostar