para concursos

Propaganda
Java
para concursos
Questões comentadas
Handbook de Questões de TI Comentadas para Concursos
Volume questões de TI
Prefácio
Concebida inicialmente para ser utilizada no desenvolvimento de pequenos aplicativos e programas de controle de aparelhos eletrônicos, a linguagem de programação orientada a objeto
Java, com o boom da Internet, foi rapidamente adaptada aos conceitos da Internet, dando às
páginas HTML conteúdos mais dinâmico.
Desde o seu lançamento, em maio de 1995, Java foi rapidamente adotada pelos desenvolvedores, estando presente em diversos tipos de web browsers, celulares, mainframes, etc.
Com algumas características peculiares, como multi-plataforma, alto desempenho, segurança,
código interpretado, a linguagem Java está presente em muitos projetos, e por esta crescente
utilização, a linguagem Java tornou-se um padrão para o mercado.
Seguindo este cenário, o assunto Java sempre é cobrado nas provas de concursos públicos. Para
você pode ser preparar melhor neste tema, o Grupo Handbook de TI preparou o volume Java,
que traz uma séria de questões comentadas sobre tal tópico.
Bons estudos,
Grupo Handbook de TI
Página 1 de 51
www.handbookdeti.com.br
Handbook de Questões de TI Comentadas para Concursos
Volume questões de TI
Direitos Autorais
Este material é registrado no Escritório de Direitos Autorais (EDA) da Fundação Biblioteca
Nacional. Todos os direitos autorais referentes a esta obra são reservados exclusivamente aos
seus autores.
Os autores deste material não proíbem seu compartilhamento entre amigos e colegas próximos de estudo. Contudo, a reprodução, parcial ou integral, e a disseminação deste material de
forma indiscriminada através de qualquer meio, inclusive na Internet, extrapolam os limites da
colaboração. Essa prática desincentiva o lançamento de novos produtos e enfraquece a comunidade concurseira Handbook de TI.
A série
Handbook de Questões de TI Comentadas para Concursos Além do Gabarito
produção independente e contamos com você para mantê-la sempre viva.
Grupo Handbook de TI
Página 2 de 51
www.handbookdeti.com.br
é uma
Handbook de Questões de TI Comentadas para Concursos
Volume questões de TI
Canais de Comunicação
O Grupo Handbook de TI disponibiliza diversos canais de comunicação para os concurseiros
de TI.
Loja Handbook de TI
Acesse a nossa loja virtual em
http://www.handbookdeti.com.br
Serviço de Atendimento
Comunique-se diretamente conosco através do e-mail
[email protected]
Twitter do Handbook de TI
Acompanhe de perto promoções e lançamentos de produtos pelo nosso Twitter
com/handbookdeti
Página 3 de 51
www.handbookdeti.com.br
http://twitter.
Handbook de Questões de TI Comentadas para Concursos
1.
Volume questões de TI
Assuntos relacionados: Servidor de Aplicações, J2EE, EJB, WAR, JAR, EAR,
Banca: CESGRANRIO
Instituição: BNDES
Cargo: Analista de Suporte
Ano: 2008
Questão: 42
Uma aplicação empresarial contendo componentes EJB e módulos web deverá ser publicada
em um servidor de aplicação compatível com J2EE. No contexto do empacotamento dessa
aplicação para publicação (deploy), é correto armar que
(a). não há como juntar componentes EJB e módulos web em uma mesma aplicação,
pois deverão ser publicados separadamente.
(b). um arquivo EAR poderá conter arquivos WAR e JAR representativos dos módulos
web e EJB.
(c). o tamanho do pacote, em bytes, sempre ca maior que o código original, em virtude
do algoritmo empregado no empacotamento da aplicação em um arquivo EAR.
(d). módulos web não devem ser empacotados, pois isso inviabiliza seu acesso pela
Internet.
(e). arquivos JAR servem apenas para empacotar componentes EJB.
Solução:
Os arquivos JAR (Java Archive) agrupam arquivos de classes e os recursos utilizados por
essas classes, como imagens e propriedades. Os pacotes JAR são muito utilizados no mundo
Java e são facilmente visualizáveis por softwares de descompactação populares, como o Winzip. A utilização desses arquivos JAR não se restringe ao empacotamento de componentes
EJB, pois também são utilizados para empacotar componentes Java não pertencentes ao
padrão J2EE. Concluímos, então, que a alternativa E está incorreta.
O que difere um arquivo JAR comum e um arquivo JAR que armazena componentes EJB são
os arquivos manifest, cuja nalidade é fornecer informações adicionais que serão utilizadas
em tempo de execução. Os arquivos JAR comuns possuem o arquivo meta-inf/Manifest.mf.
Já os arquivos que armazenam EJBs possuem o arquivo META_INF/ejb-jar.xml.
Os módulos web podem ser empacotados em arquivos com extensão WAR (Web Archive) e
não há problema nenhum em relação ao seu acesso pela Internet, pois uma vez que o arquivo
WAR siga as especicações do padrão J2EE, o container web do servidor de aplicação será
responsável por gerar os arquivos HTML para serem entregues ao browser. Logo, a alternativa D está incorreta.
A alternativa C está errada, uma vez que os arquivos JAR, WAR etc.
são compactados
e tendem a possuir tamanho reduzido, embora não haja garantia de que sejam menores que
o código original.
Um arquivo EAR (Enterprise Application Archive) é utilizado para permitir que uma aplicação J2EE complexa possa ser facilmente instalada em um servidor J2EE. Ele permite
agrupar pacotes JAR comuns, pacotes JAR com EJBs e pacotes WAR. Portanto, a alternativa B é a alternativa correta para a questão.
Página 4 de 51
www.handbookdeti.com.br
Handbook de Questões de TI Comentadas para Concursos
2.
Volume questões de TI
Assuntos relacionados: Servidor de Aplicações, J2EE, JEE, .NET, MVC,
Banca: CESGRANRIO
Instituição: Petrobras
Cargo: Analista de Sistemas - Eng. de Software
Ano: 2008
Questão: 47
Um servidor de aplicações provê diversos serviços para as aplicações que hospeda. Considerandose implementações típicas em J2EE/JEE e .NET, compondo uma arquitetura em 3 camadas,
é correto armar que, dentre os serviços oferecidos pelos servidores de aplicações, encontra-se
(a). validação de objetos de domínio, segundo as regras de negócio da aplicação.
(b). geração de código através de MDA (Model Driven Architecture).
(c). persistência nal dos objetos de domínio.
(d). suporte nativo à arquitetura MVC.
(e). estrutura para troca de mensagens entre aplicações.
Solução:
O objetivo dos servidores de aplicações é disponibilizar uma plataforma que permita aos
programadores abstrair de uma gama de tarefas inerentes ao desenvolvimento do software.
Dessa forma, os programadores podem se concentrar mais nas regras de negócio do que nas
questões de infraestrutura da aplicação, como segurança, disponibilidade, balanceamento de
carga, mensageiria etc.
Para aplicações simples, a utilização de um servidor de aplicações pode representar um
overhead ao invés de facilitar as tarefas dos programadores.
No entanto, para grandes
aplicações comerciais com requisitos mais rígidos de desempenho e robustez a falhas, os
servidores de aplicações mostram-se muito úteis.
Embora o conceito de servidor de aplicações seja aplicável para o desenvolvimento em uma
grande quantidade de linguagens, nos últimos anos os que mais se tornaram populares são
os servidores de aplicações J2EE (ou JEE, nas versões mais recentes), criados para suportar
aplicações escritas em Java.
Para exemplicar o conjunto de serviços que os servidores de aplicações podem oferecer,
vejamos a Figura 1. Ela mostra a arquitetura JEE mais recente, publicada pela Sun Microsystems no documento JSR-000316.
No esquema mostrado nessa gura, tanto o Web
Container quanto o EJB Container são hospedados no servidor de aplicações, que oferece
serviços diversos por meio de várias APIs. A API JMS (Java Message Service), por exemplo, oferece suporte a comunicação ponto-a-ponto conável. A API JavaMail permite que as
aplicações enviem e-mails sem ter que se preocupar com as questões de las de mensagens,
falhas etc. A API JASS, por sua vez, oferece facilidades para implementação de autenticação
e autorização nas aplicações.
Vale lembrar que os servidores de aplicações também oferecem facilidades para persistência
de dados, como lembrado na alternativa C. No entanto, a palavra nal torna a alternativa,
ao menos, duvidosa!
Já no caso da alternativa D, é de se esperar que um ambiente tão cheio de funcionalidades como um servidor de aplicações ofereça suporte a construção de aplicações segundo
Página 5 de 51
www.handbookdeti.com.br
Handbook de Questões de TI Comentadas para Concursos
Volume questões de TI
o modelo MVC. No entanto, a construção de uma aplicações que obedeça ao MVC está
muito mais ligada a separação dos componentes e camadas do sistema do que à plataforma
tecnológica utilizada. É, portanto, possível construir aplicações MVC no bom e velho ASP,
bem como nos novos e modernos servidores de aplicações.
A validação de objetos de que trata a alternativa A é feita pelos servidores de aplicações,
mas não está relacionada as regras de negócio das aplicações.
A geração automática de
código, por sua vez, é uma tarefa comum às IDEs, e não aos servidores de aplicações.
Portanto, a alternativa E, por ser a mais objetiva e clara, é a resposta correta para essa
questão.
Figura 1: arquitetura JEE 6.0.
Página 6 de 51
www.handbookdeti.com.br
Handbook de Questões de TI Comentadas para Concursos
3.
Volume questões de TI
Assuntos relacionados: J2EE, Java Transaction API (JTA), MVC,
Banca: Cesgranrio
Instituição: Petrobras
Cargo: Analista de Sistemas - Infraestrutura
Ano: 2008
Questão: 63
A aplicação do padrão MVC (Model-View-Controller ) no desenvolvimento de aplicações Web
J2EE permite dividir a aplicação em camadas e resolver uma série de problemas. Sobre os
recursos da arquitetura J2EE e o desenvolvimento de aplicações J2EE utilizando o MVC,
são feitas as armativas abaixo.
I - Uma possível estratégia no desenvolvimento de um site Web seria utilizar páginas
JSP para construir a camada View, Servlets para a camada Controller e EJBs para a
camada Model.
II - A API JTA do J2EE permite aos clientes de EJB obter um contexto inicial a partir
do qual é possível recuperar o objeto Home de um EJB.
III - Na demarcação de transação gerenciada pelo container, se o atributo transacional
associado ao método de um EJB for denido como Required, o container sempre criará
uma nova transação a cada chamada do método.
Está(ão) correta(s) a(s) armativa(s)
(a). I, apenas.
(b). II, apenas.
(c). III, apenas.
(d). I e II, apenas.
(e). I, II e III.
Solução:
Abordaremos cada item.
Sobre o Item I
A plataforma J2EE (Java
2 Platform, Enterprise Edition )
é uma solução baseada em com-
ponentes para projeto, desenvolvimento, montagem e disponibilização de aplicações distribuídas em ambientes corporativos.
Tipicamente, as aplicações J2EE são divididas em 3
camadas:
•
Cliente;
•
Web;
•
Negócios;
A Figura 2 exemplica a arquitetura J2EE. A partir da Figura 2, identicamos a existência
de containers, que são ambientes que fornecem um conjunto de serviços para os componentes
apropriados (Apache Tomcat é um tipo de container).
Página 7 de 51
www.handbookdeti.com.br
Handbook de Questões de TI Comentadas para Concursos
Volume questões de TI
Figura 2: arquitetura J2EE.
Podemos observar, também, a existência de dois tipos de clientes:
•
Cliente Web:
páginas Web dinamicamente geradas por componentes Web (JSP ou
Servlets) e que são exibidas no browser;
•
Cliente Aplicação: permite que o usuário interaja com o servidor da aplicação através
de interfaces mais complexas, geralmente através de APIs.
Já do lado servidor, encontramos dois containers:
•
Container EJB (Enterprise
Java Beans ) que implementa toda a lógica do negócio,
isto
é, encapsula o código (com classes, métodos e atributos) que realiza o propósito da
aplicação;
•
Container WEB que contém:
Servlets: classes que processam dinamicamente as requisições e constroem respostas na forma de páginas HTML;
Páginas JSP (Java
Server Pages ):
permitem a mistura de páginas HTML, está-
ticas, com conteúdos gerados dinamicamente pelos Servlets.
Note que os Servlets atuam como uma camada intermediária entre a requisição proveniente
do Web browser (ou outro cliente http) e o banco de dados (ou aplicação no servidor http).
É importante mencionar que, quando uma página JSP é requisitada pela primeira vez,
o container a compila gerando um Servlet. Nas chamadas sucessivas essa etapa não é mais
necessária (a não ser que a JSP tenha sido modicada). Portanto, as páginas JSP são, em
última instância, processadas como Servlets.
Após esta breve revisão sobre J2EE, relembremos o signicado do padrão MVC. MVC é
um padrão de arquitetura de software utilizado para separar dados ou lógica de negócios
(Model) da interface do usuário (View) e do uxo da aplicação (Control). Sua ideia central
é permitir que uma mesma lógica de negócio possa ser acessada e visualizada através de
várias interfaces. Outro benefício considerável dessa abordagem é que alterações feitas no
layout não afetam a manipulação de dados.
A partir do que foi exposto acima, conseguimos identicar que a página JSP (mistura de
HTML com Servlet), representa a camada View, uma vez que compõe a interface com o
usuário. O Servlet representa a camada Control, pois atua como uma camada intermediária
Página 8 de 51
www.handbookdeti.com.br
Handbook de Questões de TI Comentadas para Concursos
Volume questões de TI
entre o Web browser e o EJB. Por m, o EJB representada a camada Model, já que implementa toda a lógica do negócio. Portanto, o item I está correto.
Sobre o Item II
JTA (abreviação de
Java Transaction API ) é uma especicação feita pela Sun Microsystems
(criadora do Java) visando padronizar o uso de transações distribuídas feitas por aplicativos
Java.
Basicamente, isso signica que ela pode ser usada para fazer commit, rollback ou criar
transações, ao invés de usar transações diretamente pelo driver JDBC. A principal vantagem que o uso de JTA acarreta, contudo, é a possibilidade de executar transações globais
(unidades lógicas de trabalho que seguem 4 princípios fundamentais: atomicidade, consistência, isolamento e durabilidade).
JTA dene somente as interfaces que um aplicativo deve chamar para fazer uso de transações distribuídas, mas deve ser implementada por algum serviço que implemente essa
API. Praticamente todo
application server, atualmente,
Transaction Manager.
tem uma implementação dessas,
que é normalmente chamada de
Na plataforma J2EE, é a JNDI (Java
Naming and Directory Interface )
que fornece uma in-
terface padrão para localização de usuários, máquinas, redes, objetos e serviços, permitindo
aos clientes a obtenção do contexto inicial de um objeto a partir do nome do componente.
Portanto o item II está errado.
Sobre o Item III
A grande vantagem da gerência transacional em J2EE é que ela esconde os detalhes de
baixo-nível, assim, o desenvolvedor pode assumir que qualquer recurso transacional será
adequadamente tratado pela plataforma, usando, para tanto, demarcações transacionais
declarativas (também chamadas de implícitas) ou usando demarcações transacionais programáticas (também chamada de explícitas).
Uma demarcação transacional é basicamente a denição do ponto onde ela se inicia (usa-se
o comando
Begin )
e o ponto onde ela termina (usa-se o comando
Commit ).
Em J2EE as
transações podem ser demarcadas de três maneiras:
•
Declarativa (CMT -
Container-Managed Transactions ):
o container manipula a demar-
cação transacional;
•
Programática (BMT -
Bean Managed Transactions ):
os EJBs manipulam a demarcação
transacional;
•
Iniciada pelo cliente: código cliente manipula a demarcação transacional (ex. cliente
WEB).
Portanto, estamos diante de uma transação declarativa (gerenciada pelo container), a qual
possui os seguintes atributos transacionais (o atributo especica como o componente irá
reagir quando o seu método for chamado por um cliente dentro ou fora do contexto de uma
transação):
• Required :
indica que o escopo de uma transação é requerido pelo método. Se não existe
transação, uma nova é criada e dura até que o método termine (é propagada para todos
Página 9 de 51
www.handbookdeti.com.br
Handbook de Questões de TI Comentadas para Concursos
Volume questões de TI
os métodos chamados). Caso já exista uma transação iniciada pelo cliente, o bean é
incluído no seu escopo durante a chamada do método (já podemos eliminar o item III);
• Supports :
indica que o método suporta transações. Será incluído no escopo da tran-
sação do cliente se existir.
Se ele for chamado fora do escopo de uma transação ele
realizará suas tarefas sem transações e pode chamar objetos que não suportam transações;
• RequiresNew :
indica que o método requer uma nova transação.
Estando ou não o
cliente no escopo de uma transação, o bean irá iniciar uma nova transação que iniciará
e terminará no bean;
• NotSupported :
indica que o método não suporta transações. Se o método for chamado
pelo cliente no escopo de uma transação, a mesma será suspensa enquanto durar a
chamada do método (não haverá propagação de transações do cliente);
• Mandatory :
indica que o método só pode ser chamado no escopo de uma transação do
cliente;
• Never :
indica que o método nunca pode estar dentro de uma transação. Se o cliente que
chama o método for parte de uma transação, o bean irá provocar um RemoteException
(ou EJBException em clientes locais).
Logo, a alternativa
A está correta.
Página 10 de 51
www.handbookdeti.com.br
Handbook de Questões de TI Comentadas para Concursos
4.
Volume questões de TI
Assuntos relacionados: Linguagens de Programação, Java, JavaServer Pages (JSP),
Banca: ESAF
Instituição: Agência Nacional de Águas (ANA)
Cargo: Analista Administrativo - Tecnologia da Informação e Comunicação / Desenvolvimento de Sistemas e Administração de Banco de Dados
Ano: 2009
Questão: 32
Analise as seguintes armações a respeito de JSP:
I. Em uma aplicação
Web,
há apenas um objeto page em cada JSP.
II. Comentários JSP aparecem na resposta ao cliente.
III. Os objetos com escopo
session
duram por toda a sessão de navegação do cliente.
Assinale a opção correta.
(a). Apenas a armação I é verdadeira.
(b). Apenas a armação II é verdadeira.
(c). Apenas a armação III é verdadeira.
(d). As armações I, II e III são verdadeiras.
(e). Nenhuma das armações é verdadeira.
Solução:
JavaServer Pages
(JSP) é uma tecnologia baseada em Java utilizada no desenvolvimento
Active Server Page (ASP) e
PHP. Ela faz parte de uma tecnologia maior referida como Java 2 Enterprise Edition (J2EE).
de páginas Web com conteúdo dinâmico, similar às tecnologias
Além das tags HTML, que geram o conteúdo estático, uma página JSP também contém
elementos JSP especiais que permitem inserir conteúdo dinâmico por meio dos elementos
JSP. Os elementos JSP são processados pelo servidor Web antes da página HTLM ser enviada de volta ao browser. Ou seja, quando o usuário faz uma requisição a uma página JSP,
o servidor executa os elementos JSP da página, inserindo os resultados dos mesmos junto a
parte estática da página, e envia a página HTML para o usuário. A tecnologia JSP pode ser
usada, por exemplo, para recuperar informação em um banco de dados, manipular arquivos,
obter informações sobre o visitante, etc.
Após uma breve introdução de JSP, a seguir, analisamos as armativas da questão:
I. Como forma de facilitar a programação Web, em uma página JSP existem 9 objetos
instanciados, conhecidos como Objetos Implícitos, que são:
page :
representa a própria página JSP, ou melhor, uma instância da classe
servlet
na qual a página foi convertida. É simplesmente um sinônimo para this;
cong :
armazena os parâmetros de inicialização (conguração) do servlet da página
JSP;
request : solicitação que aciona o processamento da página;
response : responsável pela devolução do resultado ao usuário;
out : representa o uxo de saída (output) para a página em si;
pageContext : dados de contexto para a execução da página;
session : representa a sessão atual de um usuário individual;
Página 11 de 51
www.handbookdeti.com.br
Handbook de Questões de TI Comentadas para Concursos
Volume questões de TI
application : representa a aplicação à qual a página pertence;
exception : incluso nas páginas especícas para tratar exceções ou erros não capturados.
Para cada página JSP processada existe um
faz outro também deve fazer.
servlet
correspondente, ou seja, o que um
Como o objeto page faz referência ao
servlet
gerado,
existe um objeto page para cada JSP. Portanto, esta armativa é verdadeira.
II. Como qualquer linguagem de programação Web, os comentários não aparecem na resposta ao cliente. Logo, esta armativa é falsa.
III. O escopo de um objeto está relacionado com as páginas JSPs que podem acessar o
objeto. Os escopos disponíveis são:
objeto que possui escopo
application, request, response, page
session está disponível para
session estão disponíveis
todos os objetos vinculados à
A principal utilização do escopo
session
todas as JSPs e
session. O
os servlets, e
e
para toda a sessão de usuário.
é manter os estados de conexão entre cliente e ser-
vidor, pois o protocolo HTTP não armazena informações de estado. Isso permite o usuário
navegar entre várias páginas na aplicação Web sem perda de informações referentes à sessão
de usuário. Um exemplo típico de utilização do escopo
session
é em autenticação de usuá-
rios, onde é possível restringir acesso a determinadas páginas.
Portanto, esta armativa é verdadeira porque os objetos com o escopo
session
duram du-
rante toda a sessão negação do cliente.
Após a análise das armativas, chegamos a conclusão que as armativas I e III são verdadeiras. Portanto, a alternativa correta é a
(E).
Note que o gabarito fornecido para esta
questão não confere com o gabarito ocial. Possivelmente, a banca que organizou a prova
deve ter cometido um equívoco na armativa I.
Página 12 de 51
www.handbookdeti.com.br
Handbook de Questões de TI Comentadas para Concursos
5.
Volume questões de TI
Assuntos relacionados: Java,
Banca: CESGRANRIO
Instituição: Petrobras
Cargo: Analista de Sistemas - Eng. de Software
Ano: 2008
Questão: 61
testDescontoValido() valida a vericação para o produto caderno, mas gera uma exceção
para o produto caneta, indicando que o desconto de 90% não é válido para canetas, o que
está incorreto. A causa do problema e uma possível solução seriam:
(a).
CAUSA: uso de aritmética binária de ponto utuante para os cálculos (variáveis
do tipo double) com posterior tentativa de comparação exata entre os valores
calculados (linha 21).
SOLUÇÃO: usar aritmética decimal exata substituindo os
valores primitivos double por instâncias da classe BigDecimal.
(b).
CAUSA:
arredondamento automático devido ao uso na mesma expressão dos
tipos int e double (linha 14) sem conversão de tipos (typecasting).
SOLUÇÃO:
transformar o parâmetro percentual em double ou realizar um typecasting explícito
de int para double na expressão.
(c).
(d).
CAUSA: versão antiga da máquina virtual Java, que apresenta esse tipo de problema até a versão 1.1. SOLUÇÃO: atualizar para a última versão da JVM.
CAUSA: falta da inclusão do pacote java.lang.math em Produto. SOLUÇÃO:
incluir o pacote através de uma declaração import.
(e).
CAUSA: mistura de elementos de escopos diferentes (classe e método) na expressão lógica de retorno. SOLUÇÃO: atribuir o precoMinimo a uma variável local
e utilizá-la na comparação ou tornar precoComDesconto um campo de Produto.
Solução:
(A) CORRETA
Observe, no código acima, que as variáveis preco, precoMinimo e precoComDesconto são
do tipo double. Observe, também, que o programa está tratando com partes fracionais de
uma unidade monetária, que assumiremos ser o real somente para ns ilustrativos, e então
precisa de um tipo que permite pontos decimais em seus valores.
Infelizmente, números em ponto utuante podem causar transtornos. O problema que ocorre
no código acima é devido ao uso do tipo double (ou oat) para representar quantias em reais
(assumindo que quantias de real são mostradas com dois dígitos a direita do ponto decimal).
Dessa forma, após a chamada do construtor Produto, poderemos ter as seguintes quantias
armazenadas para o produto caderno:
•
na varável privada preco: 10.000 e exibição 10.00;
•
na variável privada precoMinimo: 0.999, o qual seria arrendondado normalmente para
1.00 para propósitos de exibição.
O mesmo pode ocorrer para o produto caneta após a invocação do construtor Produto:
•
na varável privada preco: 1.000 e exibição 1.00;
•
na variável privada precoMinimo: 0.101, o qual seria arrendondado normalmente para
0.10 para propósitos de exibição.
Página 13 de 51
www.handbookdeti.com.br
Handbook de Questões de TI Comentadas para Concursos
Volume questões de TI
Assim, após a invocação do método descontoValido pelos produtos caderno e lápis, teremos:
•
para caderno: a variável precoComDesconto armazenará 1.000 (e exibição 1.00), o que
é maior que o precoMinimo (0.999), retornando true na comparação;
•
para caneta: a variável precoComDesconto armazenará 0.100 (e exibição 0.10), o que
é menor que o precoMinimo (0.101), retornando false na comparação.
A recomendação é não usar variáveis do tipo double (ou oat) para realizar cálculos monetários precisos. A imprecisão de números em ponto utuante pode causar erros que resultarão em incorretos valores monetários.
Nesses casos a recomendação é usar a classes
java.math.BigDecimal para a realização de cálculos com precisão arbitrária de valores em
ponto utuante.
(B) ERRADA
Em Java, há regras de promoção que se aplicam a expressões contendo valores de dois
ou mais tipos primitivos. Cada valor é promovido ao tipo mais alto na expressão. Dessa
forma, o argumento do método descontoValido (percentual) e a constante (100) do tipo
são automaticamente promovidas para o tipo
double, devido ao campo preco.
int
(C) ERRADA
A JVM (Java Virtual Machine ou Máquina Virtual Java, em português) é uma máquina
computacional abstrata, que, assim como uma máquina real, possui seu próprio conjunto de
instruções e capacidade de manipular várias áreas de memória em tempo de execução.
Dentre as responsabilidade da JVM podemos citar as principais:
•
independência de uma aplicação em relação ao hardware;
•
independência de uma aplicação em relação ao sistema operacional;
•
proteção aos usuários contra programas maliciosos.
Lembre-se que a máquina virtual Java não tem conhecimento sobre a linguagem de programação Java. Ela conhece apenas um determinado formato binário, arquivo do tipo classe, o
qual contém instruções da JVM (ou bytecodes) e uma tabela de símbolos, bem como outras
informações.
(D) ERRADA
A classe Math é parte do pacote java.lang, o qual é implicitamente importado pelo compilador. Então não é necessário importar a classe Math para usar seus métodos.
(E) ERRADA
Os membros de uma classe, no presente caso, preco e precoMinimo, são acessíveis por qualquer método declarado na mesma classe, independentemente do qualicador que os precede.
Assim, o campo precoMinino (this.precoMinimo no código) pertence ao escopo do método
descontoValido.
Note, ainda, que no método descontoValido, o uso da palavra chave this para o membro
precoMinimo não era necessário, pois não há variáveis locais com o mesmo nome.
Página 14 de 51
www.handbookdeti.com.br
Handbook de Questões de TI Comentadas para Concursos
6.
Volume questões de TI
Assuntos relacionados: Linguagens de Programação, Java, Tratamento de Exceção em
Java,
Banca: ESAF
Instituição: Agência Nacional de Águas (ANA)
Cargo: Analista Administrativo - Tecnologia da Informação e Comunicação / Desenvolvimento de Sistemas e Administração de Banco de Dados
Ano: 2009
Questão: 30
Em uma aplicação Java, se o carregador de classes não conseguir localizar a classe do driver
de banco de dados para uma conexão JDBC, é lançada a exceção
(a). java.lang.ClassNotFoundException.
(b). java.io.FileNotFoundException.
(c). java.lang.SecurityException.
(d). java.io.IOException.
(e). java.util.InputMismatchException.
Solução:
Exceções, como o nome sugere, são situações que fogem às regras e, no caso das linguagens de
programação, geralmente indesejáveis. Ocorrem no momento da execução de um programa
e precisam ser devidamente tratadas para não interromperem o processamento normal de
uma aplicação. Podem ocorrer por diversos motivos, como uma inadvertida divisão por zero,
uso de referências para objetos inexistentes, falta de memória, dentre outros.
A Linguagem Java possui um mecanismo de tratamento de exceções baseado em escopo,
o que permite utilizar um bloco de código separado daquele que gerou uma determinada
exceção para tratá-la adequadamente, propiciando maior organização ao projeto codicado.
Da mesma forma que os demais elementos desta linguagem, as exceções são objetos em Java,
sendo a classe Exception a superclasse de todas as exceções. Esta estruturação permite que
um programador dena suas próprias exceções, que herdam características pré-denidas na
classe Exception.
Quando uma exceção ocorre, códigos escritos por um programador po-
dem tratá-la através de diretivas especializadas para este m (throws, try, catch e nally).
Para tanto, o tipo (classe) de exceção deve ser indicado, possibilitando-se, assim, que toda
e qualquer exceção seja individualmente tratada.
Uma exceção comumente lançada durante a execução de códigos em Java é a ClassNotFoundException, que adverte ao programador que uma determinada classe não está acessível
à JVM, isto é, nenhuma denição para uma classe com o nome especicado pôde ser encontrada. Esta exceção, classe integrante do pacote java.lang, pode ocorrer por inexistência
real da classe indicada ou por falta de referência à sua localização no ambiente de programação utilizado (variáveis de ambiente do sistema operacional). Desta forma, a assertiva A
apresenta-se como a resposta para a questão.
A exceção java.io.FileNotFoundException ocorre para sinalizar que a tentativa de abertura do arquivo indicado falhou.
Já a exceção java.lang.SecurityException indica a ten-
tativa negada de acesso a algum recurso do sistema, como um arquivo.
Operações de
entrada/saída interrompidas ou falhas lançam a exceção java.io.Exception para indicar o
Página 15 de 51
www.handbookdeti.com.br
Handbook de Questões de TI Comentadas para Concursos
Volume questões de TI
ocorrido. A classe Scanner (um parser simples para textos com tipos primitivos) lança a exceção java.util.InputMismatchException para indicar que ou o token capturado não coincide
com o padrão do tipo esperado ou seu valor está fora da faixa esperada.
Página 16 de 51
www.handbookdeti.com.br
Handbook de Questões de TI Comentadas para Concursos
7.
Volume questões de TI
Assuntos relacionados: Java, Bytecode, Máquina Virtual Java (JVM),
Banca: FCC
Instituição: TRT 15a Região
Cargo: Analista Judiciário - Tecnologia da Informação
Ano: 2009
Questão: 48
No âmbito da linguagem Java, considere:
I. Edição é a criação do programa, que também é chamado de código Bytecode.
II. Compilação é a geração de um código intermediário chamado fonte, que é um código
independente de plataforma.
III. Na interpretação, a máquina virtual Java ou JVM analisa e executa cada instrução do
código Bytecode.
IV. Na linguagem Java a interpretação ocorre apenas uma vez e a compilação ocorre a cada
vez que o programa é executado.
Está correto o que consta em
(a). I, II, III e IV.
(b). II e IV, somente.
(c). III e IV, somente.
(d). IV, somente.
(e). III, somente.
Solução:
Java é uma linguagem de programação muito popular atualmente.
Ela foi desenvolvida
na década de 90 pela SUN Microsystems e desde aquela época essa linguagem vem sendo
melhorada e ampliada. O paradigma escolhido para o Java foi o de orientação a objetos,
portanto, classes e métodos são utilizados para modelar o que se deseja programar.
Em geral, os códigos-fonte desenvolvidos em outras linguagens (C++, por exemplo) são
compilados para serem executados em arquiteturas especícas.
Dessa forma, executáveis
gerados para uma determinada arquitetura (Intel, por exemplo) não funcionam em outras
arquiteturas (PowerPC e SPARC, por exemplo). À medida que temos diversas arquiteturas
e diversos sistemas que devem ser corretamente executados nessas arquiteturas, essa abordagem começa a se mostrar desfavorável.
A plataforma Java veio principalmente para solucionar esse tipo de problema. Diz-se então
que a linguagem Java é portável, já que seus executáveis podem ser executados em qualquer
arquitetura, desde que haja uma JVM para ela. De forma simplicada, essa portabilidade
é obtida da seguinte forma:
1. o desenvolvedor escreve (edita) o código-fonte de um sistema na linguagem Java;
2. ao nal da fase de desenvolvimento, o código-fonte é compilado, uma única vez, gerandose um código intermediário chamado de bytecode. Esse bytecode não depende da arquitetura da máquina física. Isso porque a máquina física não executa diretamente esse
código intermediário;
Página 17 de 51
www.handbookdeti.com.br
Handbook de Questões de TI Comentadas para Concursos
Volume questões de TI
3. uma JVM, que pode estar instalada sobre qualquer arquitetura física, interpreta e executa o código intermediário (bytecode) quantas vezes forem as vezes em que o sistema
for executado.
Perceba que com o Java não há mais dependência entre código-fonte e arquitetura física,
mas passamos a ter dependência entre JVM e arquitetura física.
Ou seja, foi adicionada
uma camada (a JVM) para se obter a tão desejada portabilidade.
Neste ponto, podemos concluir que os itens I, II e IV são errados e o item III é correto.
Portanto, a alternativa a ser marcada é a letra E.
Note que os itens I, II e IV só são errados por conta de trocas de palavras. Uma leitura
desatenta provavelmente comprometeria esta questão. Vejamos:
•
o item I estaria correto se a palavra Bytecode fosse substituída por fonte;
•
o item II estaria correto se a palavra fonte fosse substituída por Bytecode;
•
o item IV estaria correto se as palavras interpretação e compilação fossem invertidas.
Página 18 de 51
www.handbookdeti.com.br
Handbook de Questões de TI Comentadas para Concursos
8.
Volume questões de TI
Assuntos relacionados: Servidor de Aplicações, Java, J2EE, Máquina Virtual Java (JVM),
Heap,
Banca: Cesgranrio
Instituição: BNDES
Cargo: Analista de Sistemas - Suporte
Ano: 2008
Questão: 31
Um servidor Linux, que roda, exclusivamente, um servidor de aplicação Java EE, possui 2
GB de memória RAM e 1 CPU. A única aplicação em execução atinge, em momentos de
pico, 50 usuários simultâneos. Para que essa aplicação tenha um desempenho adequado, o
tamanho máximo da Heap da JVM pode ser congurado para
(a). 100 threads.
(b). 32 MB.
(c). 60 threads.
(d). 2 GB.
(e). 512 MB.
Solução:
O Java EE (Enterprise Edition) é uma plataforma de desenvolvimento de sistemas em Java.
A plataforma inicialmente era conhecida por Java 2 Platform Enterprise Edition (J2EE),
até ter seu nome trocado para Java EE, o que ocorreu na versão 5.
A plataforma JEE oferece uma série de componentes e funcionalidades que permitem a
implementação de software Java distribuído.
Uma descrição sucinta da destinação e das
características gerais da plataforma JEE pode ser encontrada na Wikipedia:
A Plataforma Java (Enterprise Edition) difere-se da Plataforma Java Standard Edition
(Java SE) pela adição de bibliotecas que fornecem funcionalidade para implementar software
Java distribuído, tolerante a falhas e multi-camada, baseada amplamente em componentes
modulares executando em um servidor de aplicações. Ela é voltada para aplicações multicamadas, baseadas em componentes que são executados em um servidor de aplicações... Ela
contém bibliotecas desenvolvidas para o acesso a base de dados, RPC, CORBA, etc. Devido
a essas características a plataforma é utilizada principalmente para o desenvolvimento de
aplicações corporativas.
Os servidores de aplicação mencionados na descrição acima, em linhas gerais, são softwares
que provêem um ambiente onde as aplicações podem executar.
Uma aplicação Java usualmente é dividida em 2 partes:
uma parte que executa no cli-
ente e uma outra parte que executa no servidor. O servidor em si é dividido em diferentes
containers
que oferecem diferentes serviços às aplicações.
oferecidos pelos
containers
Entre os serviços mais comuns
estão a execução da lógica de negócio, serviços de mensagens,
serviços de gerenciamento de conexões a bancos de dados, serviços de segurança etc.
Entendido o conceito de servidores de aplicação, agora vamos falar um pouco sobre JVM
(Java Virtual Machines).
Página 19 de 51
www.handbookdeti.com.br
Handbook de Questões de TI Comentadas para Concursos
Volume questões de TI
Quando um código Java é compilado, ele dá origem a um programa codicado nos chamados
bytecodes.
Os bytecodes são uma espécie de código intermediário, que só pode ser
executado por uma JVM. Uma JVM, por sua vez, é um programa que converte os bytecodes
em código executável de máquina, que pode então ser executado pela máquina física.
Em última instância, são os conceitos de bytecodes que garantem a portabilidade dos códigos
Java. Independente do sistema operacional ou plataforma física onde tenha sido desenvolvido o programa Java, os bytecodes sempre serão os mesmos.
Com isso, para executar o
programa Java em outro sistema, basta que se tenha uma JVM especíca, capaz de converter os bytecodes para o código de máquina apropriado.
Agora, vamos ao que realmente interessa para alcançarmos a resposta da questão.
A
heap
da JVM é uma área de memória onde todos os objetos das aplicações que estão
sendo executadas pela JVM residem. Além dos objetos criados nas aplicações, a heap ainda
possui uma área de memória reservada para outras funções da JVM. Portanto, para que as
aplicações executem com desempenho adequado, é necessário congurar bem o tamanho da
heap.
As alternativas A e C estão erradas, simplesmente, porque o tamanho da heap não é denido
em termos do número de threads, mas sim em termos de quantidade de memória. Já a alterativa D está errada pois não faz sentido alocar toda a memória do sistema (no caso, 2GB)
exclusivamente para a JVM. O sistema operacional sequer irá permitir a realização desta
operação, visto que boa parte da memória já estará sendo utilizada pelo próprio sistema
operacional.
Com isto, nos restam as alternativas B (32 MB) e D (512 MB). O enunciado da questão diz que o servidor possui 1 CPU, e que, em momentos de pico, a aplicação em execução
atinge 50 usuários simultâneos. O fato de o servidor possuir apenas 1 CPU implica dizer
que, em momentos de alta utilização da aplicação, haverá muitas trocas de contexto, ou
seja, muitas alternâncias entre os processos em execução.
Em princípio, a alteração da quantidade de memória não irá afetar a quantidade de trocas
de contexto, porém irá permitir que as múltiplas threads (que serão criadas para atender
uma grande quantidade usuários simultâneos) estejam sempre na memória principal, o que
pode conferir maior desempenho à aplicação.
Como o enunciado não presta informações sobre o consumo de memória das threads individuais que são geradas para atender cada um dos usuários simultâneos, e levando ainda
em consideração que o tamanho default da heap (ou seja, um tamanho que atende os requisitos de desempenho de uma aplicação média) da JVM varia entre 16MB a 64MB, podemos
armar que, para maximizar o desempenho da aplicação, o ideal seria congurar o tamanho
máximo da heap para 512MB.
Portanto, a resposta da questão é a alternativa E.
Página 20 de 51
www.handbookdeti.com.br
Handbook de Questões de TI Comentadas para Concursos
9.
Volume questões de TI
Assuntos relacionados: Java, Sobrecarga de Método, Sobrescrita de Método,
Banca: Cesgranrio
Instituição: BR Distribuidora
Cargo: Analista de Sistemas - Desenvolvimento
Ano: 2008
Questão: 47
Em um sistema desenvolvido na linguagem de programação Java, suponha a existência de
uma classe Pessoa que possui um método chamado getIdenticador que:
é público, não
recebe nenhum argumento, retorna um inteiro e declara que não levanta exceções. Suponha
ainda a existência de uma classe Cliente que herda da classe Pessoa e possui um método
chamado getIdenticador que é público, não recebe nenhum argumento e declara que levanta
a exceção java.lang.Exception. Essa situação é um exemplo de
(a). Sobrecarga de método (overload ) sem erros, pois os métodos têm o mesmo nome.
(b). Sobrescrita de método (overriding ) sem erros, pois o método da classe Cliente
substitui o método da classe Pessoa.
(c). Avaliação preguiçosa (late
binding ) sem erros, pois o método correto a ser chamado
será denido em tempo de execução.
(d). Método virtual sem erros, pois o método getIdenticador da classe Cliente foi
denido viabilizando sua reescrita.
(e). Erro, pois o método getIdenticador da classe Cliente não pode declarar que levanta a exceção java.lang.Exception, segundo a denição do método getIdenticador na classe Pessoa.
Solução:
Métodos em Java podem ser sobrecarregados (overloading ) e sobrescritos (overriding ).
Métodos são sobrecarregados quando criamos outros métodos com o mesmo nome, mas
diferentes assinaturas e diferentes denições. Sobrecarga de métodos permite que instâncias
da sua classe tenham uma interface mais simples para outros objetos e se comportem de
modo diferente baseado na entrada para aquele método.
Quando você chama um método em um objeto, Java compara o nome do método e o número
de argumentos para escolher qual denição de método executará.
Para sobrecarregar um método, tudo que você precisa fazer é criar diferentes denições
de métodos na sua classe, todas com o mesmo nome, mas com diferentes listas de parâmetros (ou em número ou tipo dos argumentos) e com diferentes corpos.
Note que Java diferencia métodos sobrecarregados com o mesmo nome, baseado sobre o
número e tipos dos parâmetros para aquele método, e não sobre o tipo de retorno. Isto é,
se você tentar criar dois métodos com o mesmo nome, mesma lista de parâmetros, mas com
diferentes tipos de retornos, você obterá um erro de compilação.
Aqui está um exemplo de como sobrecarregar um método.
A classe MeuRetangulo tem
4 variáveis para denir o canto superior esquerdo e o inferior direito do retângulo: x1, y1,
x2 e y2.
Página 21 de 51
www.handbookdeti.com.br
Handbook de Questões de TI Comentadas para Concursos
Volume questões de TI
Class MeuRetangulo {
int x1 = 0;
int x2 = 0;
int y1 = 0;
int y2 = 0;
}
Denimos o método constroiRetangulo que possui 4 argumentos inteiros e ajusta o tamanho
do retângulo de acordo com os valores dos cantos, retornando o objeto retângulo resultante.
MeuRetangulo constroiRetangulo (int cx1, int cy1, int cx2, int cy2) {
x1 = cx1;
y1 = cy1;
x2 = cx2;
y2 = cy2;
return this;
}
Agora, iremos sobrecarregar o método acima alterando a lista de parâmetros, passando dois
objetos da classe Ponto:
MeuRetangulo constroiRetangulo (Ponto superiorEsquerdo, Ponto inferiorDireito) {
x1 = superiorEsquerdo.x;
y1 = superiorEsquerdo.y;
x2 = inferiorDireito.x;
y2 = inferiorDireito.y;
return this;
}
Uma vez que a sobrecarga ocorre entre métodos denidos na mesma classe, podemos eliminar a alternativa A, pois o problema em questão está ligado ao polimorsmo que a herança
permite (várias classes implementando o mesmo método).
Por outro lado, sobrescrever (overriding ) métodos envolve a denição de um método em
uma subclasse que tem a mesma assinatura que um método na superclasse. Então, quando
um método é chamado, o método na subclasse é encontrado e executado em vez de ser
executado aquele da superclasse.
Para sobrescrever um método, tudo que você precisar fazer é criar um método em sua
subclasse que tem a mesma assinatura (nome, tipo de retorno, e lista de argumentos) que
um método denido por uma de suas superclasses. Além disso: o nível de acesso não pode
ser mais restritivo que o do método da superclasse; o método não pode lançar exceções (exceto de
Runtime )
novas ou mais abrangentes que as declaradas no método da superclasse,
porém pode lançar exceções mais especícas ou lançar menos exceções. Uma vez que Java
executa a primeira denição de método que encontra com a mesma assinatura, ele efetivamente oculta a denição do método original.
Aqui está um exemplo de como sobrescrever um método.
método imprime (), o qual apenas imprime o nome da classe.
Página 22 de 51
www.handbookdeti.com.br
A classe Impressao possui o
Handbook de Questões de TI Comentadas para Concursos
Volume questões de TI
Class Impressao {
void imprime () {
System.out.println (``Impressao'');
}
}
Agora, vamos criar uma segunda classe, Impressao2, que tem Impressao como superclasse e
sobrescreve o método imprime () (a diferença está no nome a ser impresso).
Class Impressao2 extends Impressao {
void imprime () {
System.out.println (``Impressao2'');
}
}
Observe que, se eu tiver um programa com objetos das classes Impressao e Impressao2,
terei duas implementações diferentes do método imprime (). A chamada a.imprime () está
chamando um desses dois métodos, dependendo da classe do objeto a. Achar o método
correto a ser chamado para um objeto particular chama-se
ou amarração dinâmica.
dynamic binding (late binding ),
Isto é, temos que amarrar a chamada a.imprime () a uma das
implementações de imprime () dinamicamente, em tempo de execução (e não em tempo de
compilação, o que se chamaria
static binding ).
Como vimos acima, a sobrescrita de um método não pode lançar exceções novas, pois obteremos erro em tempo de compilação. Portanto, a alternativa
Página 23 de 51
www.handbookdeti.com.br
E é a correta.
Handbook de Questões de TI Comentadas para Concursos
10.
Volume questões de TI
Assuntos relacionados: Linguagens de Programação, Java,
Banca: FCC
Instituição: TCE/CE
Cargo: Analista de Controle Externo - Auditoria de Tecnologia da Informação
Ano: 2008
Questão: 80
Recurso Java que permite que uma thread invoque um método em um objeto remoto (semelhante à RPC) denomina-se
(a). RMI.
(b).
getPriority().
(c).
matcher.
(d).
FocusRequester.
(e).
RemoteException.
Solução:
A resposta da questão é a alternativa A. O RMI (Remote Method Invocation) é uma das
abordagens da tecnologia Java para prover as funcionalidades de uma plataforma de objetos
distribuídos. O RMI faz parte do núcleo básico do Java desde a versão 1.1, com a sua API
sendo especicada no pacote java.rmi e seus subpacotes.
Através da utilização do RMI, é possível que um objeto ativo em uma máquina virtual
Java possa interagir com objetos de outras máquinas virtuais Java, independentemente da
localização dessas máquinas virtuais.
No desenvolvimento de uma aplicação cliente-servidor usando Java RMI, como para qualquer plataforma de objetos distribuídos, é essencial que seja denida a interface de serviços
que serão oferecidos pelo objeto servidor. Os serviços especicados pela interface RMI deverão ser implementados através de uma classe Java.
O funcionamento típico de uma aplicação que usa RMI é o seguinte: uma aplicação cliente
invoca um método de um objeto no servidor. Os parâmetros são serializados e enviados pela
rede para o servidor. No servidor, os dados são deserializados, e a computação é realizada.
por m, os resultados são novamente serializados e enviados de volta ao cliente.
Página 24 de 51
www.handbookdeti.com.br
Handbook de Questões de TI Comentadas para Concursos
11.
Volume questões de TI
Assuntos relacionados: Algoritmos, Linguagens de Programação, Java,
Banca: ESAF
Instituição: Secretaria do Tesouro Nacional (STN)
Cargo: Analista de Finanças e Controle - Tecnologia da Informação / Desenvolvimento de
Sistemas de Informação
Ano: 2008
Questão: 25
Considere o seguinte fragmento de código, para o método run() de uma determinada linha
de execução (thread), em Java.
1. try{
2.
sleep(1000);
3. } catch (InterruptedException ie){}
Se considerarmos que a linha de execução não é interrompida, é correto armar que
(a). o código não compila.
(b). a linha de execução entra em estado Pronto, após 1000 milissegundos.
(c). a linha de execução entra em estado Pronto, em exatamente 1000 milissegundos.
(d). a linha de execução entra em estado Pronto, em pelo menos 1000 milissegundos.
(e). o código compila, mas não executa, lançando uma exceção do tipo ThreadException.
Solução:
Já que o enunciado referencia um bloco de código, uma boa forma de compreender essa
questão é através de um código que implemente o bloco correspondente em conjunto com a
infraestrutura necessária para compilação e execução. Considere, portanto, o código abaixo.
import java.lang.Thread;
class Foo extends Thread {
public void run() {
try {
sleep(1000);
} catch (InterruptedException ie){}
System.out.println("Hello World!");
}
}
public class ThreadedHello {
public static void main(String[] args) {
Foo foo;
foo = new Foo();
foo.run();
}
}
É possível perceber que o bloco de código acima contém, em sua totalidade, o bloco de
código a ser analisado na questão.
Ora, se salvarmos esse código em um arquivo Threa-
dedHello.java e tentarmos compilá-lo, o compilador Java o compilará sem problemas, visto
Página 25 de 51
www.handbookdeti.com.br
Handbook de Questões de TI Comentadas para Concursos
Volume questões de TI
que não há erro sintático ou semântico no código. O que invalida a solução referenciada pela
opção a.
Após a compilação do bloco de código, também é possível executá-lo. O exemplo abaixo
exibe a chamada ao programa compilado e a saída por ele gerada:
$ time java ThreadedHello
Hello World!
real
0m1.131s
A correta execução desse programa invalida, portanto, a opção e, já que não houve qualquer exceção levantada e o programa exibiu a saída correta (Hello World, neste caso). No
exemplo acima, o comando time exibe os tempos de execução de um programa e optou-se
por exibir apenas o tempo real de execução, de 1,131 segundos.
Resta-nos, portanto, as opções b, c e d.
Para isso, a melhor fonte é a referência da lin-
guagem Java, que diz que o método sleep da classe Thread causa a suspensão temporária
da thread em execução pelo número de milisegundos especicado pelo argumento passado
para o método. Disso decorre que, terminado o tempo de suspensão, a thread retornará ao
estado Pronto em 1000 milissegundos. O problema com as opções c e d são os qualicadores
adicionados a este tempo. Por depender da precisão do timer do computador que executará
esse bloco de código e do escalonador de processos, é impossível garantir que a mudança
para o estado Pronto ocorrerá em exatamente 1000 milisegundos, invalidando a alternativa
c. De forma semelhante, a precisão do timer ou o escalonador podem fazer com que o tempo
de suspensão da thread seja menor que 1000 milisegundos, invalidando a alternativa d.
De modo geral, como não há garantias dadas pelo método sleep, é melhor selecionar a opção
que responde a pergunta sem restrições adicionais. No caso, a alternativa b é a correta.
Página 26 de 51
www.handbookdeti.com.br
Handbook de Questões de TI Comentadas para Concursos
12.
Assuntos relacionados: Teste de Mesa, Java,
Banca: CESGRANRIO
Instituição: Petrobras
Cargo: Analista de Sistemas - Eng. de Software
Ano: 2008
Questão: 65
public class Ponto {
private int x;
private int y;
public Ponto(int x, int y) {
setCoordenadas(x,y);
}
public void setCoordenadas(int x, int y) {
this.x = x;
this.y = y;
}
public String toString() {
return "(" + x + "," + y + ")";
}
}
public static void main(String[] args) {
int a = 1;
int b = 2;
int c = 3;
int d = 4;
Ponto p = new Ponto(a,b);
Ponto q = new Ponto(c,d);
Ponto r = p;
c = 5;
p.setCoordenadas(c,d);
System.out.print(p);
System.out.print(q);
System.out.print(r);
r.setCoordenadas(a,b);
a = b;
q.setCoordenadas(b,c);
System.out.print(p);
System.out.print(q);
System.out.println(r);
}
Qual será a saída da execução da classe Java acima?
(a). (5,4)(3,4)(5,4)(1,2)(2,5)(1,2)
(b). (5,4)(3,4)(1,2)(5,4)(2,5)(1,2)
(c). (5,4)(5,4)(5,4)(2,2)(2,5)(2,2)
Página 27 de 51
www.handbookdeti.com.br
Volume questões de TI
Handbook de Questões de TI Comentadas para Concursos
Volume questões de TI
(d). (3,4)(3,4)(5,4)(2,5)(2,5)(1,2)
(e). (3,4)(3,4)(5,4)(2,2)(2,5)(2,2)
Solução:
A seguir, o passo a passo da execução da classe em questão. Na verdade, serão abordados
os principais pontos da execução.
•
após a execução da 5a linha (Ponto p = new Ponto(a,b);), teremos o seguinte cenário:
a=1; b=2; c=3; d=4; p.x=1; p.y=2;
•
após a execução da 6a linha (Ponto q = new Ponto(c,d);), teremos o seguinte cenário:
a=1; b=2; c=3; d=4; p.x=1; p.y=2; q.x=3; q.y=4;
•
após a execução da 7a linha (Ponto r = p;), teremos o seguinte cenário:
a=1; b=2; c=3; d=4; p.x=1; p.y=2; q.x=3; q.y=4; r <-> p
Perceba que não foi criado um objeto que seria atribuído à variável r. Na execução dessa
última linha, a variável r foi atribuída ao objeto já existente p. Ou seja, a partir deste ponto,
em qualquer referência às variáveis r e p serão utilizadas as propriedades do mesmo objeto.
•
após a execução da 9a linha (p.setCoordenadas(c,d);), teremos o seguinte cenário:
a=1; b=2; c=5; d=4; p.x=5; p.y=4; q.x=3; q.y=4; r <-> p
•
após as execuções das linhas de número 10, 11 e 12 (System.out.print(p); System.out.print(q);
System.out.print(r);), teremos a seguinte saída:
(5,4)(3,4)(5,4)
•
após a execução da 13a linha (r.setCoordenadas(a,b);), teremos o seguinte cenário:
a=1; b=2; c=5; d=4; p.x=1; p.y=2; q.x=3; q.y=4; r <-> p
•
após a execução da 14a linha (a = b;), teremos o seguinte cenário:
a=2; b=2; c=5; d=4; p.x=1; p.y=2; q.x=3; q.y=4; r <-> p
•
após a execução da 15a linha (q.setCoordenadas(b,c);), teremos o seguinte cenário:
a=2; b=2; c=5; d=4; p.x=1; p.y=2; q.x=2; q.y=5; r <-> p
•
após as execuções das linhas de número 16, 17 e 18 (System.out.print(p); System.out.print(q);
System.out.println(r);), teremos a seguinte saída:
(5,4)(3,4)(5,4)(1,2)(2,5)(1,2)
Página 28 de 51
www.handbookdeti.com.br
Handbook de Questões de TI Comentadas para Concursos
13.
Volume questões de TI
Assuntos relacionados: Java, UML, Diagrama de Classes,
Banca: CESGRANRIO
Instituição: Petrobras
Cargo: Analista de Sistemas - Eng. de Software
Ano: 2008
Questão: 63
public class Produto {
private Fabricante mFabricante;
public Produto () {
}
public Fabricante getFabricante () {
return mFabricante;
}
}
public void setFabricante (Fabricante val) {
this.mFabricante = val;
}
import java.util.ArrayList;
public class Fabricante {
private ArrayList<Produto> mProduto;
public Fabricante () {
}
public ArrayList<Produto> getProduto () {
return mProduto;
}
}
public void setProduto (ArrayList<Produto> val) {
this.mProduto = val;
}
Assinale o diagrama de classe que expressa corretamente a implementação mostrada acima,
em Java, das classes Produto e Fabricante, bem como da associação entre as mesmas.
(a). Diagrama 1
(b). Diagrama 2
(c). Diagrama 3
(d). Diagrama 4
(e). Diagrama 5
Página 29 de 51
www.handbookdeti.com.br
Handbook de Questões de TI Comentadas para Concursos
Volume questões de TI
Solução:
Lembre-se que diagramas de classe nos permitem identicar tanto o conteúdo de uma classe
quanto o relacionamento entre várias classes. Em um diagrama de classes podemos mostrar
as variáveis e métodos membros de uma classe. Podemos também mostrar se uma classe
herda de outra, ou se mantém uma referência para outra. Em suma, podemos descrever todas
as dependências do código-fonte entre classes.
Para resolvermos esta questão precisamos
saber:
1. associações entre classes muito frequentemente representam instâncias de variáveis que
mantêm referência para outros objetos;
2. a direção da echa nos informa que a classe mantém referência para outra classe;
3. o número próximo à cabeça da seta nos informa quantas referências são mantidas;
4. quando existem muitas conexões representamos por estrela (*). Em Java, isso é comumente implementado com um Vetor ou uma Lista.
De posse desse conhecimento, estamos aptos a revolver a presente questão.
Inicialmente, analisemos a declaração da classe Produto.
Observe que nela é declarado
um membro privado do tipo Fabricante. Em outras palavras, a classe Produto mantém uma
única referência para classe Fabricante. Portanto, na associação existente entre Produto e
Fabricante deve existir uma echa apontando para a classe Fabricante com o valor numérico
1 (um) em sua ponta.
Agora, analisemos a declaração da classe Fabricante.
Observe que nela é declarado um
vetor (ArrayList) privado do tipo Produto, em outras palavras, a classe Fabricante mantém
muitas referências para classe Produto. Portanto, na associação existente entre Fabricante
e Fabricante também deve existir uma echa apontando para a classe Produto com um asterisco (*) em sua ponta.
Concluímos, então, que a reposta correta é a letra
D.
Página 30 de 51
www.handbookdeti.com.br
Handbook de Questões de TI Comentadas para Concursos
14.
Volume questões de TI
Assuntos relacionados: Java,
Banca: CESGRANRIO
Instituição: Petrobras
Cargo: Analista de Sistemas - Eng. de Software
Ano: 2008
Questão: 64
Considere o trecho de código a seguir.
if (x != x + 0) {
System.out.println("Condição satisfeita.");
}
Se x for da classe String e tiver sido inicializado, esse trecho de código Java
(a). imprimirá a mensagem, apenas se x não for 0.
(b). imprimirá a mensagem, apenas se x não tiver sido inicializado com null.
(c). imprimirá a mensagem, independente do valor de x.
(d). gerará um erro de compilação.
(e). compilará, mas nunca imprimirá a mensagem.
Solução:
Para resolvermos a referida questão é preciso saber que, em Java, o operador de adição (+)
tem precedência maior que os operadores relacionais de (des)igualdade (!= e ==). Além
disso, o operador + pode ser utilizado também para a concatenação de strings, que é o
caso da nossa questão. Pronto, agora nós já temos condições de resolver a questão.
Pelo enunciado, extraímos que x é uma string inicializada, isto é, uma string de tamanho N, onde N pode ser maior do que 0 (zero), se x possuir algum conteúdo, ou N pode ser
igual a 0 (zero), se x for nula.
Independentemente do conteúdo de x, o lado direito do operador != produzirá uma string
com o tamanho N + 1. Isto é, a string concatenada possuirá tamanho, e obviamente, conteúdo, diferente da original (x), o que sempre satisfará a condição de desigualdade existente
no
if.
Logo, esse trecho de código imprimirá a mensagem, independente do valor de x.
(alternativa
C).
Página 31 de 51
www.handbookdeti.com.br
Handbook de Questões de TI Comentadas para Concursos
15.
Volume questões de TI
Assuntos relacionados: Linguagens de Programação, Java,
Banca: Cesgranrio
Instituição: Petrobras
Cargo: Analista de Sistemas - Infraestrutura
Ano: 2008
Questão: 62
Considere o programa em Java abaixo.
import java.io.*;
class ClassX
{
private int size;
private int[] arrayX;
private int x;
public ClassX(int s)
{
size = s;
arrayX = new int[s];
x = -1;
}
public void Met1(int p)
{ arrayX[++x] = p; }
public int Met2()
{ return arrayX[x]; }
public int Met3()
{ return arrayX[x]; }
public boolean Met4()
{ return (x == -1); }
}
class Algoritmo {
static int theN;
static int theA;
static ClassX theS;
public static void main(String[] args) throws IOException {
System.out.print(Forneça um valor: );
theN = getInt();
MetX();
System.out.print(Resultado : + theA);
}
public static int getInt() throws IOException {
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
String s = br.readLine();
return Integer.parseInt(s);
}
public static void MetX(){
Página 32 de 51
www.handbookdeti.com.br
Handbook de Questões de TI Comentadas para Concursos
}
}
Volume questões de TI
theS = new ClassX(1000);
theA = 0;
while (theN > 0){
theS.Met1(theN);
theN;
}
while (!theS.Met4()){
int newN = theS.Met2();
theA += newN;
}
Se o programa for executado recebendo como parâmetro o valor 4, em Forneça um valor:
, o valor armazenado na variável theA e apresentado em System.out.print(Resultado : + theA); será
(a). 10
(b). 12
(c). 14
(d). 16
(e). 18
Solução:
ClassX tem três
x ), que usam o operador de acesso private. A variável size e x são
variável arrayX é um vetor do tipo inteiro. Além disso, a classe ClassX
O programa Java acima possui duas classes (ClassX e Algoritmo). A classe
atributos (size,
arrayX
do tipo inteiro e a
e
possui 4 métodos que são:
• public void Met1(int p): este método atribui o valor do
do arrayX. A variável x é incrementada a cada chamada do
• public int Met2():
• public int Met3():
método
este método retorna o valor da posição
é decrementada a cada chamada do método
Met2() ;
p na posição x
Met1() ;
parâmetro
x
do
arrayX.
A variável
x
método denido mas não utilizado;
• public boolean Met4():
verica se o atributo
x
da classe
ClassX
é igual a -1.
Algoritmo tem três atributos (theN, theA e theS ) que usam o operador de acesso
static. A variável theN e theA são do tipo inteiro e a variável theS é do tipo da classe ClassX.
Além disso, a classe ClassX possui 3 métodos que são:
A classe
• public static int getInt():
este método retorna um valor inteiro lido do teclado;
• public static void MetX(): este método possui dois laços de repetição. Um laço faz
atribuições ao vetor arrayX do objeto theS da classe ClassX. Os valores atribuídos ao
arrayX são passados um por um como parâmetro para o método Met1(). O segundo
laço faz um somatório dos valores atribuídos ao vetor arrayX do objeto theS da classe
ClassX. Além disso, inicializa a variável theA com o valor 0;
• public static void main(String[] args):
o método
main
não opera sobre quaisquer
objetos. Na verdade, quando um programa se inicia, não há qualquer objeto ainda. O
método
main
estático é executado e constrói os objetos de que o programa precisa.
Página 33 de 51
www.handbookdeti.com.br
Handbook de Questões de TI Comentadas para Concursos
ClassX
O construtor da classe
• size :
Volume questões de TI
inicializa seus atributos com os seguintes valores:
recebe o valor passado como parâmetro para o construtor (neste programa, quando
o construtor é chamado, é passado o valor 1000 como parâmetro);
• arrayX = new int[s] :
o vetor é instanciado e seu tamanho é denido pelo parâmetro
passado para o construtor (neste caso, o valor 1000);
• x = -1 :
o atributo x é inicializado com o valor -1.
Como pode ser observado, as variáveis e os métodos da classe Algoritmo estão denidos como
static.
A seguir vamos dar uma breve descrição sobre o operador
um atributo como
static,
static.
Quando se dene
isso implica que só haverá um atributo para todos os objetos da
classe. Em contraste com atributos não
static,
cada objeto tem sua própria cópia de todos
os atributos de instâncias. Ou seja, o atributo é compartilhado entre todas as instâncias da
classe. Além disso, mesmo se não houver qualquer objeto da classe, o atributo estático está
presente. Ele pertence à classe, não a qualquer objeto individual.
Ao executar o programa, o método main é chamado e nele é executado a linha de comando
theN
=
getInt(). Como
theN.
enunciado, o método retorna o valor digitado e é atribuído
o valor 4 a variável
Depois é chamado a método
MetX(),
que executa dois laços de repetição como descrito
acima.
•
O primeiro laço executado pelo método
•
arrayX[0] =
arrayX[1] =
arrayX[2] =
arrayX[3] =
theN = 0;
4,
3,
2,
1,
x
x
x
x
= 0 e
= 1 e
= 2 e
= 3 e
theN
theN
theN
theN
= 4;
= 3;
= 2;
= 1;
O segundo laço executado pelo método
theA
theA
theA
theA
MetX() atualiza os atributos da seguinte forma:
MetX()
atualiza os atributos da seguinte forma:
= 1;
= 3;
= 6;
= 10.
Concluindo, o valor apresentado em System.out.print(Resultado :
Portanto, a alternativa
A está correta.
Página 34 de 51
www.handbookdeti.com.br
+ theA) será 10.
Handbook de Questões de TI Comentadas para Concursos
16.
Volume questões de TI
Assuntos relacionados: Linguagens de Programação, Java,
Banca: ESAF
Instituição: Controladoria-Geral da União (CGU)
Cargo: Analista de Finanças e Controle - Tecnologia da Informação / Desenvolvimento de
Sistemas de Informação
Ano: 2008
Questão: 23
Com relação à linguagem de programação Java, é correto armar que
(a). o operador instanceof é utilizado para chamar o método construtor de uma classe
e criar um novo objeto.
(b). são tipos primitivos de dados: boolean, byte, short, char, int, long, string, oat e
double.
(c). o tipo de dado int suporta apenas números de - 32.768 a 32.767.
(d). a instrução do-while não faz parte das instruções de controle de uxo da linguagem.
(e). os valores booleanos não podem ser usados em uma operação de casting.
Solução:
(A) ERRADA
O operador instanceof determina se um tipo particular de objeto é de uma determinada
classe, ou seja, o instanceof compara um objeto para um tipo (classe) especicado. Você
pode usá-lo para testar se um objeto é uma instância de uma classe ou uma instância de
uma subclasse, ou uma instância de uma classe que implementa uma interface especíca.
O operador verica se uma referência de objeto é uma instância de um tipo, e retorna
um valor booleano. A forma geral de uso do operador é: <objeto> instanceof <classe>,
que retornará verdadeiro para os objetos instanciados a partir da classe avaliada. Note que
instanceof sempre retornará falso se <objeto> é nulo.
(B) ERRADA
Java é uma linguagem fortemente tipada.
Isso signica que toda variável deve ter um
tipo declarado. Existem oito tipos primitivos em Java. Quatro deles são tipos de números
inteiros, dois são tipos números de ponto utuante, um tipo boolean (intervalo de valores
0 ou 1) e um é o tipo de caracteres char, usado para unidades de código no esquema de
codicação Unicode.
Os tipos de números inteiros servem para números sem parte fracionaria, sendo permitido
valores negativos. O Java fornece os quatro tipos de números inteiros a seguir:
Tipo Armazenamento Necessário
Intervalo de Valores
int
4 bytes
-2,147,483,648 a 2,147,483,647
short
2 bytes
32,768 a 32, 767
long
8 bytes
-9,223,372,036,854,775,808 a 9,223,372,036,854,775,807
byte
1 byte
-128 a 127
Os tipos utuantes representam números com parte fracionária.
utuante são mostrados a seguir:
Página 35 de 51
www.handbookdeti.com.br
Os dois tipos de ponto
Handbook de Questões de TI Comentadas para Concursos
Volume questões de TI
Tipo
Armazenamento Necessário
Intervalo de Valores
oat
4 bytes
+/-3.4E-38 a +/- 3.4E+38
double
8 bytes
+/-1.7E-308 a +/-1.7E+308
O tipo char representa todo o conjunto de caracteres denidos no código de caracter Unicode que é usado para denir a extensão das possibilidades de caracteres alfanuméricos e
símbolos. O código UNICODE dene que cada caractere tenha 2 bytes.
O tipo primitivo booleano é o tipo de dados mais simples da linguagem Java.
Ele pos-
sui apenas dois valores, um correspondente a verdadeiro e outro a falso. O tipo boolean é
tipicamente usado como resultado de expressões condicionais como variáveis identicadoras
de estado.
(C) ERRADA
Como pode ser observado na tabela que apresenta os tipos de números inteiros acima, o
intervalo que o tipo de números inteiro pode assumir é -2,147,483,648 a 2,147,483,647.
(D) ERRADA
Java suporta comandos condicionais como seleção e laços para determinar o controle do
uxo do programa. Java dene os comandos de seleção (condicionais) if-else e switch, além
desse, a linguagem Java determina comandos de repetição (laços ou loop) que são: while,
for e do-while. Estas estruturas de controle utilizam os símbolos delimitadores
(chaves)
como limite de sua operação. Por exemplo:
Repetição
Repetição
if(<condição>)
Seleção
switch (<opção>)
Seleção
for( <condição>)
while(<condição>)
do
Repetição
{
{
{
{
{
<comando1>
case <const1|var1> :
<comando1>
<comando1>
<comando1>
<comandon>
case <const2|var2> :
<comandon>
<comandon>
<comandon>
}
}
}
}
}
else
while(<condição>);
{
<comando1>
<comandon>
}
As chaves são utilizadas quando existe a necessidade de aplicar os comandos de controle
sobre vários comandos. Quando são aplicados a apenas um comando o uso das chaves não
é obrigatória.
(E) CORRETA
A operação de casting é responsável por fazer a conversão de um tipo de dado em outro.
Existem regras para esse tipo de conversão de tipo, pois podem causar perda de informações. A operação casting em Java entre tipos primitivos permite converter o valor de um
tipo para outro tipo primitivo. Mais comumente ocorre com os tipos numéricos, e existe um
tipo primitivo boolean que não pode ser usado em uma operação de casting, pois os valores
deste tipo só podem ser verdadeiro ou falso.
Página 36 de 51
www.handbookdeti.com.br
Handbook de Questões de TI Comentadas para Concursos
Volume questões de TI
Embora o conceito de conversão seja razoavelmente simples, o uso é complicado pelo fato
de que Java tem oito tipos primitivos e vários tipos de objeto. Há três formas de casting na
linguagem Java:
•
Casting entre tipos primitivos, como por exemplo: int para oat ou para double;
•
Casting de uma instância de uma classe para uma instância de outra classe;
•
Casting tipos primitivos para objetos.
Como apresentado, realmente o tipo primitivo boolean da linguagem Java não pode ser um
dos operandos da operação de casting, fazendo a assertiva E como correta.
Página 37 de 51
www.handbookdeti.com.br
Handbook de Questões de TI Comentadas para Concursos
17.
Volume questões de TI
Assuntos relacionados: Programação, Java, Garbage Collection,
Banca: ESAF
Instituição: Secretaria do Tesouro Nacional (STN)
Cargo: Analista de Finanças e Controle - Tecnologia da Informação / Desenvolvimento de
Sistemas de Informação
Ano: 2008
Questão: 21
O que fazer para forçar a coleta de lixo de um objeto, em Java? Indique a opção correta.
(a). Invocar nalize().
(b). Remover todas as referências ao objeto.
(c). Invocar Runtime.gc().
(d). Invocar System.gc().
(e). A coleta de lixo não pode ser forçada.
Solução:
No Java, ao contrário de algumas linguagens como o C, não é necessário que o programador
se preocupe com a vida de um objeto, se responsabilizando em liberar espaços de memória
antes que ela esgote. O mecanismo de coleta de lixo (garbage
collection )
do Java faz uma
varredura periódica em busca de posições de memória não mais referenciadas e realiza a
liberação das mesmas.
A alternativa A cita o método nalize().
tor de C++ e
Esse método é equivalente ao método destru-
não é responsável em forçar a coleta de lixo.
Ele é chamado diretamente pelo
coletor de lixo logo antes que o objeto seja destruído. É útil quando precisamos liberar alguns recursos anteriormente à efetivação da eliminação. Por exemplo, se precisarmos fechar
uma conexão antes da destruição do objeto, isso será possível denindo o método nalize()
de tal maneira que realize a tarefa de fechar a conexão.
Removendo todas as referências do objeto, possibilitaremos que ele seja destruído pelo coletor de lixo, mas essa destruição ocorrerá em algum ponto especíco de sua execução, que
é iniciada ao bel-prazer da JVM (Java Virtual Machine). Quando a JVM decidir que é
hora de executá-lo, ele será executado, pois deve ser usado com inteligência devido aos altos
recursos computacionais que são exigidos.
Não é possível forçar a execução do coletor de lixo via programação no Java.
Os méto-
dos indicados nas alternativas (C) e (D) apenas noticam à JVM que a aplicação gostaria
que o coletor de lixo fosse executado, mas não garantem que ele realmente será executado
imediatamente.
Dado o exposto, sabemos que a execução do coletor de lixo não pode ser forçada e, portanto,
a alternativa correta é a alternativa
(E).
Página 38 de 51
www.handbookdeti.com.br
Handbook de Questões de TI Comentadas para Concursos
18.
Volume questões de TI
Assuntos relacionados: Linguagens de Programação, Java, Pacotes Java, Interface com
Usuário,
Banca: ESAF
Instituição: Controladoria-Geral da União (CGU)
Cargo: Analista de Finanças e Controle - Tecnologia da Informação / Desenvolvimento de
Sistemas de Informação
Ano: 2008
Questão: 24
A linguagem Java possui uma API (Application Program Interface) que disponibiliza pacotes e classes com diversas funcionalidades para auxiliar no desenvolvimento de aplicações.
O pacote que contém classes que auxiliam na criação de interfaces de usuário, incluindo
tratamento de grácos e imagens, é denominado
(a). java.util.
(b). java.applet.
(c). java.graphic.
(d). java.image.
(e). java.awt.
Solução:
(A) INCORRETA
O pacote java.util provê classes que tratam de coleções, eventos, data e hora, internacionalização, e classes de utilidade: um tokenizador, um gerador de números aleatórios e um
vetor de bits, não tendo qualquer relação com interfaces grácas.
(B) INCORRETA
O pacote java.applet, da distribuição padrão do Java, é usado para a criação de applets
Java. Um applet Java é uma aplicação fornecida aos usuários em formato de bytecode Java
e são normalmente executados em navegadores com o intuito de prover interatividade a
aplicações web. Os applets Java são normalmente escritos na linguagem Java, mas nada os
impede de serem escritos em linguagens que possuam compiladores para bytecode da Java
Virtual Machine (JVM), como Jython, Ruby ou Eiel.
Um exemplo de código de applet Java é exibido abaixo:
import java.applet.Applet;
import java.awt.*;
public class HelloWorld extends Applet {
public void init() { }
public void stop() { }
public void paint(Graphics g) {
g.drawString("Hello, world!", 20,10);
}
}
Sendo salvo como HelloWorld.java e compilado, o seguinte trecho HTML é capaz de carregálo:
Página 39 de 51
www.handbookdeti.com.br
Handbook de Questões de TI Comentadas para Concursos
Volume questões de TI
<html>
<head>
<title>Hello World</title>
</head>
<body>
<h1>Um exemplo de applet Java</h1>
<p><applet code="HelloWorld.class" width="200" height="40">
Aqui deveria aparecer o string "Hello World".</applet></p>
</body>
</html>
Após a compilação e o carregamento em um navegador, este applet exibirá a string Hello,
world!.
Como o pacote java.applet provê uma forma para criação de applets Java e não provê,
necessariamente, funcionalidade para criação de interfaces de usuário, java.applet não é a
resposta correta.
(C) INCORRETA
Não existe pacote java.graphic na distribuição do J2SE e, portanto, esta alternativa está
incorreta.
(D) INCORRETA
Não existe pacote java.image na distribuição do J2SE e, portanto, esta alternativa está
incorreta.
(E) CORRETA
O pacote java.awt fornece classes para criação de interfaces de usuário e desenho de grácos
e imagens na tela. O exemplo de applet exibido acima faz uso, inclusive, do pacote awt para
exibição da string Hello, world! na janela do navegador. Seu resultado é exibido na Figura
3 e, por tratar de interfaces grácas, essa é a alternativa que responde corretamente a esta
questão.
Figura 3: hello, world em applet.
Página 40 de 51
www.handbookdeti.com.br
Handbook de Questões de TI Comentadas para Concursos
19.
Volume questões de TI
Assuntos relacionados: Linguagens de Programação, Java, Pacotes Java,
Banca: ESAF
Instituição: Controladoria-Geral da União (CGU)
Cargo: Analista de Finanças e Controle - Tecnologia da Informação / Desenvolvimento de
Sistemas de Informação
Ano: 2008
Questão: 26
Um dos aprimoramentos feitos na linguagem Java foi a introdução da reexão. Com relação
a esse recurso, é incorreto armar que
(a). a classe Method do pacote java.lang.reect decodica informações de modicador
sobre classes, variáveis e métodos.
(b). o uso da reexão se torna mais útil quando se está trabalhando com serialização
de objeto.
(c). a classe Field do pacote java.lang.reect gerencia e localiza informações sobre
variáveis de classe e de instância.
(d). por meio da reexão, um programa Java pode carregar uma classe sobre a qual
ele nada conhece, encontrar as variáveis, métodos e construtores dessa classe e
trabalhar com eles.
(e). a reexão é necessária com o uso de JavaBeans, em que a capacidade de um objeto
consultar outro a respeito do que ele pode fazer é útil ao se criar aplicativos mais
complexos.
Solução:
A linguagem de programação Java surgiu de um projeto da empresa Sun Microsystems em
1995 com a intenção de possibilitar a programação de qualquer equipamento eletrônico dotado de um microprocessador. Com o slogan Write once, run everywhere (programe um
vez, execute em qualquer lugar), buscou-se (e ainda busca-se) ilustrar um dos maiores benefícios desta linguagem que tem como característica marcante a possibilidade de criação de
código portável (bytecodes).
Desde sua concepção e popularização, a Java vem evoluindo e ampliando seus recursos,
ao mesmo tempo que as máquinas virtuais (JVM Java Virtual Machine) têm se tornado
mais ecientes. Um dos aprimoramentos da linguagem foi a introdução da reexão.
Reexão (ou introspecção) é a capacidade de um programa investigar e avaliar características sobre si mesmo. É comumente utilizada por programas que precisam examinar ou
modicar (em tempo de execução) o comportamento de aplicações que estejam executando
na JVM. Desta forma, um programa Java pode carregar uma classe sobre a qual nada conhece, encontrar as variáveis, os métodos e os construtores dessa classe, e utilizá-los.
O pacote java.lang.reect da API Java proporciona classes e interfaces para se obter informações reetidas a respeito de classes e objetos.
A classe Method desse pacote, por
exemplo, fornece informações sobre métodos de uma classe ou de uma interface, além de
permitir o acesso dinâmico a tais métodos. Com isso, pode-se, para cada método examinado,
vericar os modicadores, o nome do método, o tipo de retorno, os parâmetros do método e
as exceções que o método pode lançar. Semelhantemente, através da classe Field do mesmo
pacote, é possível obter dados e informações sobre os atributos membros da classes, como
Página 41 de 51
www.handbookdeti.com.br
Handbook de Questões de TI Comentadas para Concursos
Volume questões de TI
modicadores, tipo e nome.
Outras técnicas e métodos de programação tiram proveito da Reexão.
A Serialização é
o processo de codicação (e posterior decodicação) de objetos em um stream de bytes,
comumente utilizado para tarefas de persistência, comunicação via sockets, RMI (Remote
Method Invocation), dentre outras. Em Java, esta técnica benecia-se enormemente da reexão, pois em tempo de execução é possível inspecionar adequadamente os objetos a serem
serializados. Outro exemplo é a criação de aplicativos JavaBeans, cuja API possui diversas
interfaces e classes em seu pacote java.beans. Além dessas interfaces e classes, a tecnologia
faz uso de modelos de eventos, de serialização de objetos e de reexão. Com a reexão ca
prático examinar qualquer objeto dinamicamente para determinar (e potencialmente invocar) seus métodos.
Analisando os itens da questão, observa-se que a primeira opção apresenta uma informação
incorreta ao armar que a classe Method do pacote java.lang.reect decodica informações
de modicador sobre classes, variáveis e métodos, quando na verdade a classe em questão
fornece informações apenas sobre métodos.
Informações sobre variáveis são obtidas pela
classe Field e é através da classe Class que se obtém informações sobre as classes.
As demais armações estão de acordo com a teoria exposta.
questão encontra-se no item a).
Página 42 de 51
www.handbookdeti.com.br
Desta forma, a resposta à
Handbook de Questões de TI Comentadas para Concursos
20.
Volume questões de TI
Assuntos relacionados: Java,
Banca: CESGRANRIO
Instituição: Petrobras
Cargo: Analista de Sistemas - Eng. de Software
Ano: 2008
Questão: 60
Considere as informações a seguir para responder às questões de números 60 e
61.
São mostrados a seguir os códigos fontes das classes Produto e ProdutoTest.
O método
testDescontoValido() é invocado pelo framework de testes automaticamente quando os testes são executados, para exercitar o método descontoValido() da classe Produto. O método
assertEquals gera um junit.framework.AssertionFailedError quando os valores de seus argumentos são diferentes entre si.
01 package br.com.exemplo.estoque;
02
03 public class Produto
{
04
05
private double preco;
06
private double precoMinimo;
07
08
public Produto(double preco, double precoMinimo)
09
this.preco = preco;
10
this.precoMinimo = precoMinimo;
{
}
11
12
13
public boolean descontoValido(int percentual)
{
14
double precoComDesconto;
15
precoComDesconto = this.preco - this.preco * percentual / 100;
16
return (precoComDesconto >= this.precoMinimo);
}
17
18
}
Página 43 de 51
www.handbookdeti.com.br
Handbook de Questões de TI Comentadas para Concursos
Volume questões de TI
01 package br.com.exemplo.estoque;
02
03 import org.junit.Test;
04 import static org.junit.Assert.*;
05
06 public class ProdutoTest
{
07
08
@Test
09
public void testDescontoValido()
{
10
int percentual = 90;
11
boolean resultadoEsperado = true;
12
13
System.out.println(caderno);
14
Produto caderno = new Produto(10.00, 1.00);
15
boolean resultado = caderno.descontoValido(percentual);
16
assertEquals(resultadoEsperado, resultado);
17
18
System.out.println(caneta);
19
Produto caneta = new Produto(1.00, 0.10);
20
resultado = caneta.descontoValido(percentual);
21
assertEquals(resultadoEsperado, resultado);
}
22
23
}
Com base nos códigos fontes apresentados, conclui-se que
(a). a linha 08 de ProdutoTest é um comentário.
(b). a classe ProdutoTest descende de org.junit.Test
(c). a classe Produto não pode ter descendentes sem construtores explicitamente declarados.
(d). o campo preco da classe Produto só pode ser acessado pelas classes que estiverem
no mesmo pacote de Produto.
(e). org.junit.Assert é um pacote.
Solução:
(A) ERRADA
Em Java, existem 3 (três) tipos de comentários:
•
// Isto é o primeiro tipo de comentário
•
/* Isto é o segundo tipo de comentário */
•
/** Este é o terceiro tipo de comentário, muito utilizado para documentação web */
(B) ERRADA
Esta é uma confusão muito comum em Java. Na verdade, o código
import org.junit.Test
é utilizado para importar apenas a classe Test a m de que a classe ProdutoTest possa
acessar os seus métodos públicos (caso existam).
A classe ProdutoTest somente descenderia da classe Teste se ela fosse declarada utilizando-se
Página 44 de 51
www.handbookdeti.com.br
Handbook de Questões de TI Comentadas para Concursos
a palavra chave extends, da seguinte forma:
Lembre-se que a palavra chave
extends
Volume questões de TI
public class ProdutoTest extends Test.
indicaria que todas as declarações de métodos, va-
riáveis e campos da superclasse (classe pai) Test seriam herdadas pela classe ProdutoTest.
(C) CORRETA
Um construtor determina como um objeto é inicializado pela criação de uma nova instância de uma classe com os parâmetros especicados. Podemos tratá-lo como um método
especial: com nome igual ao da classe; sem tipo de retorno (
void);
e não herdado pelas
subclasses.
Caso você decida em não declarar um construtor em uma classe, Java automaticamente
fornecerá um construtor default que não requer nenhum argumento. O construtor default
simplesmente chama o construtor da superclasse, denominado
super(), com nenhum argu-
mento e inicializa as variáveis da instância. Se a superclasse não tiver um construtor que
não requer argumentos, ocorrerá um erro em tempo de compilação, que é o caso do presente
problema, pois note que a superclasse Produto possui apenas um construtor, obviamente de
mesmo nome, que exige dois argumentos.
Assim, a qualquer subclasse da classe Produto deverá declara explicitamente o seu construtor.
(D) ERRADA
O campo preco, como está precedido pelo modicador private, só poderá ser acessado dentro
da classe Produto. Nem mesmo as subclasses da classe Produto poderão acessar esse campo
diretamente.
Uma forma de tornar esse campo acessível para leitura, seria por meio da declaração de
public),
um método, público (
na classe Produto. Esse método retornaria apenas o valor
armazenado no campo preco.
Por outro lado, se desejássemos que esse campo fosse acessível para escrita, deveríamos
declarar um método, na classe Produto, precedido pelo modicador
protected.
Isso per-
mitiria que apenas as subclasses da classe Produto atualizem o campo preco.
(E) ERRADA
Por convenção, todos os nomes de pacotes e diretório que o seguem deveriam ser especicados usando-se letras minúsculas. Por outro lado, os nomes das classes e interfaces que você
deseja referenciar dentro do pacote deveriam ser especicados usando-se a primeira letra em
maiúsculo. Isso permite que outros programadores que usam os seus pacotes determinem facilmente quais componentes são nomes de diretórios e quais são nomes de interfaces e classes.
Assim, na verdade,
org.junit.Assert.
org.junit.* é um pacote que contém várias classes, dentre elas a classe
Página 45 de 51
www.handbookdeti.com.br
Handbook de Questões de TI Comentadas para Concursos
21.
Volume questões de TI
Assuntos relacionados: Desenvolvimento de Software, Diagrama de Classes,
Banca: CESGRANRIO
Instituição: Petrobras
Cargo: Analista de Sistemas - Eng. de Software
Ano: 2008
Questão: 62
Com base no diagrama acima, analise os trechos de código Java a seguir.
I - Produto p = new Produto();
p.setNome(Carro);
II - Seguravel s = new Veiculo();
s.setNome(Carro);
double p = s.calculaPremio();
III - Seguravel s = new Veiculo();
((Veiculo) s).setNome(Carro);
IV - Vendavel v = new Peca();
Produto p = (Produto) v;
p.setNome(Pneu);
V - Vendavel v = new Veiculo();
Produto p = (Peca)((Produto)((Veiculo) v));
Estão corretos
APENAS os trechos de código
(a). I e III
(b). I e IV
(c). II e III
Página 46 de 51
www.handbookdeti.com.br
Handbook de Questões de TI Comentadas para Concursos
Volume questões de TI
(d). III e IV
(e). IV e V
Solução:
(I) ERRADA
Observe pelo diagrama que Produto é uma classe abstrata, portanto não é possível aplicar
um construtor sobre ela. Em outras palavras, ela não pode ser instanciada. Nós precisamos
assegurar que o objeto a ser construído pertence a uma classe concreta da classe abstrata
Produto, no caso, ou a classe Veículo ou a classe Peca.
Uma solução de correção seria o
seguinte código:
Produto p = new Veículo();
(II) ERRADA
Note que apesar da variável s ser uma instância da classe Veiculo, ela foi automaticamente
convertida (upcast ) no momento da sua declaração para a interface Seguravel. Desse modo,
esse objeto poderá acessar apenas os métodos que foram denidos na interface, no caso, o
método calculaPremio, e não o método setNome.
(III) CORRETA
Semelhante à alternativa anterior, porém com um conversão (downcast ) explícita entre a
interface Seguravel e a classe que a implementa (Veiculo). Este tipo de conversão permite a
uma classe pai, no caso a interface Seguravel, acessar todos os métodos da classe lha.
Note, também, que s é uma instância da classe Veiculo, e por isso não foi necessário inserir
mecanismos que vericam o tipo do objeto antes da conversão (RITT, do inglês
Type Identication ).
Em Java isso é alcançado por meio do operador
instanceof.
Run-Time
O uso adequado desse ope-
rador garante que as conversões são sempre seguras, não permitindo que um objeto seja
convertido para uma classe inválida.
(IV) CORRETA
No trecho de código são realizadas duas conversões:
1.
Upcast
entre uma instância da classe, a classe concreta Peca, e a interface Vendavel.
Mais uma vez lembre-se que uma conversão para uma classe (ou interface) pai é feita
implicitamente;
2.
Downcast
entre a interface Vendavel, que é uma instância da classe Peca, e a classe
abstrata Produto. Observe, nesse caso, que a conversão é realizada para a classe pai
(Produto) da classe instanciada (Peca), o que é perfeitamente aceitável uma vez que
toda Peca é um Produto.
Após a realização do
downcast
o método setNome da classe Produto é apropriadamente
invocado.
Página 47 de 51
www.handbookdeti.com.br
Handbook de Questões de TI Comentadas para Concursos
Volume questões de TI
(V) ERRADA
No trecho de código, há uma tentativa de realizar um
cast
entre a instância de Veiculo,
representada por v, para a classe Peca. Tal tipo de cast (entre classe irmãs) produzirá um
erro de compilação, pois as referidas classes possuem métodos completamente diferentes e
não relacionados.
Página 48 de 51
www.handbookdeti.com.br
Handbook de Questões de TI Comentadas para Concursos
22.
Volume questões de TI
Assuntos relacionados: Linguagens de Programação, Orientação a Objeto, Herança, Classes e Superclasses, Java, Modicadores de Acesso,
Banca: ESAF
Instituição: Agência Nacional de Águas (ANA)
Cargo: Analista Administrativo - Tecnologia da Informação e Comunicação / Desenvolvimento de Sistemas e Administração de Banco de Dados
Ano: 2009
Questão: 29
Em Java, para que um método de uma superclasse não seja sobrescrito em suas subclasses,
aplica-se o modicador
(a). static
(b). public
(c). nal
(d). protected
(e). abstract
Solução:
Esta é uma questão que aborda como a linguagem Java aborda um dos principais conceitos
da programação orientada a objetos a herança. No entanto, antes de explicarmos o que é
herança, vamos rever os conceitos de classe, objeto, classe, atributos e métodos.
Um objeto pode ser denido como uma entidade com limites bem denidos e um signicado para a aplicação. Tais entidades representar elementos físicos (como um carro, uma
casa, um cliente etc), elementos conceituais (como uma venda, uma matrícula etc), elementos de software (uma lista, um array, um arquivo etc). Uma classe, por sua vez, consiste da
descrição de um grupo de objetos com propriedades e comportamento idênticos entre si.
As propriedades da qual são representadas pelos atributos dos objetos. Um objeto da classe
casa, por exemplo, poderia ter como propriedades 2 portas, 4 janelas, 100 metros quadrados
de área, entre outras. A combinação de valores dos atributos de um determinado objeto é o
que determina o seu estado. Para alterá-lo, é necessário utilizar os métodos. Vamos agora
ao conceito de herança.
A herança é um mecanismo que permite criar novas classes a partir de classes já existentes,
aproveitando-se das características (atributos e métodos) destas. Ou seja, com a herança é
possível criar classes derivadas (subclasses) a partir de classes bases (superclasses).
As subclasses herdam todos os atributos e métodos de suas superclasses.
Entretanto, as
subclasses não estão limitadas às características herdadas de sua superclasse, uma vez que
nas subclasses podem existir atributos e métodos que não existem na superclasse.
Em alguns casos, as subclasses também podem redenir os métodos herdados, oferecendo
implementações especializadas para os métodos quando necessário. Essa técnica é também
conhecida como sobrescrita ou
override.
Recordados alguns dos conceitos básicos sobre orientação a objetos, vamos agora falar um
pouco sobre as alternativas trazidas na questão static, public, nal, protected e abstract
Página 49 de 51
www.handbookdeti.com.br
Handbook de Questões de TI Comentadas para Concursos
Volume questões de TI
que, na linguagem Java, são conhecidos como modicadores de acesso, que são keywords
introduzidas no código para determinar a forma como as classes, métodos e atributos podem
ser acessados pelas diversas partes do programa.
O modicador static, quando usado em um atributo, serve para criar uma variável de classe.
Isso signica dizer que este atributo será comum em todos os objetos da classe, de modo
que as modicações neste atributo feitas por um objeto se reitam em todos os demais. Já
os métodos, quando denidos como static, impede que estes sejam sobrescritos pelas subclasses. Com isso, esta é a resposta da questão.
O modicador de acesso private indica que um um atributos ou métodos só podem ser
acessados de dentro da classe que os criou. Este modicador de acesso é o que permite ao
Java implementar o conceito de encapsulamento.
Já o modicador de acesso public determina que a classe, método ou atributo podem ser
acessados por qualquer parte do programa, e a qualquer instante da execução deste.
O modicador nal determina que a classe, método ou atributo se mantenham imutáveis no
decorrer do processamento do programa. Ao utilizarmos o modicador nal em um atributo,
estamos denindo uma constante. Já quando aplicamos este modicador a um método de
uma superclasse, impedimos que ele seja sobrescrito em suas subclasses.
Em Java, um pacote é uma coleção das classes relacionadas, que podem ser importadas
(por meio do comando import) em programas que necessitem das classes contidas no pacote.
Neste contexto, o modicador protected é o que determina que um método ou um
atributo podem ser acessados somente dentro do pacote em que estão contidos.
Por m, temos o modicador de acesso abstract, que servem para declara métodos ou classes
abstratas. Para recapitulação, métodos abstratos são aqueles que não são implementados
nas classes, cando esta tarefa a cargo das subclasses.
Já uma classe abstrata é aquela
que não está completamente implementada, cando a cargo das subclasses implementar o
restante delas.
Diante do exposto, podemos armar que a resposta da questão é a alternativa C.
Página 50 de 51
www.handbookdeti.com.br
Handbook de Questões de TI Comentadas para Concursos
Questão
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Página 51 de 51
Volume questões de TI
Resposta
B
E
A
E
A
A
E
E
E
A
B
A
D
C
A
E
E
E
A
C
D
C
Handbook de TI
Além do Gabarito
Índice Remissivo
.NET, 5
Algoritmos, 25
Bytecode, 17
Classes e Superclasses, 49
Desenvolvimento de Software, 46
Diagrama de Classes, 29, 46
EAR, 4
EJB, 4
Garbage Collection, 38
Heap, 19
Herança, 49
Interface com Usuário, 39
J2EE, 4, 5, 7, 19
JAR, 4
Java, 11, 13, 15, 17, 19, 21, 24, 25, 27, 29, 31,
32, 35, 38, 39, 41, 43, 49
Java Transaction API (JTA), 7
JavaServer Pages (JSP), 11
JEE, 5
Linguagens de Programação, 11, 15, 24, 25, 32,
35, 39, 41, 49
Máquina Virtual Java (JVM), 17, 19
Modicadores de Acesso, 49
MVC, 5, 7
Orientação a Objeto, 49
Pacotes Java, 39, 41
Programação, 38
Servidor de Aplicações, 4, 5, 19
Sobrecarga de Método, 21
Sobrescrita de Método, 21
Teste de Mesa, 27
Tratamento de Exceção em Java, 15
UML, 29
WAR, 4
52
Download