Aula 06 - Java SE
Aula 06 - Java SE
Autor:
Paolla Ramos
03 de Abril de 2024
Índice
1) Java SE - Teoria
..............................................................................................................................................................................................3
..............................................................................................................................................................................................
2) Java SE - Questões Comentadas - Cebraspe 126
..............................................................................................................................................................................................
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
..............................................................................................................................................................................................
10) Java SE - Lista de Questões - Cesgranrio 259
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!
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!
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.
Orientação a
objetos - Baseado
no modelo de
Smalltalk e
Simula67;
Recursos de Rede -
Possui extensa
biblioteca de rotinas
que facilitam a
cooperação com
protocolos TCP/IP,
como HTTP e FTP;
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.
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.
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).
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.
Mais popular do
mundo
Melhora os
serviços de Reduz Custos
aplicativos
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.
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.
Garantias acesso
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.
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.
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.
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.
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.
Então quando Java compila (ou converte) todo o código .java transforma-o em um arquivo .class.
[Link]("Hello World");
Código Java
(.java)
JavaC
Compilador
Bytecode (.class)
a) hashcode.
b) bytecode.
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.
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.
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.
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.
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
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
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.
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.
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.
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
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
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.
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.
Gabarito: Correto.
Empacotamento
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.
Você deve criar os objetos de pacote antes de construir o pacote. Os componentes abaixo fazem
parte do aplicativo. Podem ser os seguintes itens:
Raíz
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().
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
Java oferece mecanismos para definir classes derivadas a partir de classes existentes
Jobject
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.
init ( )
destroy
start ( )
()
Ciclo
de vida
applet
paint ( ) stop ( )
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.
a) I e II.
b) I e III.
c) II e III.
d) III, apenas.
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( );
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.
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.
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).
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:
int a=10;
int a=10;
int b=1;
if (b==3) {
b=a*10;
} else {
int a=100;
b=a*10;
Comentários
// [Link]
O Java também tem comentários tradicionais, que podem ser distribuídos ao longo de várias
linhas, como em
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
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
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!
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.
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.
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.
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).
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:
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
(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.
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.
Operadores Aritméticos +, -, *, /, %.
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).
int a = 5, b = 2, c = 0;
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.
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
com um segundo valor, basta colocar o símbolo da operação antes do sinal "=" e colocar o
segundo valor à direita. Exemplos de uso:
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.
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.
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;
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;
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;
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;
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;
[Link] = nome;
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
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;
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:
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:
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:
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==
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
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.
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
(FGV / IMBEL – 2021) Com relação aos operadores bitwise do Java, considere os valores
binários
a = 00111100
b = 00001101
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.
Vetores
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.
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.
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:
Cada elemento é representado por dois índices (um para cada dimensão), entre colchetes e
adjacentes [ ][ ]. É como uma matriz.
Í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:
Outro modo de uso é declarando, iniciando com o tamanho (quantidade de elementos) do vetor
e depois atribuindo os valores, como o equivalente a seguir:
vetor[0]=34;
vetor[1]=27;
vetor[2]=3;
vetor[3]=2;
[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:
[Link](cars[i]);
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 é:
...
[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.
(FGV / IMBEL – 2021) No contexto da linguagem Java, considere um array definido como
segue.
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]
Gabarito: Letra B.
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:
doubl
byte short char int long float
e
Estreitando Casting (manualmente) - convertendo um tipo maior para um tipo de tamanho menor
(caminho inverso)
int myInt = 9;
[Link](myInt); // Outputs 9
A redução da conversão deve ser feita manualmente, colocando o tipo entre parênteses na frente
do valor:
[Link](myInt); // Outputs 9
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) {
A expressão Booleana pode ser uma das condições lógicas usuais da matemática:
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.
eManha = true;
if (!eManha)
[Link](" é o mesmo que " + hora + " horas."); //Esta linha é incondicionalmente
exibida
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.
if (expressaoBooleana) {
} else {
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.
else
[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) {
if (expressaoBooleana2) {
} else {
} else {
if (expressaoBooleana3) {
} else {
if (hora < 0)
else
else {
else
[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.
if (hora < 0)
else
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.
if (hora < 0)
else
else
else
switch (expressao) {
case constante1:
// 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;
switch (dia) {
case segunda:
[Link]("Segunda ");
case 3:
[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;
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 ");
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.
switch (dia) {
case segunda:
[Link]("Segunda ");
case 3:
[Link]("Terça ");
case 4:
[Link]("Quarta ");
default:
break;
case 5:
[Link]("Quinta ");
case sexta:
[Link]("Sexta ");
break;
case 7:
[Link]("Sábado ");
case 0:
case 1:
[Link]("Domingo ");
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):
while (condition) {
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 {
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++;
(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.
Gabarito: Letra A.
Classes e Objetos
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.
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
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
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:
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:
int x = 5;
[Link](myObj.x);
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:
int x = 5;
[Link](myObj.x);
myObj.x = 40;
myObj.x = 25; // will generate an error: cannot assign a value to a final variable
[Link](myObj.x);
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();)
[Link]("Hello World!");
[Link]("Hello World!");
myMethod();
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 não acesso: não controlam o nível de acesso, mas fornecem outras
funcionalidades.
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.
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
(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.
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.
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.
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"
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
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.
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
public Main() {
Main myObj = new Main(); // Create an object of class Main (This will call the constructor)
// 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:
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.
● 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.
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).
(FGV / MPE-AL – 2018) Sobre as variáveis e os métodos declarados como private, em Java,
analise as afirmativas a seguir.
a) I, apenas.
b) II, apenas.
c) III, apenas.
d) I e II, apenas.
e) II e III, apenas.
_______________________
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.
Herança
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.
package academico;
// Métodos
[Link] = Nome;
return StrNome;
// 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.
SuperClass(String title)
return;
[Link]();
return;
[Link]();
a) static.
b) extends.
c) public.
d) new.
e) this.
Gabarito: Letra B.
classificacao){
if (classificacao < 1)
[Link] = docNumero;
[Link] = classificacao;
{ return docNumero; }
{ return classificacao; }
{ [Link] = docNumero; }
{ [Link] = classificacao; }
{ return classificacao + 1; }
{super(docNumero,classificacao);
[Link] = precedencia; }
{ return precedencia; }
{ [Link] = precedencia; }
@Override
{ return precedencia + 1; }
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;
Gabarito: Letra E.
Interfaces
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
(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
b) não pode haver assinaturas de métodos cujo tipo de retorno seja void.
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.
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.
polimorfismo
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.
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.
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
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 {
catch(Exception e) {
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
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.
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.
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
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.
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.
(FGV/ IBGE – 2017) Um programador Java precisa utilizar um array unidimensional dinâmico
armazenando números inteiros e decide importar a classe [Link].
a) ArrayList<int> arr;
b) ArrayList<int>[] arr;
c) ArrayList<int> arr[];
d) ArrayList<Integer> arr[];
e) ArrayList<Integer> arr.
_______________________
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.
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;
Um Set é uma Collection não ordenada que não contém elementos duplicados.
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
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.
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.
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.
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.
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.
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.
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.
Java 8
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:
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.
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.
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.
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.
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
package cadastroUsuario;
import [Link];
import [Link];
import [Link].*;
import [Link];
import [Link];
import [Link];
request,HttpServletResponse response)
String endereco =
[Link](“endereco”);
String telefone =
[Link](“telefone”);
[Link](“text/html”);
[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](“</BODY>“);
[Link](“</HTML>“);
[Link]( );
A linha
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:
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:
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.
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).
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
função avaliar( a, b )
início
ma <-a;
me <-a;
resultado <- ( ma % me );
se (resultado = 0)
então retorne me
fim
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
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
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.
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
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:
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
a) hotspot.
b) bytecode.
c) compilação estática.
Comentários:
Gabarito: Letra A
11. (CESPE – MPE-CE – 2020) Com base na linguagem de programação Java, julgue o item a
seguir.
O código
[Link](num[i][j]);
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
if(num<1)
return resultado;
resultado+=(num%10);
res);
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
class GeraNumeros {
int num;
num = 36;
[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:
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
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.
Comentários:
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:
Gabarito: Errado
19. (CESPE – TRE-PI – 2016) A linguagem Java foi, originalmente, desenvolvida para
d) trabalhar com inteligência artificial por meio de uma abordagem puramente lógica.
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
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:
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:
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:
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.
avaliacao=”a”;
else
avaliacao=”b”;
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.
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:
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.
Comentários:
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:
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:
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
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 }
Comentários:
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.
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)
{ [Link] = classificacao; }
public int promove()
{ return classificacao + 1; }
}
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
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
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,
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.
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
[Link](out);
}
}
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
Comentários:
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.
a) I, apenas.
b) II, apenas.
c) III, apenas.
d) I e II, apenas.
e) II e III, apenas.
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
Comentários:
Gabarito: Letra C
Assinale o código que exibe corretamente um elemento de cada linha desse array.
Comentários:
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.
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
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
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.
III. JBoss é programado em Java, portanto, pode ser usado em qualquer sistema operacional
que suporte essa linguagem de programação.
a) somente I;
b) somente II;
c) somente III;
d) somente I e II;
e) I, II e III.
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.
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
Gabarito: Letra E
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
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
recebido deste campo para número real e armazená-lo em uma variável chamada renda. A
instrução correta para realizar esta tarefa é
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
==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
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};
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
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.
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.
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.
int n = [Link];
ordena(n, k);
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
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;
dados = [Link](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 Calcula( ) { }
c) public Calcula( ) { }
Comentários:
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]);
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].*;
[Link]("[Link]");
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
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
11. (FCC / TRF3 – 2019) Uma classe Colaborador de uma aplicação Java tem o método abaixo.
[Link] = nome;
Para instanciar um objeto dessa classe e armazenar o nome "Pedro" no atributo nome utiliza-
se
a) [Link]("Pedro");
Comentários:
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
b) não pode haver assinaturas de métodos cujo tipo de retorno seja void.
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
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:
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:
b) Java API.
c) JavaBeans.
d) J2SE.
e) JavaFX.
Comentários:
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:
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:
Comentários:
Gabarito: Letra C
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.
Comentários:
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?
Comentários:
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
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.
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.
Gabarito: Letra B
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
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?
Comentários:
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:
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;
}
}
a) 10
b) 12
c) 14
d) 18
e) 20
Comentários:
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.
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.
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";
x=s1;
y=s2;
z=s3;
try {
catch(Exception e) {
z="a";
throw e;
finally {
if(x==null)
x="***";
if(y==null)
y="***";
if(z==null)
z="***";
return r;
super(s1,s2,s3);
r=x+y+z;
Pa o=null;
try {
catch (Exception e) {
[Link](“***Erro***“);
finally {
if(o!=null)
[Link]([Link]());
Comentários:
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.
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 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.
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.
Gabarito: Letra A
a)
b)
c)
d)
e)
Comentários:
Gabarito: Letra E
package pk1;
package pk3;
package pk3;
import pk2.*;
a) import pk1.*;
import pk2.*;
import pk3.*;
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.*;
o=new A();
o.m2("Brasil"," 2023");
}
}
d) import pk1.*;
import pk2.*;
import pk3.*;
o=new D();
o.m2("Brasil"," 2023");
}
}
e) import pk1.*;
import pk2.*;
import pk3.*;
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:
}
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) );
}
}
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:
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.
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
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--;
}
}
Comentários:
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};
{5,10,10,15,20,20,30,40,50}
int v1[]={10,20,30,40,50};
int v2[]={5,10,15,20};
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?
return;
v3[p3++]=v1[p1++];
intercala(v1,p1,v2,p2,v3,p3);
else {
v3[p3++]=v2[p2++];
intercala(v1,p1,v2,p2,v3,p3);
return;
v3[p3++]=v1[p1++];
intercala(v1,p1,v2,p2,v3,p3);
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
v3[p3++]=v2[p2++];
intercala(v1,p1,v2,p2,v3,p3);
intercala(v1,p1+1,v2,p2+1,v3,p3+1);
else
intercala(v1,p1+1,v2,p2,v3,p3+1);
else
intercala(v1,p1,v2,p2+1,v3,p3+1);
else
return;
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])
v3[p3]=v1[p1];
p3+=1;
p1+=1;
else
v3[p3]=v2[p2];
p3+=1;
p2+=1;
else {
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])
v3[p3]=v1[p1];
p3++;
p1++;
else
v3[p3]=v2[p2];
p3++;
p2++;
else {
v3[p3]=v1[p1];
p1++;
p3++;
v3[p3]=v2[p2];
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 {
public Va() {
a*=2;
b*=3;
c*=4;
public Va(int x) {
this();
sb+=x;
sb*=2;
a+=1;
static {
sb+=8;
[Link](a+b+c+sb);
new Va(1).print();
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.
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.
a=1
b=6
c = 16
sb = 9
Portanto, a soma total é 1 + 6 + 16 + 9 = 32.
Gabarito: Letra E
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.
char c;
int pos;
if ([Link]() == 0)
c = [Link]( 0 );
pos = [Link] ( c );
c = [Link] ( pos );
// 1
// 2;
return c ;
return c ;
==1365fc==
Comentários:
Vamos analisar cada item.
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.
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.
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.
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.
em seguida, continuamos a recursão para o restante da string, sem incluir o primeiro caractere
([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;
b) abstract interface Q {
public int x;
public int y;
[Link](x+y);
c) final interface R {
int x=10;
int y=20;
[Link](x+y);
d) public interface S {
public static int x=10;
x++;
y++;
[Link](x+y);
[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
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.
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
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.
busca(arry,61);
return buscaBin(vet,elem,0,[Link]-1);
private static int buscaBin(int vet[], int elem, int ini, int 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);
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 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.
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];
return [Link]();
[Link](s);
if(![Link]())
return [Link](0);
else
return null;
[Link](0,s);
if(![Link]())
return [Link]([Link]()-1);
else
return null;
[Link](0,s);
if(![Link]())
return [Link](0);
else
return null;
[Link](s);
if(![Link]())
return [Link]([Link]()-1);
else
return null;
[Link]([Link](),s);
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.
Gabarito: Letra B
String s1=”Brasil”,s2=””;
[Link](s2);
if(cont==[Link]())
return s2;
String vogal=”aeiou”;
char c=[Link]([Link]()-cont-1);
if([Link](c) < 0)
s2+=[Link](c);
else
s2+=”.”;
cont++;
a) .i.a..
b) ..a.i.
c) [Link]
d) Br.s.l
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.
Gabarito: Letra C
[Link](o.fin([Link](), 5));
}
}
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.
int ini=0,fim=25;
void print() {
[Link](ini+fim);
}
{
ini=fim%7;
fim=ini*3;
}
Tst(int a, int b) {
ini+=a;
fim+=b;
}
{
ini/=2;
fim+=10;
}
}
a) 0
b) 10
c) 24
d) 25
e) 33
Comentários:
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.
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;
}
}
Qual construtor poderá ser inserido na classe A2, sem que um erro de compilação seja
gerado?
a) public A2() {
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.
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 {
public MnopA() {
x*=2;
}
{
y+=5;
z+=10;
}
}
a) 3
b) 4
c) 19
d) 27
e) 31
Comentários:
Pessoal, o código define três classes:
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.
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.
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).
Gabarito: Letra E
19. (CESGRANRIO - UNIRIO - 2019) As classes e interfaces Java a seguir ocupam arquivos
distintos, situados no pacote default.
void a_m01();
void a_m02();
void b_m01();
A)
public class XY extends CA implements ITB {
public void b_m01() {
B)
public class XY extends CA implements ITA {
public void b_m01() {
void op02( ) {
C)
public class XY extends CA implements ITA {
public void b_m01() {
D)
public class XY extends CA implements ITA {
public void b_m01() {
E)
public abstract class XY extends CA implements ITB {
public void b_m01() {
}
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() {
v1=v2=0;
v1+=20;
v2+=30;
[Link](v1+v2);
v1*=2;
v2*=3;
public CY() {
v1+=10;
v2+=20;
public CZ(int c) {
v1*=3+c;
v2*=3+c;
CX p=new CZ(5);
[Link]();
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.
Gabarito: Letra B
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;
}
a) 1 e 15
b) 3 e 9
c) 3 e 15
d) 8 e 9
e) 8 e 15
Comentários:
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.
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.
Gabarito: Letra E
22. (CESGRANRIO - Transpetro - 2018) Considere as seguintes classes Java, que ocupam arquivos
separados:
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;
}
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]());
}
}
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.
Gabarito: Letra C
Comentários:
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
import [Link];
import [Link];
import [Link].*;
import [Link];
import [Link];
import [Link];
[Link]( );
}
}
A linha
String nome = [Link](“nome”);
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).
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);
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 }
2. (FGV – TJDFT – 2022) Observe as classes abaixo descritas na linguagem de programação Java.
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; }
}
4. (FGV – DPE-RJ – 2019) Considere as seguintes afirmativas sobre class constructor na linguagem
Java.
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”.
7. (FGV – MPE-AL – 2018) Sobre as variáveis e os métodos declarados como private, em Java,
analise as afirmativas a seguir.
a) I, apenas.
b) II, apenas.
c) III, apenas.
d) I e II, apenas.
e) II e III, apenas.
Assinale o código que exibe corretamente um elemento de cada linha desse array.
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
11. (FGV – ALE-RO – 2018) Sobre construtores (constructors), no contexto da linguagem Java,
analise as afirmativas a seguir.
==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
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 é
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.
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};
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
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.
e) III está incorreto, pois não existe o método add neste contexto.
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.
int n = [Link];
ordena(n, k);
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
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;
dados = [Link](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.
public Calcula( ) { }
c) public Calcula( ) { }
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]);
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].*;
[Link]("[Link]");
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
11. (FCC / TRF3 – 2019) Uma classe Colaborador de uma aplicação Java tem o método abaixo.
[Link] = nome;
Para instanciar um objeto dessa classe e armazenar o nome "Pedro" no atributo nome utiliza-
se
a) [Link]("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
b) não pode haver assinaturas de métodos cujo tipo de retorno seja void.
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
14. (FCC – TRE-RN – 2011) Em relação ao Java Standard Edition, é INCORRETO afirmar:
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:
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:
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?
2. (CESGRANRIO – Banco do Brasil – 2023) Sejam as seguintes classes Java, que ocupam arquivos
separados:
protected int a;
protected int b;
public CAx() {
a*=2;
b*=3;
a=1;
b=2;
return op2(x)+op3(x)+b;
return x+a;
return x*2;
protected int a;
public CBy() {
a+=3;
b+=3;
return x-a;
return x*3;
[Link](o.op1(2));
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;
String r="vazio";
x=s1;
y=s2;
z=s3;
try {
catch(Exception e) {
z="a";
throw e;
finally {
if(x==null)
x="***";
if(y==null)
y="***";
if(z==null)
z="***";
return r;
super(s1,s2,s3);
r=x+y+z;
Pa o=null;
try {
catch (Exception e) {
[Link](“***Erro***“);
finally {
if(o!=null)
[Link]([Link]());
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)
b)
c)
d)
e)
5. (CESGRANRIO - Transpetro - 2023) Considere as seguintes classes e a interface Java que ocupam
arquivos separados:
package pk1;
package pk2;
package pk3;
import pk2.*;
import pk1.*;
[Link](" B - m3 ");
package pk3;
[Link](" C - m4 ");
package pk3;
import pk2.*;
[Link](" C - m4 ");
a) import pk1.*;
import pk2.*;
import pk3.*;
Itf o;
o=new B();
o.m2("Brasil"," 2023");
b) import pk1.*;
import pk2.*;
import pk3.*;
Itf o;
o=new pk3.B();
o.m2("Brasil"," 2023");
c) import pk1.*;
import pk2.*;
import pk3.*;
Itf o;
o=new A();
o.m2("Brasil"," 2023");
d) import pk1.*;
import pk2.*;
import pk3.*;
Itf o;
o=new D();
o.m2("Brasil"," 2023");
e) import pk1.*;
import pk2.*;
import pk3.*;
Itf o;
o=new pk3.C();
o.m2("Brasil"," 2023");
6. (CESGRANRIO - Transpetro - 2023) Considere as seguintes classes Java, que ocupam arquivos
separados:
public Err01() { }
public Err01(String m) {
super(m);
public Err02() { }
public Err02(String m) {
super(m);
try {
if(a < 0)
if(b < 0)
if(b == 0)
catch(Err01 e) {
return a / b;
try {
if(a < 0)
if(b <= 0)
catch(Err02 e) {
return a / b;
try {
if(a < 0)
if(b <= 0)
catch(Err01 e) {
catch(Err02 e) {
catch(Exception e) {
return a / b;
try {
if(a < 0)
if(b < 0)
if(b == 0)
catch(Exception e) {
return a / b;
try {
if(a < 0)
if(b < 0)
if(b == 0)
catch(Err01 e) {
catch(Err02 e) {
return a / b;
7. (CESGRANRIO - Transpetro - 2023) Sejam as seguintes classes Java, que ocupam arquivos separados:
public class L1 {
public L1() {
a *= 2;
b *= 2;
c *= 2;
return x + 5;
a++;
b--;
public L2() {
c+=2;
L2 o=new L2();
[Link]([Link](2,3));
a) 6
b) 7
c) 9
d) 19
e) 21
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};
{5,10,10,15,20,20,30,40,50}
int v1[]={10,20,30,40,50};
int v2[]={5,10,15,20};
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?
return;
v3[p3++]=v1[p1++];
intercala(v1,p1,v2,p2,v3,p3);
else {
v3[p3++]=v2[p2++];
intercala(v1,p1,v2,p2,v3,p3);
return;
v3[p3++]=v1[p1++];
intercala(v1,p1,v2,p2,v3,p3);
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
v3[p3++]=v2[p2++];
intercala(v1,p1,v2,p2,v3,p3);
intercala(v1,p1+1,v2,p2+1,v3,p3+1);
else
intercala(v1,p1+1,v2,p2,v3,p3+1);
else
intercala(v1,p1,v2,p2+1,v3,p3+1);
else
return;
v3[p3]=v1[p1];
else
v3[p3]=v2[p2];
else
v3[p3]=v1[p1];
else
v3[p3]=v2[p2];
v3[p3]=v1[p1];
p3+=1;
p1+=1;
else
v3[p3]=v2[p2];
p3+=1;
p2+=1;
else {
v3[p3]=v1[p1];
p1+=1;
p3+=1;
v3[p3]=v2[p2];
p3+=1;
p2+=1;
v3[p3]=v1[p1];
p3++;
p1++;
else
v3[p3]=v2[p2];
p3++;
p2++;
else {
v3[p3]=v1[p1];
p1++;
p3++;
v3[p3]=v2[p2];
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 {
public Va() {
a*=2;
b*=3;
c*=4;
public Va(int x) {
this();
sb+=x;
sb*=2;
a+=1;
static {
sb+=8;
[Link](a+b+c+sb);
new Va(1).print();
a) 16
b) 31
c) 33
d) 39
e) 41
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.
char c;
int pos;
if ([Link]() == 0)
c = [Link]( 0 );
pos = [Link] ( c );
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.
return c ;
return c ;
11. (CESGRANRIO - BASA - 2022) Qual definição de interface Java NÃO produz erro de compilação?
a) interface P {
int x;
int y;
b) abstract interface Q {
public int x;
public int y;
[Link](x+y);
c) final interface R {
int x=10;
int y=20;
[Link](x+y);
d) public interface S {
x++;
y++;
[Link](x+y);
[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.
busca(arry,61);
return buscaBin(vet,elem,0,[Link]-1);
private static int buscaBin(int vet[], int elem, int ini, int 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);
a) 96 80 60
b) 96 133 220
c) 96 55 60 80
d) 96 55 80 60
13. (CESGRANRIO - BASA - 2021) A classe Queue a seguir é uma implementação parcial do tipo abstrato
de dados Fila.
import [Link];
return [Link]();
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?
[Link](s);
if(![Link]())
return [Link](0);
else
return null;
[Link](0,s);
if(![Link]())
return [Link]([Link]()-1);
else
return null;
[Link](0,s);
if(![Link]())
return [Link](0);
else
return null;
[Link](s);
if(![Link]())
return [Link]([Link]()-1);
else
return null;
[Link]([Link](),s);
if(![Link]())
return [Link]([Link]()-1);
else
return null;
String s1=”Brasil”,s2=””;
[Link](s2);
if(cont==[Link]())
return s2;
String vogal=”aeiou”;
char c=[Link]([Link]()-cont-1);
if([Link](c) < 0)
s2+=[Link](c);
else
s2+=”.”;
cont++;
a) .i.a..
b) ..a.i.
c) [Link]
d) Br.s.l
e) Brasil
return “abcdefghijklmnop“;
return “0123456789ABCDEF“;
[Link]([Link]([Link](), 5));
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.
int ini=0,fim=25;
void print() {
[Link](ini+fim);
ini=fim%7;
fim=ini*3;
Tst(int a, int b) {
ini+=a;
fim+=b;
ini/=2;
fim+=10;
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 {
public A1(int x) {
va1+=x;
va2*=x;
class A2 extends A1 {
class A3 extends A2 {
public A3(int y) {
vc1=(va1+va2)*y;
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;
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].
class MnopA {
public MnopA() {
x*=2;
==1365fc==
y+=5;
z+=10;
public MnopB(int c) {
y*=c;
z+=y;
static {
x=y=z=1;
[Link](MnopB.x+MnopB.y+MnopB.z);
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.
void a_m01();
void a_m02();
void b_m01();
A)
B)
void op02( ) {
C)
D)
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() {
v1=v2=0;
v1+=20;
v2+=30;
[Link](v1+v2);
v1*=2;
v2*=3;
public CY() {
v1+=10;
v2+=20;
public CZ(int c) {
v1*=3+c;
v2*=3+c;
CX p=new CZ(5);
[Link]();
a) 100
b) 240
c) 640
d) 1280
e) 1680
import [Link];
public class X
public X(int w)
{ y = w;
{ z = [Link](y) + 1;
return z;
{ return y;
{ X k = new X(6);
X m = k;
X n = new X(3);
int p;
p = k.r()+m.s()+n.r();
[Link](p);
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 WA() {
a=b=10;
b=0;
else
a=0;
---------------------------------------------------
public ZB() {
a+=5;
b+=5;
faa();
return a+b;
try {
catch(Exception e.) {
a=b=0;
return;
finally {
a+=3;
b+=3;
---------------------------------------------------
WA w=new ZB();
[Link]([Link]());
a) 0
b) 5
c) 6
d) 15
e) 16
b) sobrecarga de operadores
c) herança múltipla
d) polimorfismo
e) ponteiros
GABARITO