Você está na página 1de 162

Aula 03

Desenvolvimento de Software para Concursos - Curso Regular


Professor: Diego Carvalho
Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

AULA 03

SUMÁRIO PÁGINA
Apresentação 01
- Java: Conceitos Básicos 02
- Java: Sintaxe 12
- Java: Orientação a Objetos 33
- Java: Conceitos Avançados 48
Lista de Exercícios Comentados 135
Gabarito 161

Lógica de Programação. Tipos de Dados. Operadores e Expressões. Estruturas de Controle, Seleção,


Repetição e Desvio. Recursividade. Funções e Procedimentos. Complexidade de Algoritmos. Métodos de
Ordenação. BubbleSort, InsertionSort, SelectionSort, QuickSort, ShellSort, MergeSort e HeapSort.
Estruturas de Dados. Vetores e Matrizes. Lista Encadeada. Pilhas. Filas. Árvore. Grafos. Hashing. Estrutura
de Arquivos. Padrões de Projeto GOF. Padrões de Projeto Java EE. Padrões de Projeto GRASP. Java SE.
Conceitos Básicos. Plataforma Java. Compilação e Interpretação. Passagem por Valor e Referência.
Empacotamento. Raiz. Identificadores. Blocos e Comandos. Comentários. Palavras Reservadas. Tipos
Primitivos. Operadores. Vetores. Conversão de Tipos. Controle de Fluxos. Classes. Objetos. Atributos.
Métodos. Herança. Encapsulamento. Interface. Polimorfismo. Interface Gráfica. Tipos Enumerados.
Anotações. Classes Internas. Reflexão e Genéricos. Tratamento de Exceções. Sincronismo e Multithreading.
Coleções. Streams e Serialização. Classes e Operações de I/O. Novidades Java 8. Arquitetura Java EE. JSP.
Servlets. JSF. JPA. Hibernate. JDBC. JVM. Spring. Struts. JMS. JNDI. JTA. JSTL. HTML e CSS. JavaScript.
JQuery. AJAX. DHTML. XHTML. XML. XSLT. XSD. Sistemas Móveis. Android. iOS. Segurança no
Desenvolvimento. Compiladores e Interpretadores. Ferramentas de Controle de Versão. SVN. CVS. Git.
Análise Estática de Código-Fonte. SonarQube. Integração Contínua (e outros) Framework .NET, C#, Visual
Basic, ASP.NET e Visual Studio (Prof. Mayara Rosa) Delphi e PHP (Prof. Mayara Rosa).
16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 1 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

JAVA: CONCEITOS BÁSICOS

Vamos falar agora sobre uma das linguagens mais famosas do mundo! Professor, o
que é Java? É uma linguagem de programação orientada a objetos, multiplataforma,
robusta, portável, segura, extensível, concorrente e distribuída. E ela é totalmente
orientada a objetos? Não! Por que não? Porque nem todos os seus tipos de dados
são objetos (possui alguns tipos primitivos: int, float, long, double, char, etc).

Só por causa disso, professor? Não, ela também não suporta Herança Múltipla!
Entendi, mas existe alguma linguagem totalmente orientada a objetos? Sim, por
exemplo: Smalltalk! E ela é uma linguagem compilada ou interpretada? Na verdade,
ela é híbrida, i.e., ela é compilada e interpretada! Professor, ouvi dizer que Java é
lento! É verdade? Atualmente, não!

De fato, era lenta no início! No entanto, na década passada houve diversas


melhorias na Java Virtual Machine (JVM) e em seu Compilador JIT1. Hoje em dia, o
desempenho geral do Java é absurdamente rápido de acordo com diversos
benchmarks. A Máquina Virtual é capaz de realizar diversas otimizações por meio
de algoritmos heurísticos e o Compilador é capaz de identificar hotspots.

Vocês sabiam que Java é uma Linguagem WORA? Pois é, esse acrônimo significa
Write Once, Run Anywhere ou Escreva uma vez, execute em qualquer lugar. Trata-se
de um slogan para exemplificar os benefícios multiplataforma da linguagem Java!
Idealmente, isso significa que um programa em Java (uma vez compilado em um
bytecode) pode rodar em qualquer equipamento que possua uma JVM!

A linguagem Java foi criada pela Sun Microsystems, que depois foi adquirida pela
16712855225

Oracle, por quem é mantida atualmente. Por que ela é uma linguagem concisa e
simples? Porque não contém redundâncias e é fácil de entender, implementar e
utilizar. Ela possui sintaxe bastante parecida com C++, facilitando o aprendizado e
a migração por novos programadores.

Professor, Java é robusta? Sim! Além de ser fortemente tipada, foi desenvolvida para
garantir a criação de programas altamente confiáveis. Ela não dispensa uma
programação cuidadosa, porém elimina alguns tipos de erros de programação

1
Compilador Just-In-Time (JIT) é o compilador que altera a maneira na qual programas em Java são executados,
geralmente otimizando-os e tornando-os mais rápidos.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 2 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

possíveis em outras linguagens. A ausência da aritmética de ponteiros também


exclui toda uma classe de erros relacionados a esse tipo de estrutura.

O acesso a arrays strings, e a conversão de tipos são checados em tempo de


execução para assegurar a sua validade. O Garbage Collector2 faz a desalocação
automática de memória evitando, erros de referência e desperdício de memória.
Finalmente, o recurso de Exception Handling permite o tratamento de erros em tempo
de execução, por um mecanismo robusto, análogo ao do C++.

Java é também uma linguagem portável e multiplataforma! O Compilador é capaz


de gerar um código intermediário (bytecode), que permite que o mesmo programa
possa ser executado em qualquer máquina ou sistema operacional que possua uma
JVM. Ademais, busca que todos os aspectos da linguagem sejam independentes de
plataforma (Ex: ela especifica o tamanho e comportamento de cada tipo de dado).

Dessa forma, aplicações funcionam da mesma maneira em qualquer ambiente.


Podemos dizer que Java é uma linguagem concorrente ou multithreaded, i.e., pode
realizar diversas tarefas assincronamente com o uso de threads, que são suportadas
de modo nativo. Java torna a manipulação de threads tão simples quanto trabalhar
com qualquer variável.

Java é uma linguagem distribuída, i.e., foi projetada para trabalhar em um ambiente
de redes, oferecendo bibliotecas para facilitar a comunicação, manipulando objetos
distribuídos e oferecendo suporte à conectividade (Ex: URL, Sockets, Protocolos, etc).
Ela também é uma linguagem segura, implementando encapsulamento,
restringindo o acesso e a execução de diversos programas, tratando exceções, etc.

Além disso, possui um verificador de bytecodes, que investiga e procura códigos


maliciosos que eventualmente podem ter sido inseridos, rompendo com a
16712855225

integridade dos dados. Por fim, ele também possui o Security Manager, utilizado
para impedir, por exemplo, que applets executem códigos arbitrariamente. Isso
impede o acesso direto a informações pela memória ou inserir código estranho.

Para finalizar, cabe salientar que Java é uma linguagem absurdamente extensível.
Por que, professor? Porque ela integra diversas bibliotecas com o código nativo, além
de permitir o carregamento dinâmico de classes em tempo de execução. Em outras
palavras, os programas são formados por uma coleção de classes armazenadas
independentemente e que podem ser carregadas no momento de utilização.
2
Garbage Collector (ou Coletor de Lixo) é o responsável pela automação do gerenciamento de memória. Ele é
capaz recuperar uma área de memória inutilizada por um programa, evitando vazamento de memória.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 3 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

JAVA: PLATAFORMA JAVA

Java é tanto uma plataforma quanto uma linguagem de programação orientada a


objetos que permite o desenvolvimento de aplicações em diversas plataformas
diferentes. Como já foi dito anteriormente, Java está presente desde dispositivos
pequenos (Smartphone, Tablet, etc) a máquinas de grande porte (Servidores,
Mainframes, etc). A linguagem Java possui quatro ambientes de desenvolvimento:

 Java Standard Edition (Java SE): trata-se de uma ferramenta de


desenvolvimento para a Plataforma Java. Ela contém todo o ambiente
necessário para a criação e execução de aplicações Java, incluindo a Máquina
Virtual (JVM), Compilador (Javac), Bibliotecas (APIs), entre outras ferramentas.
Em geral, rodam em computadores pessoais, notebooks, etc.

 Java Enterprise Edition (Java EE): trata-se do padrão para desenvolvimento


de sistemas corporativos, voltada para aplicações multicamadas, baseadas
em componentes executados em servidores de aplicações – ele inclui o Java
SE. Contém bibliotecas para acesso a base de dados, RPC, CORBA, entre
outras. As aplicações podem ou não estar na internet.

 Java Micro Edition (Java ME): trata-se do padrão aplicado a dispositivos


compactos ou móveis, como smartphones, tablets, controles remotos, etc.
Permite o desenvolvimento de softwares embarcados, i.e., aplicações que
rodam em um dispositivo de propósito específico, desempenhando alguma
tarefa útil. Em geral, possuem limitações de recursos como memória ou
processamento.

 Java Card: tecnologia que permite que pequenos aplicativos baseados em


Java (conhecidos como Applets) sejam executados com segurança em
16712855225

smartcards e outros dispositivos similares com grandes limitações de


processamento e armazenamento. Sabe o chip do seu celular? Java Card!
Sabe o chip do cartão de crédito? Java Card!

 Java FX: trata-se de uma plataforma de software multimídia para a criação e


disponibilização de Rich Internet Application (RIA) que pode ser executada
em diversos dispositivos diferentes. Ele permite a criação de aplicações ricas
para navegadores, smartphones, televisores, video-games, blu-rays, etc – são
os menos conhecidos.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 4 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

Um programa escrito para a plataforma Java necessita de um ambiente de execução


chamado Java Runtime Environment (JRE)! O que tem nesse negócio, professor? Ele
contém uma Máquina Virtual (JVM) e Bibiliotecas (APIs). E o Java Development Kit
(JDK)? Bem, eles contêm a JRE e outros componentes úteis para executar aplicações
(Exemplo: Javac, Javadoc, Jar, Appletviewer, Jconsole, Jstack, Jhat, etc).

Portanto, é o seguinte: se você deseja somente executar alguma aplicação Java no


seu computador ou navegador, basta instalar um JRE! No entanto, se você planeja
programar em Java, você precisará de um JDK (que contém a JRE)! Entenderam? É
bastante simples! JRE é o mínimo que você precisa para rodar uma aplicação e o
JDK é o que você precisa para desenvolver uma aplicação!

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 5 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

JAVA: COMPILAÇÃO E INTERPRETAÇÃO

A Linguagem Java tem dois processos de execução de código-fonte: Compilação e


Interpretação! Vamos lá... o programador escreve um código em Java em um editor
de texto, por exemplo. Ele salva com a extensão .java e passa por um compilador
(JavaC)! Esse compilador transforma o arquivo .java em código de máquina e em um
arquivo .class, também chamado bytecode – como mostra a imagem abaixo.

O bytecode é um código intermediário, que é posteriormente interpretado e


executado por uma Java Virtual Machine (JVM). O que é isso, professor? É um
programa que carrega e executa os aplicativos Java, convertendo bytecodes em
código executável. Lembram que eu falei que Java é uma Linguagem WORA? Pois é,
isso ocorre em grande parte por conta do bytecode e da Máquina Virtual Java.

16712855225

Por conta deles, programas escritos em Java podem funcionar em qualquer


plataforma de hardware e software que possua uma JVM, tornando assim essas
aplicações independentes da plataforma, como apresenta a imagem acima (Win32,

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 6 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

UNIX e MacOS)! Galera, qualquer plataforma... desde um computador a uma


geladeira. A imagem abaixo é similar à anterior, apenas para solidificar!

Uma observação importante: Código Java é sempre compilado em um bytecode.


No entanto, nem todo bytecode é proveniente de Código Java. Como assim,
professor? É isso mesmo! Por exemplo: eu posso compilar o Código Ada em um
bytecode e rodá-lo em uma JVM! E quais outras linguagens? Temos também Eiffel,
Pascal, Python, C.

A JVM é capaz de entender bytecodes – assim como nós somos fluentes em


português, ela é fluente em bytecode. Para criar bytecodes, basta seguir um
conjunto de regras de formação. Logo, se existe um compilador que seja capaz de
transformar o código-fonte (de qualquer linguagem) em uma bytecode seguindo
16712855225

as especificações corretamente, o bytecode poderá ser interpretado por uma JVM.

CURIOSIDADE

A Sun Microsystems declarou recentemente que existem atualmente cerca de 5.5 bilhões de
dispositivos executando uma Java Virtual Machine (JVM).

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 7 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

JAVA: PASSAGEM POR VALOR E POR REFERÊNCIA

Vamos falar sobre passagem de parâmetros por valor e por referência. Vocês sabem
que, quando o módulo principal chama uma função ou procedimento, ele passa
alguns valores chamados Argumentos de Entrada. Esse negócio costuma confundir
muita gente, portanto vou explicar por meio de um exemplo, utilizando a função
DobraValor(valor1, valor2) – apresentada na imagem abaixo:

#include <stdio.h>

void DobraValor(int valor1, int valor2)


{
valor1 = 2*valor1;
valor2 = 2*valor2;

printf("Valores dentro da Função: \nValor 1 = %d\n Valor 2 = %d\n",valor1,valor2);


}

int main()
{
int valor1 = 5;
int valor2 = 10;

printf("Valores antes de chamar a Função:\nValor 1 = %d\nValor 2 = %d\n",valor1,valor2);


DobraValor(valor1,valor2);
printf("Valores depois de chamar a Função:\nValor 1 = %d\nValor 2 = %d\n",valor1,valor2);

return();
}

Essa função recebe dois valores e simplesmente multiplica sua soma por dois. Então
o que acontece se eu passar os parâmetros por valor para a função? Bem, ela
receberá uma cópia das duas variáveis e, não, as variáveis originais. Logo, antes de
a função ser chamada, os valores serão os valores iniciais: 5 e 10. Durante a chamada,
ela multiplica os valores por dois, resultando em: 10 e 20.

Valores antes de chamar a Função: 16712855225

Valor 1 = 5
Valor 2 = 10
Valores dentro da Função:
Valor 1 = 10
Valor 2 = 20
Valores depois de chamar a Função:
Valor 1 = 5
Valor 2 = 10

Após voltar para a função principal, os valores continuam sendo os valores iniciais:
5 e 10, como é apresentado acima na execução da função. Notem que os valores
só se modificaram dentro da função DobraValor( ). Por que, professor? Ora, porque foi
passada para função apenas uma cópia dos valores e eles que foram multiplicados
por dois e, não, os valores originais.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 8 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

#include <stdio.h>
void DobraValor(int *valor1, int *valor2)
{
*valor1 = 2*(*valor1);
*valor2 = 2*(*valor2);
printf("Valores dentro da Função: \nValor 1 = %d\n Valor 2 = %d\n", *valor1,
*valor2);
}
int main()
{
int valor1 = 5;
int valor2 = 10;

printf("Valores antes de chamar a Função:\nValor 1 = %d\nValor 2 =


%d\n",valor1,valor2);
DobraValor(&valor1,&valor2);
printf("Valores depois de chamar a Função:\nValor 1 = %d\nValor 2 =
%d\n",valor1,valor2);

return();
}

Professor, o que ocorre na passagem por referência? Bem, ela receberá uma
referência para as duas variáveis originais e, não, cópias. Portanto, antes de a função
ser chamada, os valores serão os valores iniciais: 5 e 10. Durante a chamada, ela
multiplica os valores por dois, resultando em: 10 e 20. Após voltar para a função
principal, os valores serão os valores modificados: 10 e 20.

Valores antes de chamar a Função:


Valor 1 = 5
Valor 2 = 10
Valores dentro da Função:
Valor 1 = 10
Valor 2 = 20
Valores depois de chamar a Função:
Valor 1 = 10
Valor 2 = 20

Notem que os valores se modificaram não só dentro da função DobraValor( ), como


16712855225

fora também (na função principal). Por que isso ocorreu, professor? Ora, porque foi
passada para função uma referência para os valores originais e eles foram
multiplicados por dois, voltando à função principal com os valores dobrados! Por
isso, os valores 10 e 20.

Resumindo: a passagem de parâmetro por valor recebe uma cópia da variável


original e qualquer alteração não refletirá no módulo principal. A passagem de
parâmetro por referência recebe uma referência para a própria variável e qualquer
alteração refletirá no módulo principal. Agora atenção máxima: em Java, a
passagem de parâmetros é sempre, sempre, sempre por valor! Bacana?

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 9 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

JAVA: EMPACOTAMENTO

Utilizamos pacotes para organizar as classes semelhantes! Grosso modo, pacotes


são apenas pastas ou diretórios do sistema operacional onde ficam armazenados
os arquivos fonte de Java e são essenciais para o conceito de encapsulamento, no
qual são dados níveis de acesso às classes. O empacotamento gera um arquivo .jar,
que pode ser adicionado no classpath de uma aplicação.

Uma vez criada uma pasta (que será um pacote), deve-se definir para as classes a
qual pacote elas pertencem. Isso é feito pela palavra-reservada package:

package br.com.site.pacoteEstrategia;

Essa deve ser a primeira linha de comando a ser compilada na classe. Java possui
vários pacotes com outros pacotes internos e várias classes já prontas para serem
utilizadas. Dentre os pacotes, podemos determinar dois grandes: o pacote java, que
possui as classes padrões para o funcionamento da linguagem; e o pacote javax, que
possui pacotes de extensão que fornecem ainda mais classes e objetos.

Em geral, aquelas classes fortemente conectadas às funções nativas do sistema


operacional pertencem ao pacote java e as que não são tão fortemente conectadas
pertencem ao pacote javax. Para utilizar os milhares de classes contidas nos inúmeros
pacotes de Java devemos nos referenciar diretamente a classe ou importá- . Para
importar um pacote usamos a palavra-reservada import.

import javax.swing.JOptionPane;

Para separar um pacote de seu sub-pacote, usam-se pontos (br.com.site.pacoteEstrategia).


Ao utilizar o asterisco (*), todos os subpacotes do pacote são importados: import
16712855225

java.awt.* - isso importa todos os sub-pacotes pertencentes ao pacote java.awt.


entanto, podemos definir diretamente o pacote desejado: import javax.swing.JOptionPane.
Isso irá importar apenas o sub-pacote JOptionPane do pacote javax.swing.

A diferença entre as duas formas de importação de pacotes é o consumo de


recursos do computador. Como o asterisco importa todos os sub-pacotes, o
consumo de memória será alto e, muito provavelmente, não usaremos todas as
classes de todos os pacotes importados. Por isso, o recomendado é sempre
importar apenas o pacote que será utilizado. A ordem é Package, Import e Class.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 10 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

JAVA: RAÍZ

Muitas linguagens orientadas a objetos (como o C++) não suportam a noção de


existir uma única classe a partir da qual todas as outras classes são derivadas, sem
que isso seja um impedimento à linguagem. Entretanto, na linguagem Java, a falta
desse tipo de classe tornaria a linguagem limitada. Todos os objetos da linguagem
Java são de múltiplas camadas.

Cada classe, na hierarquia de classes, representa uma camada que adiciona diversas
capacidades a um objeto. No topo desta hierarquia você sempre vai encontrar uma
classe chamada de Object (Objeto). Qualquer classe estende implicitamente (sem
necessidade de declarar) a classe Object. Claro que, na maioria das vezes, isso ocorre
indiretamente. Bacana, pessoal?

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 11 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

JAVA: SINTAXE

JAVA: IDENTIFICADORES

Antes de tudo, é importante ressaltar que o Java é case-sensitive (Flamengo é diferente


de flamengo). Identificador é o nome utilizado para representar variáveis, classes,
objetos, métodos, pacotes, interfaces, etc. Por exemplo: na matemática, utiliza-se
um nome para as incógnitas (x, y, z) que é o identificador daquela incógnita. No Java,
existem um conjunto de regras para criação do identificador:

Deve ser a combinação de uma ou mais letras e dígitos UNICODE-16: Letras: A-Z;
Letras: a-z; Underscore: _ ; Cifrão: $ ;Números: 0-9.

1. Não pode ser uma palavra-reservada (palavra-chave);


2. Não pode ser true, false ou null;
3. Não pode começar com números;
4. Não pode conter espaços em branco ou caracteres de formatação;

//CORRETO
int MyVariable, myvariable, MYVARIABLE;
int x, i, , OReilly;
int _myvariable, $myvariaBle, _9pins;

//INCORRETO
int My Variable; //Contém espaço
int 9pins; //Começa com um dígito
int a+c, test-1, o'reilly&; //Contém caractere não-alfanumérico

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 12 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

JAVA: BLOCOS E COMANDOS

Blocos de programação são aglomerados de instruções e declarações que têm


escopo conjunto. Em outras palavras, as variáveis definidas como locais dentro de
um bloco somente serão presentes dentro deste bloco, assim como as instruções
ali presentes. Os blocos de programação são delimitados por chaves { } e podem
ser aninhados, já os comandos sempre são terminados com ponto-e-vírgula.

import java.util.*;
import java.lang.*;
import java.io.*;

class Ideone {
public static void main (String[] args) throws java.lang.Exception
{ //Início Bloco 1

int a = 10;
int b = 1;

if (b==3)
{ //Início Bloco 2
b = a*10;
}
else
{ //Início Bloco 3
int a = 100;
b = a*10;
}
System.out.println("O valor de b é " + b);

}
}

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 13 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

JAVA: COMENTÁRIOS

Os comentários, como o próprio nome preconiza, são notas que podem ser
incluídas no código-fonte de um programa para descrever o que o desenvolvedor
desejar. Dessa forma, eles não modificam o programa executado e servem somente
para ajudar o programador a melhor organizar os seus códigos. Os comentários
em Java seguem a mesma sintaxe da linguagem C++:

import java.util.*;
import java.lang.*;
import java.io.*;

class Ideone {
public static void main (String[] args) throws java.lang.Exception {

/**
* Comentário de mais de uma linha!
**/

int a = 10;
int b = (int)(a*3.141592); //Comentário de única linha!

System.out.println("O valor de b é " + b);


}
}

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 14 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

JAVA: PALAVRAS RESERVADAS

Java possui 52 palavras-reservadas: três palavras para modificar acesso; treze


palavras para modificar classes, variáveis e métodos; doze palavras para controle de
fluxo; seis palavras para tratar erros; duas palavras para controlar pacotes; oito
palavras para tipos primitivos; duas palavras para variáveis de referência; uma
palavra para retorno de método; e duas palavras reservadas não utilizadas.

Espera, professor! Mas eu contei e deu 49 palavras! É que null true false não são
consideradas tecnicamente palavras-reservadas, mas valores literais. No entanto,
isso é só tecnicamente, porque caso se tente criar identificadores com essas
palavras, resultará em erro de compilação. Vamos ver todas as palavras reservadas?
A tabela abaixo apresenta cada uma e sua descrição:

Palavras Descrição
abstract Aplicado a um método ou classe indica que a implementação completa deste
método ou classe é efetuada posteriormente, por uma subclasse. Caso seja
uma classe, significa que ela não pode ser instanciada.
boolean É um tipo de dados cujos valores podem ser true ou false.

break Comando para controle de laço, no estilo C/C++.

byte Tipo de dados inteiros com sinal, armazenado em formato binário na notação
de complemento a dois e tamanho de 8 bits.

case Indica uma opção entre várias em blocos switch.


16712855225

catch É utilizado juntamente com try, seu bloco é executado somente em caso de o
programa lançar uma exceção do tipo indicado no seu parâmetro.

char Para variáveis de caracteres, onde a sua representação interna equivale a


um tipo numérico.

class Para definir o início de um arquivo Java, todas as classes possuem pelo
menos essa palavra-chave.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 15 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

const Essa palavra não tem uso específico em Java mas mesmo assim é uma
palavra-chave.

continue Para pular a iteração atual de uma estrutura de repetição.

default Normalmente utilizado para o final de uma ou mais opções case´s de um


bloco catch.

do Estrutura de repetição que garante que o bloco será executado pelo menos
uma vez durante a execução do programa.

double Para variáveis numéricas e de pontos flutuantes com precisão de 64 bits.

else Complemento de estrutura de condição.

enum Palavra-chave adicionada na versão 5 do Java; é um tipo específico de dados


que assemelha-se com uma classe que tem operações e dados internos.

extends Utilizado para aplicar o conceito de herança para uma classe, onde uma
classe receberá os métodos e variáveis de instância da classe chamada de
pai.
final Marca uma variável, classe ou método para que não seja possível modificar
o seu valor ou comportamento no decorrer da execução do programa.

finally Compõe o início de um bloco que sempre é executado para um bloco de


16712855225

tratamento de erros, mais utilizado para limpar recursos que foram abertos
no bloco de tratamento.
float Variáveis numéricas e de pontos flutuantes com precisão de 32 bits.

for Estrutura de repetição que declara, testa e incrementa variável para uso
local.

goto Não tem uso específico na linguagem.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 16 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

if Estrutura de condição mais comum na linguagem.

implements Informa que uma determinada classe irá implementar uma determinada
interface.

import Para relacionar classes externas à atual, permitindo o uso de nomes mais
curtos para recursos da classe externa.

instanceof Testa se um objeto é uma instância de uma classe específica ou se é null.

int Para variáveis numéricas de precisão -2.147.483.648 até 2.147.483.647.

interface Informa que o modelo não é uma classe, mas sim um protótipo de classe sem
implementação para os métodos, obrigando as classes que a implementarão
a seguir as determinadas regras.
long Para variáveis numéricas de precisão de 64 bits.

native Métodos marcados como native dizem que sua implementação é feita em uma
outra linguagem (por exemplo, C), para que se possa acessar recursos
específicos do sistema operacional.
new Utilizada para se criar novas instâncias de objetos.

16712855225

package Informa em que estrutura de diretórios a classe está localizada.

private Marca a visibilidade de um método ou variável de instância para que apenas


a própria classe acesse.

protected Marca a visibilidade de um método ou variável de instância para que a própria


classe ou suas filhas acessem.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 17 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

public Marca a visibilidade de uma classe, método ou variável de instância para que
todas as classes em todos os pacotes tenham acesso.

return Devolve para o método chamador de um valor que é do mesmo tipo declarado
na assinatura do método.

short Para variáveis numéricas de precisão de -32.768 até 32.767.

static Marca um método ou variável para que se tenha apenas uma cópia da
memória desse membro.

strictfp Serve para aumentar a precisão em operações com pontos flutuantes.

super Chama membros da classe-pai.

switch Representa blocos de decisões de fluxos semelhantes ao if, mas com mais
organização em determinadas situações.

synchronized Um método com essa marcação será controlado para que não se possa ter
duas threads acessando o mesmo objeto.

this Representa a instância que está atualmente sendo executada.

throw É utilizado para lançar uma exceção.


16712855225

throws É utilizado para se declarar que um método pode lançar uma exceção.

transient Indica que uma determinada variável de instância não será serializada junto
com o objeto da classe.

try Para executar métodos que têm chances de lançar exceções, mas que serão
tratados em blocos catch que o seguirão.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 18 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

void Representa um retorno vazio, i.e., nenhum retorno para esse método.

volatile Indica que uma determinada variável de instância pode ser modificada em
duas threads distintas ao mesmo tempo.

while Bloco de repetição que será executado enquanto seu parâmetro estiver
retornando true.

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 19 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

JAVA: TIPOS PRIMITIVOS

A linguagem Java oferece um total de oito tipos primitivos para criação de


programas. Esses tipos são utilizados para declarar variáveis que auxiliam na
construção dos algoritmos. Apesar de a linguagem oferecer tantos tipos, muitos
deles são capazes de representar os mesmos tipos de dados, mas com uma
capacidade de armazenamento maior (maior quantidade de bits).

Variáveis do tipo byte, short, int e long, por exemplo, podem ser usadas para representar
números inteiros, variando em diferentes faixas de valores, embora os tipos int e long
sejam os mais utilizados. O mesmo acontece com variáveis do tipo float double, que
são usadas para representar números reais. O tipo boolean é usado para declarar
variáveis que podem assumir um os valores: true ou false.

NOME TIPO TAMANHO MÍNIMO MÁXIMO DEFAULT

LÓGICO boolean - false true false


CARACTERE char 16 bits 0 216 – 1 ‘\u0000’
byte 8 bits -27 27 – 1 0
short 16 bits -215 215 – 1 0
INTEIRO
int 32 bits -231 231 – 1 0
long 64 bits -263 263 – 1 0
float 32 bits 7 Casas Decimais 0.0
DECIMAL
double 64 bits 15 Casas Decimais 0.0

Variáveis booleanas são bastante usadas em comandos condicionais ou de


repetição. Finalmente, o tipo char é utilizado para representar caracteres, como, por
16712855225

exemplo, as letras de alfabetos de línguas de diferentes países. Apesar de, em alguns


programas, ser necessário o uso do tipo char para representar e permitir o
processamento de caracteres de uma frase, o mais comum é usar a classe String.

Galera, vou enfatizar isso novamente porque é realmente importante! String não é
um Tipo Primitivo! Bacana? String não é um Tipo Primitivo, nunca foi e jamais será
um Tipo Primitivo. Além disso, a Classe String pertence ao pacote Lang e herda
diretamente de Object. Outra coisa: posso escrever números na forma decimal (8),
octal (08) ou hexadecimal (0x8).

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 20 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

OBSERVAÇÕES

O valor-padrão para um número decimal é Double; se o programador quiser que seja Float,
deve enviar como parâmetro o valor acrescido da letra f (Ex: 3.14f). Da mesma forma, o
valor-padrão para inteiro é um int. O único tipo primitivo que não pode ser atribuído a
nenhum outro tipo é o boolean.

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 21 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

JAVA: OPERADORES

Os operadores são sinais que representam atribuições, cálculos e ordem dos dados.
As operações seguem uma ordem de prioridades, ou seja, alguns cálculos são
processados antes de outros, assim como ocorre na matemática. Para manipular os
valores das variáveis de um programa, devemos utilizar os operadores oferecidos
pela linguagem de programação adotada.

ARITMÉTICOS ATRIBUIÇÃO RELACIONAIS LÓGICOS BIT A BIT


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

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

$Numero = 2 + 8; //$Numero = 2 + 8 = 10
$Numero = 8 - 2; //$Numero = 8 - 2 = 6
$Numero = 2 * 8; //$Numero = 2 * 8 = 16
$Numero = 8 / 2; //$Numero = 8 / 2 = 4
$Numero = 2 % 8; //$Numero = 2 % 8 = 8 (Resto da divisão de 2 por 8)

String $palavra1 = "Alô";


String $palavra2 = "Mundo!";

String $frase = $palavra1 + ", " + $palavra2; //$frase = "Alô, Mundo!"

Operadores de Atribuição: =, +=, -=, *=, /=, %=, ++, --. 16712855225

int $Numero = 5; //Atribui-se o valor 5 a variável $Numero

$Numero ++; //$Numero = $Numero + 1 = 5 + 1 = 6


$Numero --; //$Numero = $Numero - 1 = 6 1 = 5

$Numero += 3; //$Numero = $Numero + 3 = 5 + 3 = 8


$Numero -= 3; //$Numero = $Numero - 3 = 8 3 = 5

$Numero *= 3; //$Numero = $Numero * 3 = 5 * 3 = 15


$Numero /= 3; //$Numero = $Numero / 3 = 15 / 3 = 5

$Numero %= 3; //$Numero = $Numero % 3 = 5 % 3 = 2 (Resto da divisão de 5 por 3)

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

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 22 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03
boolean Variavel_1;

Variavel_1 = 4 < 4; //FALSE: 4 não é menor que 4


Variavel_1 = 4 <= 4; //TRUE: 4 é menor ou igual a 4
Variavel_1 = 3 > 7; //FALSE: 3 não é menor que 7
Variavel_1 = 3 >= 7; //FALSE: 3 não é maior ou igual a 7
Variavel_1 = 1 == 1; //TRUE: 1 é igual a 1
Variavel_1 = 2 != 1; //TRUE: 2 é diferente de 1

int Variavel_2 = 4;
int Variavel_3 = 8;

Variavel_2 = (Variavel_2 > Variavel_3)? Variavel_2: Variavel_3;


//Variavel_2: 4 não é maior que 8, logo Variavel_2 recebe o valor de Variavel_3
Variavel_3 = (Variavel_2 < Variavel_3)? Variavel_2: Variavel_3;
//Variavel_3: 4 é menor que 8, logo Variavel_3 recebe o valor de Variavel_2

Moto $cg500 = new Moto();


Carro $celta = new Carro();

boolean Teste = $celta instanceof Carro; //TRUE: $celta é uma instância de Carro
boolean Teste = $cg500 instanceof Carro; //FALSE: $cg500 não é uma instância de Carro

Vamos ver abaixo um exemplo mais complexo:

//Caso 1: y = 2 e x = 2
int x = 0;
int y = x++ + ++x;

//Caso 2: y = 1 e x = 2
int x = 0;
int y = x++ + x++;

//Caso 3: y = 3 e x = 2
int x = 0;
int y = ++x + ++x;

//Caso 4: y = 2 e x = 2
int x = 0;
int y = ++x + x++;

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


16712855225

boolean $Variavel;

$Variavel = (2<45) && (45<2) //$Variavel = TRUE && FALSE = FALSE


$Variavel = (2<45) || (45<2) //$Variavel = TRUE || FALSE = TRUE

!$Variavel //$Variavel = FALSE;


!$Variavel //$Variavel = TRUE;

Operadores Bit a Bit: &, |, ^, <<, >>, >>>.

int $Variavel;
$Variavel = 34 & 435; //000100010 & 110110011 = 100010 = 34 (Operação AND)
$Variavel = 34^46; //000100010 ^ 000101110 = 000001100 = 12 (Operação XOR)
$Variavel = 436|547; //0110110100 | 1000100011 = 1110110111 = 951 (Operação OR)

int $Variavel = -3; //$Variavel vale -3

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 23 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03
$Variavel = $Variavel >> 1 //$Variavel = 11111101 >> 1 = 11111110 = -2 (SHIFT RIGHT)
$Variavel = $Variavel << 1; //$Variavel = 11111110 << 1 = 11111100 = -4 (SHIFT LEFT)
$Variavel = $Variavel >>> 1; //$Variavel = 11111100 >>> 1 = NÚMERO GIGANTE

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 24 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

JAVA: VETORES

Um vetor é uma estrutura de dados formada por um conjunto de dados ou outros


elementos de um mesmo tipo, podendo ter uma dimensão ou mais (quando tem
duas, é chamado de matriz) e cujo acesso aos dados é feito através de índices. Cada
item de um vetor é chamado de elemento. Cada um dos elementos possui uma
posição dentro do vetor, à qual referenciamos através do índice do elemento.

Para declarar um vetor e de uma matriz, devemos utilizar a seguinte sintaxe:

//Declaração 1
tipo[] identificador1;
tipo identificador1[];

//Declaração 2
tipo[] identificador2 = new tipo[];
tipo identificador2[] = new tipo[];

//Declaração 3 (Para duas dimensões)


tipo[][] identificador3;
tipo identificador3[][];

Para inicializar um vetor, devemos utilizar a seguinte sintaxe:

//Inicialização 1
int[] Vetor1 = {34,27,91,56};

//Inicialização 2 (Inválida)
int[] Vetor2 = new int[4];
Vetor2 = {34,27,91,56};

//Inicialização 3
int[] Vetor3 = new int[4];
Vetor3[0] = 34;
Vetor3[1] = 27;
Vetor3[2] = 91;
Vetor3[3] = 56; 16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 25 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

JAVA: CONVERSÃO DE TIPOS

Muitas vezes precisamos fazer cálculos e guardar o resultado em alguma outra


variável para uso posterior, porém o tipo de resultado pode não condizer com o
tipo da variável que irá receber esse resultado, seja de outra variável ou resultado
de uma expressão matemática. A conversão de tipos primitivos é a transformação
de um tipo para outro. Essas conversões podem ser implícitas ou explícitas.

As conversões implícitas ocorrem quando atribuímos um valor de menor tipo em


uma variável de tipo maior. Este tipo de conversão também é conhecido como
conversão de ampliação e ocorrerá de forma automática porque um valor de menor
tipo sempre caberá em uma variável de maior tipo. Podemos ver um exemplo
representado abaixo:

import java.util.*; import java.lang.*; import java.io.*;

class Ideone {
public static void main (String[] args) throws java.lang.Exception {

System.out.println("Conversão Implícita:");
double a1 = 10*5.2 + 4 - 1.3;
System.out.println("Variável a1 = " + a1);
double a2 = 5/2; 16712855225

System.out.println("Variável a2 = " + a2);


double a3 = 5/2.0;
System.out.println("Variável a3 = " + a3);

System.out.println("\nConversão Explícita:");
int a4 = (int) (10*5.2 + 4 - 1.3);
System.out.println("Variável a4 = " + a4);
int a5 = (int) (5/2.0);
System.out.println("Variável a5 = " + a5);
}
}

O resultado das conversões implícitas e explícitas são apresentados abaixo:

Conversão Implícita:
Variável a1 = 54.7

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 26 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03
Variável a2 = 2.0
Variável a3 = 2.5

Conversão Explícita:
Variável a4 = 54
Variável a5 = 2

A conversão explícita ou de redução ocorre quando precisamos atribuir um valor


de tipo maior para uma variável de tipo menor. Nesse caso, precisamos informar
diretamente entre parênteses (antes da variável, literal ou resultado de uma
expressão) o tipo de dado que vamos converter. Existem 19 conversões implícitas e
22 conversões explícitas possíveis.

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 27 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

JAVA: CONTROLE DE FLUXO

Professor, o que é Controle de Fluxo? É como se controla o fluxo de um código, isto


é, como um programa executa suas tarefas! Por meio de comandos, tarefas podem
ser executadas seletivamente, repetidamente ou excepcionalmente. Não fosse o
controle de fluxo, um programa poderia executar apenas uma única sequência de
tarefas, perdendo seu dinamismo.

Em Java, temos duas estruturas: Seleção e Repetição. A Estrutura de Seleção (ou


Condição) consiste basicamente dos comandos if-else. Ele é empregado para
executar seletivamente ou condicionalmente um outro comando mediante um
critério de seleção. Esse critério é dado por uma expressão, cujo valor resultante
deve ser um dado do tipo booleano, isto é, true ou false.

Se esse valor for true, então o outro comando é executado; se for false, a execução
do programa segue adiante. A sintaxe do if-else é apresentada abaixo:

if(CondiçãoBooleana) {
comando1;
comando2;
(...)
comandoN;
}
else {
comando1;
comando2;
(...)
comandoN;
}

Uma variação desse comando, o if-else permite escolher alternadamente entre dois
outros comandos a executar. Nesse caso, se o valor da expressão condicional que
define o critério de seleção for true, então o primeiro dos outros dois comandos é
16712855225

executado, do contrário, o segundo. Lembrando que é possível aninhar ou combinar


vários comandos else e if – o último else é opcional.

int idade;

if (idade <= 1)
System.out.println( Bebê );
else if(idade > 1 && idade <= 10)
System.out.println( Criança );
else if(idade > 10 && idade <= 13)
System.out.println( Pré-adolescente );
else if(idade > 13 && idade <= 18)
System.out.println( Adolescente );
else
System.out.println( Adulto );

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 28 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

Existem algumas situações em que se sabe de antemão que as condições assumem


o valor true de forma mutuamente exclusiva, i.e., apenas uma entre as condições
sendo testadas assume o valor true ao mesmo momento. Nesses casos, a linguagem
Java provê um comando de controle de fluxo bastante poderoso. Trata-se do
comando swich, cuja sintaxe é a seguinte:

switch([expressão]) {
case [constante 1]:
[comando 1]
break;
case [constante 2]:
[comando 2]
break;
...
case [constante n]:
[de comando n]
break;
default:
[comando]
}

A [expressão] pode ser qualquer expressão válida. Ela é avaliada e o seu valor
resultante é comparado com as constantes distintas [constante 1], [constante 2], ...,
[constante n]. Caso esse valor seja igual a uma dessas constantes, o respectivo
comando é executado (e todos os demais são saltados). Se o valor for diferente, o
comando presente sob o rótulo default: é executado. Vejamos outro exemplo:

int mesAtual = 5;

switch (mesAtual) {
case 1:
System.out.println("Janeiro"); break;
case 2:
System.out.println("Fevereiro"); break;
case 3:
System.out.println("Março"); break;
case 4:
System.out.println("Abril"); break;
case 5:
16712855225

System.out.println("Maio"); break;
case 6:
System.out.println("Junho"); break;
case 7:
System.out.println("Julho"); break;
case 8:
System.out.println("Agosto"); break;
case 9:
System.out.println("Setembro"); break;
case 10:
System.out.println("Outubro"); break;
case 11:
System.out.println("Novembro"); break;
case 12:
System.out.println("Dezembro"); break;
default:
System.out.println("Mês inválido.");
}

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 29 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

Chegamos, então, à Estrutura de Repetição (ou Iteração)! Frequentemente,


desejamos que uma tarefa seja executada repetidamente por um programa
enquanto uma dada condição seja verdadeira. Isso é possível pela utilização do
comando while. Este comando avalia uma expressão condicional, que deve resultar
no valor true ou false.

Se o valor for true, então o comando subjacente é executado; se a expressão for false,
então o comando é saltado e a execução prossegue adiante. A diferença é que após
executar o comando subjacente, a expressão condicional é novamente avaliada e
seu resultado novamente considerado. Desse modo a execução do comando
subjacente se repetirá até que o valor da expressão condicional seja false.

Observe, porém, que a expressão é avaliada antes de uma possível execução do


comando subjacente, o que significa que esse comando pode jamais ser executado.
O comando while é portanto pré-testado, isto é, antes de executar qualquer
comando, testa-se a condição oferecida. Caso seja verdadeira, realiza os comandos
internos; caso seja falsa, sequer realiza qualquer comando. A sintaxe é:

while ([condição])
[comando subjacente]

Deve-se ter cuidado para não acabar implementando um laço infinito (desde que
essa não seja sua intenção). Um laço infinito é um laço em que a condição de saída
nunca é satisfeita, portanto ele roda eternamente. Uma variação do comando while
que funciona de maneira bastante análoga é o do-while. A diferença é que ele é pós-
testado, isto é, executa os comandos internos e só depois avalia a condição.

do
[comando] 16712855225

while ([condição]);

Em certas situações, precisamos de laços de repetições nos quais alguma variável é


usada para contar o número de iterações. Para essa finalidade, temos o laço for.
Este é o tipo de laço mais geral e mais complicado disponível na linguagem Java.
Esse laço é pré-testado ou pós-testado? Fácil, é pré-testado! Avalia-se a condição
antes de executar os comandos. Sua sintaxe é a seguinte:

for ([expressão 1]; [condição]; [expressão 2])


[comando]

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 30 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

A [expressão 1] é chamada expressão de inicialização, [condição] é uma expressão


condicional e [expressão 2] é uma expressão qualquer a ser executado no final de cada
iteração. O laço for avalia inicialmente a expressão de inicialização. Em seguida,
avalia a expressão condicional. Se o valor desta for true, então o comando é
executado.

A segunda expressão é avaliada em seguida, e finalmente o laço volta a avaliar


novamente a expressão condicional. Do contrário, se o valor da expressão for false,
a execução prossegue adiante do laço for. Observem que é completamente possível
transformar um for em um while. Podemos dizer que eles são equivalentes, mas
escritos de maneira diferente.

[expressão 1]
while ([condição]) {
[comando]
[expressão 2]
}

Agora vamos ver um exemplo do while:

int idade = 26;

while (idade > 30) {


System.out.println("Minha idade é " + idade);
idade = idade + 1;
}

Resultado:

...

Agora vamos ver um exemplo do do-while:

int idade = 26;


16712855225

do {
System.out.println("Minha idade é " + idade);
idade = idade + 1;
} while (idade > 30)

Resultado:

Minha idade é 26

Agora vamos ver um exemplo do for:

int idade;

for (idade = 26; idade < 30; idade++) {


System.out.println("Minha idade é " + idade);
}

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 31 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

Resultado:

Minha idade é 26
Minha idade é 27
Minha idade é 28
Minha idade é 29

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 32 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

JAVA: ORIENTAÇÃO A OBJETOS

JAVA: CLASSES

A classe é a planta ou esquema que indica como os objetos são criados, quais os
seus comportamentos e variáveis de estado. Para declarar uma classe, é necessário
utilizar a sintaxe a seguir:

[palavra-chave] class NomeDaClasse


{
//Atributos e Métodos
}

Portanto para declarar uma classe, deve-se colocar a palavra class seguida de um
identificador que irá servir de nome para a classe. O identificador pode ser qualquer
palavra, exceto palavras reservadas. Por exemplo: class Conta introduz a declaração
de uma nova classe chamada Conta. Note que, por convenção, o nome de uma classe
inicia sempre com uma letra maiúscula. A Palavra-Chave é opcional, podendo ser:

//Essa classe pode ser acessada por todos


public class Carro {...}

//Essa classe não pode gerar instâncias


abstract class Carro {...}

//Essa classe não pode ser estendida


final class Carro {...}

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 33 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

JAVA: OBJETOS

Um objeto é uma instância de uma classe. Para criar um objeto, devemos utilizar a
seguinte sintaxe:

new construtor();

O comando new, também conhecido como operador de criação, cria um novo


objeto, alocando memória para o objeto e inicializando essa memória para valores
default. Ele necessita de um operando: o construtor, que é o nome de um método
especial que constrói o objeto. Uma vez construído, o objeto deve ser atribuído a
uma variável, para que possa ser utilizado e referenciado no futuro.

/* 1) Operador NEW é responsável por criar um objeto;


* 2) NomeClasse() é o construtor da Classe NomeClasse;
* 3) NomeObjeto é uma variável do Tipo NomeClasse; */

NomeClasse NomeObjeto = new NomeClasse();

/* Observem que é possível atribuir o objeto de uma


* classe para uma variável de outra classe */

A linguagem Java assume a responsabilidade de destruir qualquer objeto criado que


não esteja sendo usando. Para tal, utiliza um Coletor de Lixo (Garbage Collector), que é
executado em intervalos regulares, examinando cada objeto para ver se ele ainda é
referenciado por alguma variável. Caso o objeto não seja utilizado ao menos por
uma variável, ele é destruído e sua memória é liberada.

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 34 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

JAVA: ATRIBUTOS

Um atributo ou campo é uma variável declarada no corpo de uma classe. Ele serve
para armazenar o estado de um objeto (atributo de instância) ou o estado de uma
classe (atributo de classe). A sintaxe de declaração de um atributo é a seguinte:

[palavra-chave] tipoAtributo NomeAtributo [=expressão];

A Palavra-Chave é opcional, podendo ser:

 Final, Volatile, Static ou Transient

class Empregado
{
final String Nome; //Indica que Nome é um atributo constante;
volatile Salario; //Indica que Salário é modificável por threads distintas;
static Idade; //Indica que Idade é compartilhada por todos objetos;
transient Sexo; //Indica que Sexo não pode ser serializável;
}

 Modificadores de Acesso:

class Empregado
{
public String nome; //Nome: público
private int Salario; //Salário: privado
protected short Idade; //Idade: protegido
char Sexo; //Sexo: default
}

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 35 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

JAVA: MÉTODOS

Java utiliza métodos para se referir a trechos de código que são associados a classes.
Se os atributos servem para manter ou armazenar o estado ou o valor de um objeto,
os métodos servem para descrever os comportamentos de um objeto ou classe. Um
método é muito similar a uma função em C. A maior diferença é que os métodos
da linguagem Java são declarados completamente dentro de uma classe.

[Palavras-Chave] TipoRetorno NomeMetodo ([Lista de Parâmetros])


{
//Corpo do Método
}

A sintaxe de declaração de um método é apresentada acima. A Palavra-Chave é


opcional, podendo ser:

 Abstract, Final, Static, Native e Synchronized

//Indica que esse método não possui corpo


abstract int soma (int a, int b) {//...//}

//Indica que esse método não pode ser sobrescrito


final int soma (int a, int b) {//...//}

//Indica que esse método só pode acessar atributos de classe e não pode ser sobrescrito
static int soma (int a, int b) {//...//}

//Indica que esse método foi escrito outra linguagem


native int soma (int a, int b) {//...//}

//Indica que esse método só é executável por uma thread por vez
synchronized soma (int a, int b) {//...//}

 Modificadores de Acesso:

public int soma (int a, int b) {//...//} 16712855225

private int soma (int a, int b) {//...//}


protected int soma (int a, int b) {//...//}
int soma (int a, int b) {//...//}

Vamos falar agora sobre um método importante: Construtor! Ele é um método


especial, chamado pelo operador new quando um novo objeto necessita ser criado.
Dentro do construtor, pode-se colocar código customizado de inicialização do
objeto. Em geral, ele deve ter o mesmo nome da classe em que for declarado. Além
disso, um construtor não deve ter um tipo de retorno em sua declaração.

Professor, não entendo uma coisa! Em geral, no código da classe não há nenhum
método com o nome do método construtor. Ora, não há declaração de método

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 36 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

algum! Como é isso? É verdade! Basicamente, quando você não declara um


construtor para uma classe, o compilador cria um construtor padrão com uma lista
vazia de parâmetros. Pode-se criar diversos construtores para uma mesma classe.

Outro método muito importante é o Método Main! Pois é, ele é sempre definido
como um método de classe, i.e., possui um modificador static:

public static void main (String[] args) throws java.lang.Exception

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 37 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

JAVA: HERANÇA

Herança é a habilidade de se derivar alguma coisa específica a partir de algo mais


genérico. Nós encontramos essa habilidade ou capacidade diversas vezes em nosso
cotidiano. Por exemplo: um Pálio estacionado na garagem do seu vizinho é uma
instância específica da categoria Carro, mais genérica. Da mesma forma, uma Honda
CG 125 é uma instância específica da categoria mais genérica Moto.

Se levarmos as categorias Carro e Moto para um outro nível mais elevado, as duas
se relacionarão uma com a outra por serem instâncias específicas de uma categoria
mais genérica ainda que elas: a categoria Veículo. Em outras palavras, carros e
motos são veículos. A imagem abaixo esquematiza as relações entre Pálio, Carro,
Honda CG 125, Moto e Veículo.

16712855225

Esse exemplo ilustrou a Herança Simples! Neste caso, uma entidade herda estados
e comportamentos (atributos e métodos) de uma e somente uma categoria. O Pálio,
por exemplo, herda da categoria Carro (e somente dela, diretamente). Em contraste,
a Herança Múltipla permite que uma entidade herde diretamente comportamentos
e estados de duas ou mais categorias ao mesmo tempo.

Imagine um Empregado chamado José de uma empresa qualquer. Para ser mais
específico, pense em José como sendo tanto Gerente quanto Contador

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 38 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

simultaneamente dessa empresa. Ele herdaria as capacidades de um Gerente e de


um Contador, concordam? Portanto, em uma hierarquia de entidades, João herdaria
de duas classes diferentes diretamente, como apresenta a imagem abaixo:

A sintaxe da herança sugere que você pode estender uma e somente uma classe.
O Java não suporta Herança Múltipla, porque – segundo projetistas da linguagem
– esse tipo de implementação poderia gerar confusão. Imagine, por exemplo, duas
classes-base declarando um atributo que possua o mesmo nome mas com tipos
diferentes. Qual dos dois a classe-filha deveria herdar?

A mesma situação poderia acontecer com um método! Se dois métodos possuíssem


16712855225

o mesmo nome, mas diferentes listas de parâmetros ou tipos de retorno, qual deles a
subclasse deveria herdar? Vocês percebem como isso poderia causar inconsistências
de projeto? Para prevenir tais problemas, a linguagem Java rejeita a implementação
de herança múltipla.

Novas classes derivam capacidades (expressas como atributos e métodos) de classes


já existentes. Isso faz com que o tempo de desenvolvimento de uma aplicação seja
bem menor, pois classes já existentes e comprovadamente funcionais (livres de erros
e já testadas) são reaproveitadas (ou reutilizadas). A sintaxe que expressa o conceito
de extensão de classes é a seguinte:

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 39 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03
class NomeClasseFilha extends NomeClassePai
{
//Atributos e Métodos
}

Essa sintaxe pode ser lida da seguinte forma: NomeClasseFilha estende NomeClassePai. Em
outras palavras, NomeClasseFilha herda (ou deriva) capacidades (expressas através de
atributos e métodos) de NomeClassePai. A NomeClasseFilha é conhecida como subclasse,
classe derivada ou classe-filha e NomeClassePai é conhecida como superclasse, classe-
base ou classe-pai.

A palavra-chave extends faz com que uma subclasse herde (receba) todos os atributos
e métodos declarados na classe-pai (desde que ela não seja final), incluindo todas
as classes-pai da classe-pai. A classe-filha pode acessar todos os atributos e
métodos não-privados. Ela herda, mas não acessa (ao menos diretamente) métodos
e atributos privados.

Todo objeto criado a partir de uma subclasse é também um objeto do tipo da sua
superclasse (Ex: um objeto do tipo Carro também é um objeto do tipo Veículo). Essa
afirmação implica o fato de que você pode atribuir um objeto de uma subclasse
para uma referência criada ou declarada para um objeto de sua superclasse. Como
assim, professor? Vejamos!

//Objeto do tipo Carro é um objeto do tipo Veículo


Veiculo v = new Carro();

A linha de código acima cria um objeto do tipo Carro e atribui sua referência à
variável v. Note que essa variável v é uma variável que armazena referências para
objetos do tipo Veículo. Esse tipo de atribuição é perfeitamente possível, já que um
Carro é uma subclasse de Veículo. Através da variável v, é possível chamar os
métodos que pertencem ao tipo Veículo. 16712855225

Portanto, pode-se utilizar esse artifício de nomeação para transformar uma classe-
filha em qualquer uma de suas classes-pai. Professor, é possível fazer o inverso?
Pode-se atribuir uma classe-pai a uma classe-filha? Não, isso só pode ser feito por
meio de um type cast. Assim, uma variável pode assumir momentaneamente outro
tipo para que o programador possa utilizá-la.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 40 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

JAVA: ENCAPSULAMENTO

Pessoal, nós já sabemos que para se descobrir o que um objeto pode fazer, basta
olhar para as assinaturas de seus métodos públicos definidos na classe desse objeto
– que formam uma interface de uso. A assinatura de um método é composta pelo
seu nome e seus parâmetros. Por outro lado, para descobrir como um objeto realiza
suas operações, deve-se observar o corpo de cada um dos métodos da classe.

Os corpos dos métodos constituem a implementação das operações dos objetos.


Professor, por que nós encapsulamentos classes, atributos e métodos Cara, por duas
razões: desenvolvimento e manutenibilidade. O encapsulamento ajuda a aumentar
a divisão de responsabilidades (ou coesão) e, dessa forma, fica mais fácil e rápido
desenvolver sistemas em módulos.

Da mesma forma, ele ajuda a manutenção, visto que para torna-se mais difícil fazer
“besteiras” no código e atrapalhar manutenções futuras. Trazendo isso para a vida
real, lidamos com encapsulamento o tempo inteiro. Você sabe como usar um
controle remoto, mas você não sabe como ele funciona internamente. Encapsula-
se seu funcionamento interno e disponibiliza-se apenas sua interface ao usuário.

Chegamos ao conceito de Modificadores de Acesso! Eles são utilizados para


modificar o modo como classes, métodos e variáveis são acessadas. Existem três
modificadores de acesso e um quarto nível (acesso default/friendly), quando não se usa
nenhum dos modificadores citados. Toda classe, método e variáveis de instância
declaradas possuem um controle de acesso.

Pessoal, esses Modificadores de Acesso determinam quão acessíveis são esses


elementos. Vamos vê-los agora em mais detalhes:
16712855225

 <public>: essa instrução indica que a classe, método ou atributo assim declaradas
podem ser acessadas em qualquer lugar e a qualquer momento da execução do
programa – é o modificador menos restritivo.

 <private>: essa instrução indica que métodos ou atributos (classes, não) assim
declaradas podem ser acessadas dentro da classe que os criou. Subclasses até
herdam-nos, mas não os acessam – é o modificador mais restritivo.

 <protected>: essa instrução indica que métodos ou atributos (classes, não) assim
declaradas somente podem ser acessadas dentro do pacote em que está contida
ou por subclasses no mesmo pacote.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 41 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

 <default> também chamado friendly, não há palavra para esse modificador porque
ele é, na verdade, a ausência de um modificador. Indica-se que a classe, método
ou atributo podem ser acessadas por classes do mesmo pacote.

Especificador Própria Classe Subclasse Pacote Global


Privado (-) Sim Não Não Não
<Vazio> (~) Sim Não* Sim Não
Protegido (#) Sim Sim Sim Não
Público (+) Sim Sim Sim Sim

OBSERVAÇÃO

É importante ressaltar que, em caso de não haver modificador, a subclasse pode ou não
acessar os métodos e atributos da sua superclasse, e isso depende da localização da
subclasse. Se ela estiver em um pacote diferente do pacote da superclasse, não poderá
acessar. Se estiver em um mesmo pacote da superclasse, poderá acessar. Logo, para
diferenciar o Modificador Pacote do Modificador Protegido, deve-se saber primeiramente se
é desejável que a subclasse possa ter acesso a atributos e métodos da classe.

Pensem comigo! Acessar ou editar propriedades de objetos, manipulando-as


diretamente, pode ser muito perigoso e gerar muitos problemas. Por conta disso, é
mais seguro, para a integridade dos objetos e, consequentemente, para a
integridade da aplicação, que esse acesso ou edição sejam realizados através de
métodos desse objeto.

Utilizando métodos, podemos controlar como consultas e modificações são


realizadas, controlando-as. Para tal, podemos utilizar Métodos Getters e Setters –
16712855225

para recuperar dados e inserir dados, respectivamente. Para o primeiro, utiliza-se o


Método Get; para o segundo, utiliza-se o Método Set. Em geral, costuma-se declarar
atributos como privados, e métodos e classes como públicos.

class Classe1 {

//Atributo privado
private String Algo;

//Método público para recuperar dados


public String getAlgo() {
return this.Algo;
}
//Método público para modificar/inserir dados
public void setAlgo(String Algo) {

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 42 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03
this.Algo = Algo;
}
}

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 43 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

JAVA: INTERFACE

Galera, o que é uma Interface? É simplesmente um contrato! Quando vocês assinam


o contrato do seguro de um carro, vocês estão se comprometendo a atender aquilo
que lá está escrito. Analogamente, a interface é um contrato que obriga aqueles
que a assinam a implementar os métodos lá presentes. Elas ajudam a padronizar
implementações – entradas e saídas.

Em outras palavras, é um recurso utilizado em Java para obrigar a um determinado


grupo de classes a ter métodos ou propriedades em comum para existir em um
determinado contexto, contudo os métodos podem ser implementados em cada
classe de uma maneira diferente. Em geral, as interfaces são compostas basicamente
de um conjunto de assinaturas de métodos públicos e abstratos.

public interface FiguraGeometrica


{
public String getNomeFigura();
public int getArea(int vertice);
public int getPerimetro();
}

A sintaxe para implementar uma Interface utiliza a palavra reservada implements:

public class ClasseImplementadoraDeInterfaces implements FiguraGeometrica

Professor, qual a diferença entre uma Interface e uma Classe Abstrata? Bem,
Interfaces não são classes; são, na verdade, entidades que não possuem qualquer
implementação, apenas assinatura, sendo que todos os seus métodos são públicos
e abstratos. Já as Classes Abstratas também contêm, em geral, métodos abstratos
(sem corpo), mas podem ter vários métodos concretos.
16712855225

Uma Classe Abstrata pode, inclusive, não conter nenhum método abstrato, i.e.,
todos os seus métodos são concretos. No entanto, se uma classe tiver um único
método abstrato que seja, ela será considerada uma Classe Abstrata. Aliás, uma
Interface é também chamada de classe abstrata pura por conta disso, ou seja, não
há impurezas (isto é, métodos concretos).

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 44 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

JAVA: POLIMORFISMO

A palavra Polimorfismo vem do grego: muitas formas. Trata-se da capacidade de


um objeto poder se comportar de diversas formas dependendo da mensagem
recebida Observem que isso não quer dizer que o objeto fica transformando seu
tipo a todo momento. Na verdade, um objeto nasce com um tipo e morre com esse
mesmo tipo. O que muda, então? É a forma como nós nos referimos a esse objeto!

Existem dois tipos de polimorfismo:

 Polimorfismo Estático: ocorre quando uma classe possui métodos com mesmo
nome, entretanto assinaturas diferentes, i.e., métodos de uma mesma classe se
sobrecarregando. Pode ser chamada também de Sobrecarga ou Overloading.
Ocorre em Tempo de Compilação e alguns não o consideram um tipo de
polimorfismo, porque a assinatura é diferente.

 Polimorfismo Dinâmico: ocorre quando uma classe possui um método com


mesmo nome e mesma assinatura que um método de sua suplerclasse, i.e., o
método da classe-filha sobrescreve o método da classe-pai. Pode ser chamada
também de Sobrescrita, Overriding, Redefinição ou Sobreposição. Ocorre em
Tempo de Execução e é um corolário do conceito de herança.

Professor, o que você quer dizer com mesma assinatura e assinatura diferente? É a
mesma quantidade, tipo e ordem dos parâmetros. Em outras palavras:

//Assinatura Igual: quantidade, tipo e ordem


public String EntendendoAssinatura(int A, char B);
public String EntendendoAssinatura(int C, char D);

//Assinatura Diferente: quantidade diferente


public String EntendendoAssinatura(long A, long B, long C);
16712855225

public String EntendendoAssinatura(long A, long B);

//Assinatura Diferente: tipo diferente


public String EntendendoAssinatura(long A, long B);
public String EntendendoAssinatura(char A, long B);

//Assinatura Diferente: ordem diferente


public String EntendendoAssinatura(int A, char B);
public String EntendendoAssinatura(char B, int A);

Agora vamos ver um exemplo de Polimorfismo Dinâmico. Eu pensei comigo mesmo:


O que seria uma característica comum de praticamente todos os animais? Emitir sons!
Observem que eu criei uma classe abstrata que possui um único método – também
abstrato –, que não retorna valor algum e não recebe nenhum argumento. Vejam
a classe abaixo:

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 45 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

abstract class Animal {


abstract void som();
}

Dito isso, vou criar dois animais do meu gosto pessoal: um gato e um cachorro!
Bem, o gato é um animal! Que relacionamento é esse “é um”? Herança! Portanto as
classes gato e cachorro serão classes filhas da superclasse Animal. Observem abaixo
que ambas implementam o método abstract void som( ), porém cada uma a sua
maneira, visto que gatos e cachorros emitem sons diferentes!

class Gato extends Animal {


void som() {
System.out.println("MIAU!");
}
}

class Cachorro extends Animal {


void som() {
System.out.println("AUAU!");
}
}

Pois bem! Vamos ver agora o Polimorfismo Dinâmico em ação. Criaremos um


objeto do tipo Gato e atribuiremos a um objeto do tipo Animal. Professor, você pode
fazer isso? Sim, porque Gato é filho de Animal – é similar a um casting implícito! Em
seguida chamaremos o método som( ). Por fim, faremos o mesmo procedimento
com o objeto do tipo Cachorro.

public static void main(String[] args) {


Animal animal = new Gato();
animal.som(); //Emite o som MIAU!
Animal animal = new Cachorro();
animal.som(); //Emite o som AUAU!
}

16712855225

Olha que bacana: existem dois métodos com exatamente o mesmo nome e mesma
assinatura! Como o compilador saberá qual deve ser chamado? Ele não saberá – tem
que ser em tempo de execução. No primeiro momento, ele apresentará “MIAU!”,
porque animal é nesse instante um gato. Depois fazemos outra atribuição e ele
apresentará “AUAU”, porque animal naquele instante é um cachorro.

O Polimorfismo Estático é bem mais simples! Imaginem que eu deseje fazer dois
cálculos matemáticos. Primeiro somar três números e depois somar apenas dois
números. Eu posso ter dois métodos com mesmo nome, mas assinaturas diferentes.
Dessa forma, se eu passar três valores, ele saberá que é um método; e se eu passar
dois valores, ele saberá que é outro método. Simples, não?

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 46 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

class Calculo {

void soma(int a,int b){


System.out.println(a+b);
}
void soma(int a,int b,int c){
System.out.println(a+b+c);
}

public static void main(String args[]) {


Calculo x = new Calculo();
x.soma(10,10,10); //Mesmo nome, mas assinatura diferente (3 valores)
x.soma(20,20); //Mesmo nome, mas assinatura diferente (2 valores)
}
}

OBSERVAÇÃO

Atributos com o mesmo nome na classe/subclasse substituem os herdados. Ademais,


métodos declarados com a palavra-reservada final não podem ser redefinidos. Já os
métodos abstratos devem ser redefinidos na subclasse ou declarados como abstratos para
que sejam implementados pela classe-neta. Por fim, membros definidos na superclasse
podem ser acessados na subclasse por meio da palavra-reservada super, a menos que
tenham sido declarados como privados.

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 47 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

JAVA: CONCEITOS AVANÇADOS

JAVA: INTERFACE GRÁFICA

A Plataforma Java oferece recursos para construção de interfaces gráficas de usuário


(GUI), entre eles: AWT (java.awt) e Swing (javax.swing)! O primeiro é um conjunto básico
de classes e interfaces que definem os componentes de uma janela desktop. Já o
Swing é um conjunto sofisticado de classes e interfaces que definem os
componentes visuais necessários para construir uma interface gráfica de usuário.

Vocês entenderam mais ou menos? O primeiro é um conjunto básico que serve de


base para o segundo, que é um conjunto mais sofisticado. Os componentes Swing
são implementados com nenhum código nativo – totalmente Java puro, i.e., apesar
de serem sensivelmente mais lentos que os componentes nativos em AWT (Abstract
Window Toolkit), eles oferecem uma maior liberdade aos programadores.

O AWT (javax.awt) veio primeiro, é mais pesado, é gerado pelo sistema operacional,
logo é dependente de plataforma. O Swing (javax.swing) é mais leve, é gerado por
uma Máquina Virtual Java (JVM), logo é independente de plataforma. Galera, nem
tudo é diferente! Vejam: ambos são fáceis de programar, porque a orientação a
objetos proporciona alterar partes do programa, sem alterar toda a estrutura.

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 48 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

O Swing mantém as funcionalidades dos componentes AWT! Ao acrescentarmos a


letra “J” aos componentes AWT, as novas classes serão como componentes Swing,
i.e., JButton, JTextField, JList tem os mesmos argumentos que Button, TextField e List –
componentes AWT. Nós vamos ver logo à frente a definição de alguns
componentes Swing. Professor, o que é um componente?

Bem, os itens que aparecem em uma interface gráfica de interação com usuário
(janelas, caixas de texto, botões, listas, caixas de seleção, entre outros) são chamados
de componentes. Alguns componentes podem ser colocados dentro de outros
componentes, por exemplo, uma caixa de texto dentro de uma janela. Abaixo
podemos ver a definição básica dos principais componentes:

 JFrame: define janelas com título, borda e alguns itens definidos pelo sistema
operacional como botão para minimizar ou maximizar;

 JPanel: define um componente que basicamente é utilizado para agrupar nas


janelas outros componentes como caixas de texto, botões, listas, entre outros;

 JTextField: define os campos de texto menores que podem ser preenchidos


pelo usuário;

 JTextArea: define os campos de texto maiores que podem ser preenchidos


pelo usuário;

 JPasswordField: define os campos de caixa de texto de formulários para


digitar senhas;

 JButton: permite que os usuários indiquem quais ações ele deseja que a
aplicação execute; 16712855225

 JCheckBox: permite criar formulários com checkbox’s (aquelas caixinhas para


você dar um check);

 JComboBox: permite criar formulários com combobox’s (aquela listinha de


opções).

Agora vamos falar um pouquinho sobre o Layout Manager (ou Gerenciador de


Disposição)! Galera, uma coisa é criar diversos componentes, outra coisa é
posicioná-los e dimensioná-los. O Layout Manager é o objeto que determina como

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 49 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

elementos e componentes serão dispostos em tela, tamanhos, comportamentos,


entre outros aspectos.

Ele controla os componentes que estão dentro do componente ao qual ele está
associado. Os principais Layout Managers são:

Divide a área de um componente de background em cinco regiões (norte,


sul, leste, oeste e centro). Somente um componente pode ser adicionado em
BorderLayout cada região. Eventualmente, o BorderLayout altera o tamanho preferencial
dos componentes para torná-los compatíveis com o tamanho das regiões.
O BorderLayout é o Layout Manager padrão de um JFrame.

Arranja os componentes da esquerda para direita e quando o tamanho


horizontal não é suficiente ele “pula” para a próxima “linha”. O FlowLayout
FlowLayout não altera o tamanho preferencial dos componentes. O FlowLayout é o
Layout Manager padrão de um JPanel (Swing).

16712855225

Arranja os componentes de cima para baixo “quebrando linha” a cada


componente adicionado. O BoxLayout não altera o tamanho preferencial dos
BoxLayout componentes.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 50 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

Divide a área de um componente de background em células


semelhantemente a uma tabela. As células possuem o mesmo tamanho.
GridLayout

É o mais complexo layout e é baseado no GridLayout. A ideia é representar


a tela como um grid com linhas e colunas, mas podemos posicionar
GridBagLayout elementos ocupando várias células em qualquer direção, o que permite
layouts mais customizados (apesar do alto custo de manutenção). A
definição de onde deve ser colocado cada componente é feita através de
restrições (GridBagConstraints) passadas ao método add.

16712855225

Professor, e o Look and Feel (L&F)? O “Look” se refere a aparência e o “Feel” se refere
ao comportamento dos componentes. É como se fosse um skin, um tema,
customizável ou não. O Java oferece algumas opções: CrossPlatformLookAndFeel (ou
Metal), que parece o mesmo em qualquer plataforma; SystemLookAndFeel, que usa o L&F
nativo do sistema utilizado; e Synth, que permite criar novos.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 51 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

Pessoal, a principal função de uma interface gráfica de usuário é permitir interação


entre usuários e aplicação. Os usuários interagem com uma aplicação clicando em
botões, preenchendo caixas de texto, movimentando o mouse, entre outros. Essas
ações dos usuários disparam eventos que são processados pela aplicação através
de Event Listeners.

Você pode descobrir quais tipos de eventos um componente pode disparar ao olhar
seus tipos de Event Listeners! Para criar um Listener, devemos implementar a
interface correspondente ao tipo de evento que queremos tratar. Por exemplo:

 KeyListener: utilizado quando se deseja tratar eventos de pressionar ou soltar teclas


do teclado.

 MouseListener: utilizado quando se deseja tratar eventos como cliques dos botões
do mouse (ex: duplo-clique, clique-arrasta, etc).

 WindowsEvent: utilizado quando se deseja tratar eventos que envolvem a


manipulação de janelas.

As tarefas de respostas realizadas em um evento são conhecidas como Handler de


evento e o processo total de responder a eventos é conhecido como tratamento de
evento. Para cada tipo de evento precisa ser implementada uma interface de escuta.
Quando um evento acontece, é realizado o despacho (dispatching) para os ouvintes
apropriados.

Esse despacho chama um método de tratamento de evento em cada um de seus


ouvintes, sendo registrados para o tipo de evento ocorrido. A ocorrência de um
evento faz com que o componente receba um ID único de evento – ele especifica
16712855225

o tipo de evento. Então, o componente pega esse ID para decidir qual tipo de
ouvinte será útil, decidindo qual o método que vai chamar para cada objeto listener.

O evento é despachado por todas as decisões que são tratadas para o usuário
através dos componentes GUI. Sendo necessário ser feito, pois precisa ser registrado
um handler de evento para o tipo particular de evento que o aplicativo exige. O
componente vai assegurar que o método apropriado do handler de evento é
chamado quando o evento ocorrer.

Pessoal, todo JComponent pode ter um ou mais bordas. As bordas são objetos
inacreditavelmente úteis que, não sendo componentes, sabem como desenhar as

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 52 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

margens dos componentes. Elas são úteis não só para desenhar linhas e margens
elegantes, mas também para fornecer títulos e espaços vazios em componentes.
Para colocar uma borda em um JComponent, deve-se usar o método setBorder.

Pode-se usar a classe BorderFactory para criar a maioria das bordas fornecidas. Se você
precisar de uma referência para determinada uma borda, você pode salvá-la em
uma variável do tipo Border, que conterá sua borda customizada. Abaixo podemos
ver uma borda linear e, em seguida, vários outros tipos de bordas diferentes!
Observem a diversidade disponível...

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 53 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

JAVA: TIPOS ENUMERADOS

Trata-se de um tipo de dados especial que habilita uma variável a ser um conjunto
pré-definido de constantes. A variável deve ser igual a um dos valores que foram
predefinidos para ela. Exemplos comuns incluem direções de uma bússola ou os
dias da semana. Por que? Porque são valores constantes! Ademais, lembrem-se que
eles sempre vêm em letra maiúscula. A sintaxe básica inclui a palavra-reservada enum:

public enum nomeENUM {


<lista de constantes>
}

Para especificar os dias da semana, as direções de uma bússola ou os planetas do


sistema solar em um tipo enum, podemos fazer:

public enum Dia {


SEGUNDA, TERÇA, QUARTA, QUINTA,
SEXTA, SÁBADO, DOMINGO; }

public enum Bussola {


NORTE, SUL, LESTE, OESTE; }

public enum Planetas {


MERCÚRIO, VENUS, TERRA,
MARTE, JUPTER, SATURNO,
URANO, NETUNO, PLUTÃO; }

Professor, qual é? O que tem demais em uma lista de constantes? Calma, amigão!
Nós podemos adicionar alguns valores a essas constantes, mas para isso devemos
primeiro declarar um construtor para, então, inicializar os atributos com os valores.
Por exemplo, a distância para o sol em milhões de quilômetros! O construtor tem
apenas um argumento porque a constante tem apenas um valor. Bacana?

public class Main {


16712855225

public enum Planetas {


MERCURIO(57), VENUS(108), TERRA(149),
MARTE(227), JUPITER(778), SATURNO(1429),
URANO(2870), NETUNO(4504), PLUTAO(5913);

public int distanciaSol;

Planetas(int distanciaSol) {
this.distanciaSol = distanciaSol; }
}

public static void main(String[] args) {


System.out.println("O Planeta mais afastado é: " + Planetas.PLUTAO); }
}

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 54 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

JAVA: ANOTAÇÕES

O Java 5 nos trouxe uma grande novidade que praticamente revolucionou o


desenvolvimento de software! As Anotações permitem declarar metadados dos
objetos nos próprios objetos e, não, em um arquivo separado. Dessa forma,
configurações de uma classe poderiam permanecer dentro da própria classe, em
vez de ficarem, por exemplo, em um Arquivo de Configuração XML.

Professor, por que arquivos de configuração são tão detestáveis? Cara, porque muitas
vezes eles tornam extremamente difíceis a compreensão de alguns sistemas. As
anotações são mais simples, discretas, compreensíveis e podem efetivamente ajudar
na automatização de algumas tarefas. Arquivos de Configuração são, algumas
vezes, complexos, grandes, chatos e difíceis de entender.

A Anotação, como o próprio nome diz, é uma forma de anotar, marcar, apontar
classes, campos ou métodos, de tal maneira que essas marcações possam ser
tratadas por um compilador, ferramentas de desenvolvimento e bibliotecas. Ela
provê dados sobre um programa, mas não faz parte dele em si, isto é, elas não
afetam diretamente a operação do código que elas anotam.

Elas podem fornecer informações sobre o código que está sendo escrito ou até
mesmo do próprio programa, semelhante a comentários. No entanto, elas podem
ser utilizadas como um objeto semântico de compiladores, isto é, facilita bastante a
vida dos compiladores. Dessa forma, eles podem entender que, por exemplo, não
é para mostrar mensagens de advertências (os famosos warnings).

Eles podem, inclusive, utilizar anotações para detectar erros de código; ou mesmo
para criar documentações por meio de XML. Algumas anotações podem ser
avaliadas em tempo de execução e podem possuir elementos ou não. Professor,
16712855225

qual é a sintaxe básica de uma anotação? As anotações são sempre precedidas de


arroba (@). É absurdamente simples:

@annotation

Por convenção, elas vêm antes do elemento que se deseja anotar (Ex: Antes do
método ou classe). Abaixo temos uma lista com as anotações mais utilizadas:

 @Deprecated: indica que um método tem seu uso desencorajado por ser perigoso
ou por ter uma alternativa melhor desenvolvida;

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 55 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

 @Override: indica que um método da classe-pai será sobrescrito por um método


da classe-filha;

 @SupressWarning(“unchecked”): indica que todos os avisos ou warnings da categoria


“não verificado” devem ser ignorados;

 Existem mais de sessenta atualmente: @SafeVarargs, @FunctionalInterface, @Retention,


@Documented, @Target, @Inherited, @Repeatable, @id.

Anotações podem ser de três tipos:

 Anotações Marcadoras: são aquelas que não possuem membros; são


identificadas apenas pelo nome, sem dados adicionais (Por exemplo: @id – não
há valores ou dados adicionais).

 Anotações de Valor Único: são aquelas que possuem um único membro, o


próprio valor; dessa forma, não é necessário informar o nome (Por exemplo:
@SupressWarning(“unchecked”) é equivalente a @SupressWarning(value = “unchecked”)).

 Anotações Completas: são aquelas que possuem múltiplos membros; assim,


deve-se usar a sintaxe completa para cada par nome/valor (Por exemplo:
@Version(major = 1, minor = 0, micro = 0)).

E que tal inventar sua própria anotação? Cara, é muito fácil e semelhante a interfaces!
Tão parecido que se utiliza a mesma palavra, mas precedida de um @. Vejamos:

<modificador> @interface identificador {


<Declaração de Elementos>
}
16712855225

Os modificadores e os elementos são opcionais! O identificador não pode ser o


mesmo de uma classe ou interface utilizadas na aplicação. No código abaixo,
criamos uma anotação que possui apenas um valor. Para chamá-la, basta utilizar o
comando @MinhaAnnotation. É possível, inclusive, adicionar sua anotação personalizada
no Javadoc. Bacana, né?!

public @interface MinhaAnnotation {


int valor() default 10;
}

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 56 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

JAVA: CLASSES INTERNAS (ANINHADAS)

Classes Aninhadas

Classes Estáticas Classes Internas

Classes Locais

Classes Anônimas

Java permite definir uma classe dentro de outra classe. Essa classe é conhecida como
Classe Aninhada e é ilustrada acima! Elas se dividem em duas categorias: estáticas
e não-estáticas. Classes Aninhadas que são declaradas com static são chamadas
Classes Aninhadas Estáticas. Já as Classes Aninhadas Não-Estáticas são chamadas
mais comumente de Classes Internas – como podemos ver abaixo:

class ClasseExterna {
...
static class ClasseAninhadaEstatica {
...
}
class ClasseInterna {
...
}
}
16712855225

Uma Classe Aninhada é um membro da Classe Externa. Classes Aninhadas Não-


Estáticas (ou Classes Internas) possuem acesso aos membros da Classe Externa,
mesmo que eles sejam declarados como private. Classes Aninhadas Estáticas não
possuem acesso aos membros da Classe Externa e podem ser declaradas como
private, public, protected ou default (sem modificador).

As Classes Externas só podem ser declaradas como public ou default. Aí vocês devem
estar se perguntando: por que usar classes aninhadas? Cara, é uma maneira de
agrupar logicamente classes que são utilizadas em apenas um lugar. Se você possui

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 57 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

uma Classe B que com certeza será usada apenas dentro da Classe A, o melhor é
criar a Classe B como interna a Classe A.

Além disso, ela aumenta o encapsulamento. Imaginem que A e B são classes


normais (não-aninhadas, também chamadas top-level) e a Classe B precisa acessar
os membros da Classe A. Podemos, então, colocar a Classe B dentro da Classe A e
colocar os membros de A como privados. Ainda assim, a Classe B poderia acessar
os membros da Classe A por ser uma classe aninhada.

Por fim, ela pode levar a códigos mais legíveis e fáceis de dar manutenção! Colocar
classes pequenas dentro de classes não-aninhadas, já que apenas essa a utilizará,
faz com que a lógica da classe não-aninhada seja mais fácil de ser identificada,
consequentemente tornando o código mais legível e de fácil manutenção. Essas são
apenas algumas das vantagens de se utilizar classes aninhadas.

Bem como métodos e variáveis de classe, uma classe aninhada estática é associada
à sua classe exterior. E assim como métodos de classes estáticas, uma classe
aninhada estática não pode se referir diretamente a variáveis ou métodos de
instância definidos na Classe Exterior. Elas são acessadas utilizando o nome da classe
externa: ClasseExterna.ClasseAninhadaEstatica.

Vamos falar um pouco sobre as Classes Internas! Da mesma forma que métodos e
variáveis de instância, uma classe interna é associada a uma instância de sua classe
externa e tem acesso direto a métodos e campos desse objeto. Além disso, como
uma classe interna é associada a uma instância, ela não pode definir nenhum
membro estático.

Objetos que são instâncias de uma classe interna existem dentro da instância de
uma classe externa. Entenderam isso? Uma instância da classe interna só pode existir
16712855225

dentro de uma instância da classe externa, e tem acesso direto aos métodos e
campos de sua instância externa. Para instanciar uma classe interna, deve-se
primeiro instanciar a classe externa, como segue:

ClasseExterna.ClasseInterna objetoInterno = objetoExterno.new ClasseInterna();

As classes internas se dividem em classes locais e anônimas! As primeiras são classes


definidas em um bloco (grupo de zero ou mais declarações entre chaves). Em geral,
classes locais são encontradas no corpo de um método. As segundas permitem
escrever códigos mais concisos, e declarar e instanciar uma classe ao mesmo tempo.
São comuns quando se deseja usar uma classe local apenas uma vez.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 58 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

JAVA: REFLEXÃO E GENÉRICOS

Reflexão (ou Reflection) é comumente utilizada por programas que requerem a


habilidade de examinar ou modificar o comportamento em tempo de execução de
aplicações que rodam em uma Java Virtual Machine (JVM). Em geral, é um recurso
bastante avançado e extremamente poderoso, e deve ser utilizado apenas por
programadores experientes.

Reflection pode permitir que aplicações executem operações que, por muito tempo,
se pensou impossível. Ele permite criar chamadas em tempo de execução, sem
precisar conhecer as classes e objetos envolvidos quando escrevemos nosso código.
Esse dinamismo é necessário para resolvermos tarefas que nosso programa só
descobre serem necessárias ao receber dados, em tempo de execução.

Essa tecnologia possibilita listar todos os atributos de uma classe e pegar seus
valores em um objeto; instanciar classes cujo nome só vamos conhecer em tempo
de execução; invocar métodos dinamicamente baseado no nome do método como
String; descobrir se determinados pedaços do código têm annotations. É um recurso
muito poderoso!

Já o Generics permite que você personalize um método ou uma classe genérica


para qualquer tipo que você esteja trabalhando. Para ter certeza da tipagem dos
objetos em tempo de compilação, devemos aplicar o recurso do Generics. Com este
recurso podemos determinar o tipo de objeto que queremos armazenar em uma
coleção no momento em que ela é criada.

A partir daí, o compilador não permitirá que elementos não compatíveis com o tip
escolhido sejam adicionados na coleção. Isso garante o tipo do elemento no
momento em que ele é recuperado da coleção e elimina a necessidade de casting.
16712855225

Imaginem que bacana seria poder escrever um único método de ordenação de


elementos de um vetor.

Mas não só isso, esse método seria capaz de ordenar tanto um vetor de inteiros
como um vetor de String, ou qualquer outro tipo. Nossa tecnologia permite que
programadores especifiquem, com uma simples declaração de método, um
conjunto de métodos relacionados; ou, com uma simples declaração de classes, um
conjunto relacionado de tipos respectivamente.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 59 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

JAVA: TRATAMENTO DE EXCEÇÕES

Em programação, há sempre a possibilidade de ocorrer erros imprevistos durante a


execução de um sofware, esses erros são exceções e podem ser provenientes de
erros de lógica, acesso a dispositivos ou arquivos inexistentes, edição de algo sem
permissão, etc. Na Linguagem C, códigos de erro são utilizados para indicar o tipo
de erro que ocorreu! Como assim, professor? Vejamos o exemplo abaixo:

int testeErro(int idade) {


if(idade >= 0)
idade = idade + 18;
else
return 100; //Código de Erro para valor negativo
}

Observem que se a idade informada for maior ou igual a zero, realiza-se uma
determinada operação; se for menor que zero (negativa), retorna-se o Código de
Erro 100 – para que o programador saiba o que ocorreu. Qual o problema dessa
abordagem? Primeiro, exige uma vasta documentação indicando o que significa
cada código de erro (Ex: 100 = Valores negativos; 200 = Sem permissão de escrita).

Além disso, observe que a palavra-reservada return fica ocupada, impossibilitando a


devolução de outros possíveis resultados. Entenderam essa parte? Eu poderia usar
essa palavra para retornar valores importantes para o código, mas não posso
porque ele está ocupado em informar se houve ou não erro. Pois é, o Java possui
uma estratégia diferente para contornar esses imprevistos.

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 60 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

Ele busca realizar o tratamento dos locais do código que podem vir a lançar
possíveis exceções. Java possui a classe Throwable, que modela todos os tipos de erros
de execução e que se divide em duas subclasses Error e Exception. A primeira define
erros que não devem ser capturados pelas aplicações, pois representam erros
graves que não permitem que a execução continue de maneira satisfatória3.

A segunda define erros para os quais as aplicações normalmente têm condições de


realizar um tratamento, logo Exception Error são subtipos de Throwable. As exceções
16712855225

ainda se dividem em verificadas (Checked), quando obrigatoriamente devem ser


tratadas e não-verificadas (Unchecked), quando não há essa obrigação – programador
decide! E como se detectam, manipulam e tratam as exceções?

Bem, sempre que um método de alguma classe for passível de causar algum erro
previsto, nós podemos utilizar um método de tentativa chamado try. Tudo que
estiver dentro do bloco try será executado até que alguma exceção seja lançada, ou
seja, até que algo dê errado. Quando uma exceção é lançada, ela sempre deve ser
capturada. O trabalho de captura da exceção é executado pelo bloco catch.

3
Exemplo: estouro de memória.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 61 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

Podemos encadear vários blocos catch, dependendo do número de exceções que


podem ser lançadas por uma classe ou método. O bloco catch obtém o erro criando
uma instância da exceção. Quando uma exceção é lançada e é necessário que
determinada ação seja tomada mesmo após a sua captura, utilizamos a palavra
reservada finally – é opcional, mas se existir, sempre será executado.

É útil para liberar recursos do sistema quando utilizamos, por exemplo, conexões de
banco de dados e abertura de buffer para leitura ou escrita de arquivos. finally virá
após os blocos de catch. Portanto, o try indica que um bloco de código pode ocorrer
erro; o catch tem o objetivo de capturar, manipula e trata erros; e o finally busca
realizar ações mesmo após a captura de erros. Vejamos a estrutura básica:

try { //Não vem sozinho: try/catch, try/finally ou try/catch/finally

//Código a ser executado


} catch (ClasseDeExceção objDaExceção) { //Não vem sozinho: try/catch ou try/catch/finally

//Tratamento da exceção
} finally { //Não vem sozinho: try/finally ou try/catch/finally.

//Código a ser executado mesmo que uma exceção seja lançada


}

Algumas observações importantes: o catch deve aparecer após o try e entre os


blocos não deve haver nenhuma outra instrução. Além disso, quando uma exceção
é identificada no try, o restante do código não é executado e não há um retorno
para o término do código. Implicitamente, todas as classes Java automaticamente
lançam uma exceção de RuntimeException.

Por fim, vamos falar da propagação de exceções! Imagine uma situação em que
não é desejado que uma exceção seja tratada na própria classe ou método, mas
sim em outra classe ou método que venha lhe chamar. Para solucionar tal situação
utilizamos o a cláusula throws na assinatura do método indicando explicitamente a
16712855225

possível exceção que o mesmo poderá a vir lançar. Sintaxe abaixo:

tipoDeRetorno nomeDoMetodo(...) throws tipoExcecao1, tipoExcecao2, tipoExcecaoN

Em outras palavras, utilizamos throws para indicar que qualquer um que chame
aquele método deve tratar suas possíveis exceções. No entanto, algumas vezes
podemos fazer com que um método lance um throwable (em geral, do tipo exceção)
sem exigir que aqueles que chamem esse método tratem essa exceção – para tal,
utilizamos throw. Sintaxe abaixo:

throw new Exception("Número não pode ser negativo!");

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 62 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

Observem que a palavra-reservada throw é utilizada dentro do corpo do método


para invocar uma exceção qualquer personalizada explicitamente, além de não
poder lançar mais de uma exceção; já a cláusula throws é utilizada na declaração ou
assinatura de um método e declaração uma exceção a ser tratada, além de poder
lançar mais de uma exceção.

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 63 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

JAVA: SINCRONISMO E MULTITHREADING

Vocês já devem ter percebido que os programas que utilizamos corriqueiramente


conseguem executar diversas atividades relativamente independentes entre si. Você
está lá navegando em dezessete abas diferentes pelo Firefox e ao mesmo tempo
está baixando algum arquivo, ouvindo alguma música, lendo a minha aula e
enviando um e-mail – tudo paralelamente.

E aqueles sistemas que você utiliza no seu trabalho em que várias pessoas acessam
para fazer coisas diferentes? Pois é, já que essas atividades são relativamente
independentes entre si, elas podem ser executadas em paralelo. Vocês concordam
comigo? Na verdade, a maioria dos softwares realizam diversas tarefas
paralelamente sem nós percebermos!

Quando nós executamos essas tarefas em paralelo, estamos usando Threads! Vocês
sabem o que essa palavra significa em português? Fios ou Linhas! Em outras palavras,
criamos linhas de execução de tarefas paralelas em memória – cada linha
responsável por executar alguma coisa simultaneamente e relativamente
independentes. Em Java, as Threads são objetos presentes no Pacote java.lang.

Além da vantagem evidente de poder realizar tarefas simultaneamente, podemos


dizer que assim utilizamos os recursos disponíveis de melhor forma, especialmente
quando o computador em questão possui múltiplos processadores. Para entender
isso melhor, podemos observar o ciclo de vida de threads e cada estágio pelo qual
ela passa – do início ao fim!

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 64 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

 New: uma nova thread começa seu ciclo de vida no estado new e permanece nele
até o programa inicializar a thread – é como se ela tivesse nascido.

 Runnable: após uma nova thread ter sido inicializada, a thread se torna runnable – é
nesse estado que ela executa uma tarefa.

 Waiting: algumas vezes, uma thread espera outra thread realizar alguma tarefa até
que esse thread sinalize que ela pode continuar sua execução.

 Timed Waiting: é o mesmo caso que o anterior, no entanto aqui o intervalo de tempo
de espera é especificado.

 Terminated: uma thread runnable entra nesse estado quando completa sua tarefa ou
quando termina.

Dissemos várias vezes que, em geral, threads são relativamente independentes. Nós
dissemos dessa maneira, porque quando elas utilizam recursos em comum, é
preciso haver um sincronismo. Quando muitas threads são executadas, é necessário
sincronizar suas atividades para prevenir, por exemplo, o acesso concorrente a
estruturas de dados no programa que são compartilhadas entre as threads.

É imprescindível entender que um aplicativo possui uma área de disputa de


memória compartilhada entre todas as threads, chamada Região Critica. Para que
uma aplicação se torne confiável, ela terá que garantir que somente uma thread
utilizará a Região Crítica por vez e o programador deve perceber quando mais de
uma thread modifica uma determinada área de memória em comum.

Não é necessária a sincronização quando os valores da memória compartilhada não


são modificados, ou seja, caso as threads só comparem ou tomem qualquer outro
16712855225

tipo de decisão que não venha a modificar os dados da memória compartilhada


entre as threads. Para quem estudou um pouco de sincronismo de banco de dados,
é mais fácil entender o sincronismo em java.

Para entender a utilização de threads programaticamente, podemos utilizar um


exemplo! Sabe quando você quer gerar um arquivo em PDF e, enquanto ele está
sendo gerado, aparece uma barrinha de que vai enchendo à medida que o arquivo
vai se concluindo? Pois é, esses processos paralelos e simultâneos podem ser
executados por meio de threads! Vamos pensar...

public class GeraPDF implements Runnable {


public void run () {

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 65 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03
// Código para gerar PDF.
}
}

public class BarraDeProgresso implements Runnable {


public void run () {
// Código da barra de progresso.
}
}

public class MeuPrograma {


public static void main (String[] args) {

GeraPDF gerapdf = new GeraPDF();


Thread threadDoPdf = new Thread(gerapdf);
threadDoPdf.start();

BarraDeProgresso barraDeProgresso = new BarraDeProgresso();


Thread threadDaBarra = new Thread(barraDeProgresso);
threadDaBarra.start();

}
}

O código acima começa com duas classes – GeraPDF, que evidentemente gera o PDF;
e BarraDeProgresso, que obviamente cria a barra de progresso! Observem que ambas
implementam a interface Runnable – isso é necessário para que as instâncias dessa
classe sejam executadas por uma thread. Aliás, essa interface possui um único
método (run()), que cria a thread e a executa.

No método main, criamos os objetos de cada classe e passamos para a classe thread.
Como assim, professor? Observem que primeiro geramos um objeto (gerapdf), em
seguida criamos uma thread com esse objeto (new Thread(gerapdf)) e depois chamamos
o método start(), responsável por chamar o método run() da classe específica – sem
isso, não seria possível saber qual método run() deveria ser chamado.

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 66 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

JAVA: COLEÇÕES

Coleção é qualquer agregado de referências a objetos (elementos) em alguma


estrutura de dados. As coleções são sempre de um mesmo tipo de elementos. Por
exemplo, podemos ter uma coleção de Datas, uma coleção de Pessoas, ou uma
coleção de Alunos. Em Java, os elementos de uma coleção devem ser sempre
referências a objetos, não podendo ser tipos primitivos, como int e char.

Mas essa limitação na prática não existe, porque a cada tipo primitivo corresponde
uma classe, como as classes Integer e Character. Por exemplo, para cada valor de
int pode ser construído um objeto da classe Integer, que tem esse valor na sua única
variável de instância. Podemos então ter coleções de Integer, de Double, de
Character. Bacana?

Quando falamos em tipo dos elementos de uma coleção, estamos falando,


portanto, do tipo das referências que podem ser armazenadas na coleção. Para
facilitar, na prática usamos comumente expressões como "coleção de objetos" como
uma forma abreviada de dizer "coleção de referências a objetos". Da mesma forma,
dizemos, "coleção de Alunos" para "coleção de referências do tipo Aluno".

É um erro conceitual comum pensar que uma coleção de objetos armazena esses
objetos dentro dela. O conceito de coleção é bem genérico, e significa qualquer
agrupamento de objetos. Existem conceitos mais específicos para representar
coleções com propriedades estruturais particulares. O mais simples é o conceito de
uma lista. Outras formas conceituais são as ideias de conjunto, árvore, grafo, etc.

Vamos começar falando das Listas (java.util.List)! Ela se caracteriza por ser sequencial,
com cada elemento ocupando uma posição relativa, indexada de 0 até N-1, onde N é
a quantidade de elementos. Em uma lista, faz sentido falar em primeiro, segundo,
16712855225

terceiro elemento. Não há restrição em se colocar uma mesma referência em mai


de uma posição da lista (i.e., a lista pode ter elementos duplicados).

Galera, não sei se algum de vocês já programou em C! Se sim, vocês se lembram de


como era complicado utilizar ponteiros, ponteiros para ponteiros, alocação dinâmica
de memória? Pois é, Java não exige que você faça nada disso! As coisas aqui são
muito mais simples e já existe bastante funcionalidade implementada e pronta para
ser utilizada. As principais classes implementadoras são: ArrayList, LinkedList, Vector.

ArrayList arrayList = new ArrayList();


LinkedList linkedList = new LinkedList();
Vector vector = new Vector();

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 67 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

//Observem que eu posso referenciar os objetos criados como List (Lista).

List list = new ArrayList();


List list = new LinkedList();
List list = new Vector();

MÉTODO DESCRIÇÃO

add(Object) Adiciona uma referência no final da lista e aceita referências de qualquer


tipo;
add(int, Object) Adiciona uma referência em uma determinada posição da lista;

size() Informa a quantidade de elementos armazenado na lista;

clear() Remove todos os elementos da lista;

contains(Object): Verifica se um elemento está contido em uma lista;

remove(Object): Retira a primeira ocorrência de um elemento de uma lista;

remove(int): Retira elementos pela sua posição na lista;

get(int): Recupera um elemento de uma determinada posição da lista;

indexOf(Object): Descobre o índice da primeira ocorrência de um elemento;

Agora vamos falar um pouco sobre Conjuntos (java.util.Set). Trata-se de outra


16712855225

categoria de coleção, em que não há noção de posição relativa (primeiro, segundo,


etc) e que não podem existir elementos duplicados. Um exemplo simples é o
conjunto de países que estão na Comunidade Europeia. Não há interesse em se
repetir países, e não há ordem relativa (um país não está antes ou depois de outro).

Como os conjuntos não possuem ordem, as operações baseadas em índice que


existem nas listas não aparecem nos conjuntos. Set é a interface Java que define os
métodos que um conjunto deve implementar. As principais classes
implementadoras são: HashSet, TreeSet e LinkedHashSet. Cada implementação possui suas
características sendo apropriadas para contextos diferentes.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 68 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

Galera, sendo bem sincero, não vejo grandes vantagens no uso de sets. Tudo bem,
algumas vezes, eles possuem performance melhor que a das listas, mas não é nada
demais. O que eu acho importante é saber essas características básicas e diferentes
para outros tipos de coleções. Vamos ver agora um exemplo e algumas das suas
principais operações e suas descrições.

HashSet hashSet = new HashSet();


TreeSet treeSet = new TreeSet();
LinkedHashSet linkedHashSet = new LinkedHashSet();

//Observem que eu posso referenciar os objetos criados como Set (Conjunto).

Set set = new HashSet();


Set set = new TreeSet();
Set set = new LinkedHashSet();

MÉTODO DESCRIÇÃO

size() Retorna a quantidade de elementos armazenados no conjunto;

isEmpty Verifica se o conjunto está vazio;

add() Adiciona um elemento específico ao conjunto;

remove() Remove um elemento específico do conjunto;

Agora vamos ver Filas (java.util.Queue). Trata-se de outra categoria de coleção,


semelhante a filas, em que o primeiro elemento a entrar será o primeiro elemento
a sair (FIFO). Basta lembrar da fila de um supermercado. A primeira pessoa que
entrou na fila será a primeira pessoa a sair da fila. Aliás, ela possui operações de
16712855225

inserção, remoção e inspeção.

Galera, percebam que uma fila é uma lista, porém com um objetivo diferente! A fila
é desenhada para ter elementos inseridos no final da fila e removidos no início da
fila. As principais classes implementadoras da interface Set são: PriorityQueue e LikedList.
Cada implementação possui suas características sendo apropriadas para contextos
diferentes.

LinkedList linkedList = new LinkedList();


PriorityQueue priorityQueued = new PriorityQueue();

//Observem que eu posso referenciar os objetos criados como Queue (Fila).

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 69 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03
Queue queue = new LinkedList();
Queue queue = new PriorityQueue();

MÉTODO DESCRIÇÃO

add() Insere um elemento na fila;


remove() Remove um elemento da fila;
element() Retorna o primeiro elemento da fila;

Por fim, vamos falar sobre os Mapas (java.util.Map). Aqui já começamos diferente,
porque mapas não são coleções. Pensem comigo: muitas vezes queremos buscar
rapidamente um objeto, dada alguma informação sobre ele (Ex: dada a placa do
carro, obter todos os dados). Poderíamos utilizar uma lista e percorrer todos os
elementos, mas isso é péssimo para a performance – aqui entra o mapa!

Um mapa é composto por um conjunto de associações entre um objeto chave a


um objeto valor. É equivalente ao conceito de dicionário, utilizado em várias
linguagens. Algumas linguagens, como Perl ou PHP, possuem um suporte mais
direto a mapas, onde são conhecidos como matrizes ou arrays associativos. O
objetivo é mapear uma chave a um valor.

Em um dicionário eu associo um vocábulo a uma definição. A chave é um objeto


utilizado para recuperar um valor. O mapa costuma aparecer junto com outras
coleções, para poder realizar essas buscas. As principais classes implementadoras
da interface Map são: HashMap, TreeMap e LinkedHashMap. Cada implementação possui
suas características sendo apropriadas para contextos diferentes.

16712855225

MÉTODO DESCRIÇÃO

clear() Remove todos os pares chave/valor do mapa;


containsKey(k) Retorna true se o mapa invocador contiver o objeto k como chave;
containsValue(v) Retorna true se o mapa contiver o objeto v como chave;
entrySet() Retorna um conjunto que contenha as entradas no mapa;
equals() Retorna true se mapas contiverem as mesmas entradas;
get() Retorna o valor associado com a chave k;
remove(k) Remove a entrada que tiver chave igual a k;

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 70 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

JAVA: STREAMS E SERIALIZAÇÃO

O que é Stream? Vamos ver um exemplo bacana: sabem quando vocês veem um
jogo de futebol ao vivo pela internet? Ou quando vocês assistem ao julgamento de
um réu pelo website do Supremo Tribunal Federal? Pois é, isso é streaming! Em outras
palavras, trata-se de um fluxo de dados contínuo (nesse caso, vídeo) transmitido de
uma fonte de dados para um destino específico.

Em Java, quando dizemos que um objeto é serializado, estamos querendo dizer que
ele será transformado em bytes, e poderá ser armazenado em disco ou transmitido
por um stream. Um stream é um objeto de transmissão de dados, em que um fluxo
de dados serial é feito através de uma origem e de um destino. Os tipos mais
comuns de stream são o FileOutputStream e o FileInputStream.

Ambos os streams são utilizados para manipular objetos serializados. O primeiro é


um fluxo de arquivo que permite a gravação em disco; o segundo é um fluxo de
arquivo que permite a leitura em disco – ou seja, o inverso! Galera, em suma, a
serialização serve para salvar, gravar e capturar o estado de um objeto. Assim, posso
criar um objeto, gravá-lo em um arquivo e futuramente utilizá-lo.

A serialização permite que eu transforme uma instância de um objeto em uma


sequência bytes. É bacana porque, nesse formato, eu posso enviá-lo pela rede,
salvar no disco ou comunicar uma JVM com outra. Eu congelo o estado atual de
um objeto e, lá no destino, descongela-se esse estado sem perda de dados. O
exemplo que eu costumo usar é jogo de videogame!

Sabe quando você já está lá quase zerando o jogo? E se você desligar o videogame e
perder tudo? Pois é, é útil salvar o estado atual! Como faço isso? Você deve
implementar a interface Serializable do pacote java.io.Serializable. O que tem nessa
16712855225

interface, professor? Nada, mas ela indica para a JVM que você deseja que
determinada classe esteja habilitada para ser serializada. Não encontrei questões!

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 71 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

JAVA: CLASSES E OPERAÇÕES DE I/O

Professor, o que é I/O? É uma sigla para Input/Output! Em português, seria E/S – ou
Entrada/Saída! Isso indica a comunicação entre sistemas de processamento de
dados (Ex: Computador) e o mundo externo (Ex: Humano). Entradas são dados
recebidos pelo sistema e Saídas são dados enviados pelo sistema. A melhor maneira
de entender isso é por meio de um exemplo!

Uma operação de entrada de dados seria aquele dado lido de uma base de dados
(Ex: read() – lê dados da entrada padrão do sistema). Já uma operação de saída de
dados seria aquele dado escrito em uma base de dados (Ex: write() – escreve dados
na saída padrão do sistema). Agora que vocês já sabem o que são operações de
Entrada/Saída, podemos prosseguir!

O Java é capaz de processar arquivos que requisitam grandes quantidades de dados


persistentes. O que é isso, professor? São aqueles dados armazenados dentro de
arquivos – fala-se persistente porque ele dura além da finalização de um programa.
Esse processamento de arquivos é uma capacidade que a linguagem oferece para
ler e gravar dados! Bacana?

Pessoal, se vocês quiserem trabalhar com entrada e saída de dados em nossa


linguagem, recomenda-se utilizar classes que estão dentro do pacote java.io. Por
que? Porque lá vocês encontrarão classes que oferecem funcionalidades como
manipulação de entrada/saída de bytes, manipulação de entrada/saída de
caracteres, buffers de leitura e escrita, conversão de formatos, entre outros.

As classes abstratas InputStream OutputStream definem, respectivamente, o


comportamento padrão dos fluxos de entrada (para ler bytes) e dos fluxos de saída
(para escrever bytes). Em outras palavras, essas duas classes abstratas permitem
16712855225

manipular a entrada e a saída de dados como uma sequência de bytes, sejam um


arquivo, um BLOB de uma base de dados, uma conexão remota via sockets, etc.

Vamos falar um pouco sobre a Classe InputStream! Ela oferece a funcionalidade básica
de leitura de um byte ou de uma sequência de bytes a partir de alguma fonte.
Podemos utilizar o método read() – o valor de retorno desse método é um inteiro,
que pode ser o byte lido do próprio método ou número de bytes lidos – quando o
retorno for igual a -1, é informado que o final do arquivo foi atingindo.

InputStream is = new FileInputStream("arquivo.txt");


int valor = is.read();

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 72 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

Observem no exemplo acima que a classe abstrata InputStream foi declarada


inicializando uma classe dependente FileInputStream. Essa classe recebe uma String
como argumento do seu método construtor – ele representa a definição de onde
está localizado o arquivo. Entendido? Podemos ver abaixo a hierarquia das classes
que dependentes da Classe InputStream:

Abaixo podemos ver uma pequena descrição das principais classes:

Classe Descrição
ByteArrayInputStream Valores são originários de um arranjo de bytes.

FileInputStream Bytes com originalidade de um arquivo.

FilterInputStream Filtra os dados de um InputStream.

BufferedInputStream Faz a leitura de grandes volumes de bytes que armazena em um


16712855225

buffer interno.
DataInputStream Permite a leitura de representações binárias dos tipos primitivos
de Java.
ObjectInputStream Oferece o método readObject para a leitura de objetos que foram
serializados para um ObjectOutputStream.
PipedInputStream Faz a leitura de um pipe de bytes cuja origem está associada a um
objeto PipedOutputStream.

Já a Classe OutputStream é responsável por transferir os bytes para algum destino.


método write() tem a função de escrever em forma de bytes para o destino em que
enviará os dados. Que destino é esse? Bem, isso não importa! Quando o sistema

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 73 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

precisar escrever em uma saída, basta ele chamar o método que utiliza a classe
abstrata, visto que ele aceita qualquer dependente de OutputStream.
Observem um exemplo abaixo:

File arquivo = new File("Teste.txt");


FileWriter fw = new FileWriter(arquivo);
fw.write("25");
fw.flush();

Abaixo podemos ver uma pequena descrição das principais classes:

Classe Descrição
FileOutputStream Escreve em um arquivo ou em um descritor de arquivo.

FilterOutputStream Filtra saídas, transformando dados ou provendo funcionalidades


adicionais.
PipedOutputStream Cria comunicações pipe ao se conectar com entradas pipe.

ByteArrayOutputStream Implementa uma saída na qual dados são escritos em um array


de bytes.
ObjectOutputStream Escreve tipos de dados primitivos.
16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 74 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

NOVIDADES: JAVA 8

Pessoal, vocês já devem saber que nós temos uma nova versão! A cobrança ainda
é raríssima (só encontrei uma questão), mas é bom saber um pouco sobre as
principais novidades. A grande novidade foram as Lambda Expressions! Pois é, Java
agora tem algumas características de programação funcional. Professor, o que é
exatamente programação funcional?

É um paradigma de programação que trata a computação como uma avaliação de


funções matemáticas e que evita estados ou dados mutáveis. Ela enfatiza a aplicação
de funções, em contraste com a programação imperativa, que enfatiza mudanças
no estado do programa. As Lambda Expressions permitem passar comportamentos,
ou funções como argumentos em uma chamada de método.

Para entendê-las, é necessário conhecer os conceitos de funções de primeira classe


e literais. Tradicionalmente no Java, um método (função, procedimento) somente
existe como membro de uma classe. Isso significa que, embora você possa ter uma
variável "apontando" para um objeto, você não pode guardar um método numa
variável. Bacana, pessoal?

Tudo aquilo que é permitido referenciar numa linguagem (no caso, objetos ou tipos
primitivos), passar como parâmetro para outras funções, etc, é dito ser "de primeira
classe". Outras linguagens, entretanto, permitem que funções e outras coisas mais
(como classes) sejam referenciados e passados como argumento. No JavaScript, por
exemplo, é bastante comum passar uma função para uma variável.

O suporte a funções de primeira classe simplifica em muito a construção de certas


funções. Aliás, elas vão um passo além, não só permitindo passar funções como
parâmetro para outras funções, mas também permitindo que as mesmas sejam
16712855225

expressas como literais. Professor, o que é um literal? Um literal é uma notação que
representa um valor fixo no código fonte.

Em outras palavras, através do uso da própria sintaxe você consegue criar um objeto
que de outra forma exigiria a combinação de duas ou mais funcionalidades
diferentes. No Java 8, o literal para uma expressão lambda consiste em uma lista de
argumentos (zero ou mais) seguida do operador -> seguida de uma expressão que
deve produzir um valor. Exemplos:

() -> 42 // Não recebe nada e sempre retorna "42"


x -> x*x // Recebe algo e retorna seu quadrado
(x,y) -> x + y // Recebe dois valores e retorna sua soma

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 75 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

Em suma, as expressões lambda busca concisão no código, i.e., fazer mais


escrevendo menos. Com frequência, não há razão para se exigir que uma função
esteja sempre acompanhada de uma classe, e o uso dessas expressões evita muitas
construções desnecessárias. Evita-se criar classes anônimas com apenas um método
para solucionar algum problema. Quem se interessar mais:

http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html#use-case

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 76 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

(CESPE - 2013 - SERPRO - Analista - Desenvolvimento de Sistemas Garbage


Collector é a tecnologia que gerencia a memória alocada para o programa, a
fim de liberar objetos que não estão sendo utilizados.

Comentários:

O acesso a arrays e strings, e a conversão de tipos são checados em tempo de


execução para assegurar a sua validade. O Garbage Collector faz a desalocação
automática de memória evitando, erros de referência e desperdício de memória.
Finalmente, o recurso de Exception Handling permite o tratamento de erros em tempo de
execução, por um mecanismo robusto, análogo ao do C++.

Conforme vimos em aula, essa é a função precípua do Garbage Collector!

Gabarito: C

(CESPE - 2012 - TRE-RJ - Técnico Judiciário - Programação de Sistemas A


linguagem de programação Java é muito utilizada por ter como característica
gerar um código independente de plataforma que pode ser executado em
qualquer arquitetura e sistema operacional que tenha o sistema Java.

Comentários:

Vocês sabiam que Java é uma Linguagem WORA? Pois é, esse acrônimo significa
Write Once, Run Anywhere ou Escreva uma vez, execute em qualquer lugar. Trata-
se de um slogan para exemplificar os benefícios multiplataforma da linguagem Java!
Idealmente, isso significa que um programa em Java (uma vez compilado em um
bytecode) pode rodar em qualquer equipamento que possua uma JVM!
16712855225

Conforme vimos em aula, seria mais correto dizer Java Virtual Machine (JVM) e, não,
Sistema Java. No entanto, a questão está correta.

Gabarito: C

(CESPE - 2012 - Banco da Amazônia - Técnico Científico - Análise de Sistemas


No Java, a JRE possui tudo que é necessário para desenvolver programas em
Java.

Comentários:

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 77 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

Portanto, é o seguinte: se você deseja somente executar alguma aplicação Java no


seu computador ou navegador, basta instalar um JRE! No entanto, se você planeja
programar em Java, você precisará de um JDK (que contém a JRE)! Entenderam? É
bastante simples! JRE é o mínimo que você precisa para rodar uma aplicação e o JDK
é o que você precisa para desenvolver uma aplicação!

Conforme vimos em aula, ela possui tudo que é necessário para executar programas
em Java. Para desenvolver programas, seria necessária uma JDK!

Gabarito: E

(CESPE - 2012 - Banco da Amazônia - Técnico Científico - Análise de Sistemas


Em Java, para toda classe, método e variável de instância que se declara há um
controle de acesso, independentemente de o controle ser explicitamente
indicado.

Comentários:

Especificador Própria Classe Subclasse Pacote Global


Private (-) Sim Não Não Não
<vazio> (~) Sim Não* Sim Não
Protegido (#) Sim Sim Sim Não
Público (+) Sim Sim Sim Sim

Conforme vimos em aula, está perfeito! Por que ele diz “independentemente de o
controle ser explicitamente indicado”? Porque quando não se indica o modificador
de acesso, assume-se que é Pacote ou Default.
16712855225

Gabarito: C

(CESPE - 2012 - Banco da Amazônia - Técnico Científico - Análise de Sistemas


O operador instanceof só pode ser usado para testar valores null.

Comentários:

Palavras Descrição
Testa se um objeto é uma instância de uma classe específica ou se é null.
Instanceof

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 78 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

Conforme vimos em aula, ele também pode ser utilizado para testar se um objeto
é instância de uma classe específica.

Gabarito: E

(CESPE - 2012 - MPE-PI - Analista Ministerial - Informática - Cargo 6 Em Java,


qualquer método de uma classe pode ser sobrescrito por métodos de outra
classe.

Comentários:

//Indica que esse método não possui corpo


abstract int soma (int a, int b) {//...//}

//Indica que esse método não pode ser sobrescrito


final int soma (int a, int b) {//...//}

//Indica que esse método só pode acessar atributos de classe e não pode ser sobrescrito
static int soma (int a, int b) {//...//}

//Indica que esse método foi escrito outra linguagem


native int soma (int a, int b) {//...//}

//Indica que esse método só é executável por uma thread por vez
synchronized soma (int a, int b) {//...//}

Não, métodos finais, estáticos e privados não podem ser sobrescritos por métodos
de outra classe.

Gabarito: E

(CESPE - 2011 - -ES - Técnico de Informática - Específicos) O JVM (Java Virtual


16712855225

Machine) é um interpretador que atribui portabilidade à linguagem Java,


possibilitando, consequentemente, a sua execução em qualquer sistema
operacional.

Comentários:

Java é também uma linguagem portável e multiplataforma! O Compilador é capaz


de gerar um código intermediário (bytecode), que permite que o mesmo programa
possa ser executado em qualquer máquina ou sistema operacional que possua uma
JVM. Ademais, busca que todos os aspectos da linguagem sejam independentes de
plataforma (Ex: ela especifica o tamanho e comportamento de cada tipo de dado).

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 79 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

Perfeito, desde que haja uma Java Virtual Machine (JVM) específica para esse
Sistema Operacional. Portanto, a questão está incompleta, mas não é bom brigar
com a banca.

Gabarito: C

(CESPE - 2011 - TRE-ES - Técnico - Programação de Sistemas – Específicos O


encapsulamento em Java somente pode ser realizado por meio do modificador
de acesso protegido.

Comentários:

Especificador Própria Classe Subclasse Pacote Global


Private (-) Sim Não Não Não
<vazio> (~) Sim Não* Sim Não
Protegido (#) Sim Sim Sim Não
Público (+) Sim Sim Sim Sim

Não, pode ser Público, Privado, Protegido ou Padrão.

Gabarito: E

(CESPE - 2010 - TRT - 21ª Região (RN) - Técnico Judiciário - Tecnologia da


Informação A linguagem de programação Java, em razão de sua portabilidade
— uma vez que o compilador Java converte o código fonte em bytecodes,
executados por uma máquina virtual — é bastante utilizada para oferecer
conteúdos dinâmicos na Web. 16712855225

Comentários:

O bytecode é um código intermediário, que é posteriormente interpretado e


executado por uma Java Virtual Machine (JVM). O que é isso, professor? É um
programa que carrega e executa os aplicativos Java, convertendo bytecodes em
código executável. Lembram que eu falei que Java é uma Linguagem WORA? Pois é,
isso ocorre em grande parte por conta do bytecode e da Máquina Virtual Java.

Conforme vimos em aula, está perfeito! Para tal, utiliza-se o Java EE.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 80 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

Gabarito: C

10. (CESPE - 2010 - TRE-BA - Técnico Judiciário - Programação de Sistemas Em


programação orientada a objetos, o pacote tem como função agrupar classes
dentro de um grupo. Em Java, o pacote Swing (javax.swing) é composto de várias
classes para a implementação de interfaces gráficas em desktop.

Comentários:

A Plataforma Java oferece recursos para construção de interfaces gráficas de usuário


(GUI), entre eles: AWT (java.awt) e Swing (javax.swing)! O primeiro é um conjunto básico
de classes e interfaces que definem os componentes de uma janela desktop. Já o
Swing é um conjunto sofisticado de classes e interfaces que definem os componentes
visuais necessários para construir uma interface gráfica de usuário.

Conforme vimos em aula, a questão está correta!

Gabarito: C

11. (CESPE - - ANAC - Analista Administrativo - Tecnologia da Informação


Pelo uso de polimorfismo, uma chamada de método pode fazer que diferentes
ações ocorram, dependendo do tipo do objeto que recebe a chamada.

Comentários:

A palavra Polimorfismo vem do grego: muitas formas. Trata-se da capacidade de um


objeto poder se comportar de diversas formas dependendo da mensagem recebida
Observem que isso não quer dizer que o objeto fica transformando seu tipo a todo
momento. Na verdade, um objeto nasce com um tipo e morre com esse mesmo tipo.
16712855225

O que muda, então? É a forma como nós nos referimos a esse objeto!

Conforme vimos em aula, dependendo do tipo de objeto (se é da Classe-Pai ou da


Classe-Filho), ações diferentes podem ocorrer.

Gabarito: C

12. (CESPE - 2010 - EMBASA - Analista de Saneamento - Analista de Tecnologia da


Informação - Desenvolvimento O trecho de código a seguir está incorreto
porque uma variável booleana em Java usa a sintaxe == e não =.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 81 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

Public void disconnect() {


Connected = false;
}

Comentários:

ARITMÉTICOS ATRIBUIÇÃO RELACIONAIS LÓGICOS BIT A BIT


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

Conforme vimos em aula, o operador de atribuição (=) é diferente do operador


relacional (==).

Gabarito: E

13. (CESPE - - TRE-MA - Técnico Judiciário - Programação de Sistemas) Para


definição e manipulação de uma exceção em Java, devem constar no programa,
obrigatoriamente, os termos:

a) try e catch.
b) try e finally.
c) finally e catch. 16712855225

d) finally e retry.
e) try e retry.

Comentários:

É útil para liberar recursos do sistema quando utilizamos, por exemplo, conexões de
banco de dados e abertura de buffer para leitura ou escrita de arquivos. finally virá
após os blocos de catch. Portanto, o try indica que um bloco de código pode ocorrer
erro; o catch tem o objetivo de capturar, manipula e trata erros; e o finally busca realizar
ações mesmo após a captura de erros. Vejamos a estrutura básica:

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 82 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

Conforme vimos em aula, utilizam-se Try e Catch!

Gabarito: A

14. (CESPE - 2009 - TRT - 17ª Região (ES) - Técnico Judiciário - Tecnologia da
Informação Ao contrário dos tipos primitivos que não são objetos, os tipos de
objetos são determinados pela classe de origem.

Comentários:

Perfeito, perfeito, perfeito!

Gabarito: C

15. (CESPE - 2009 - TRT - 17ª Região (ES) - Técnico Judiciário - Tecnologia da
Informação Uma classe final indica uma classe que não pode ser estendida. Um
método final não pode ser redefinido em classes derivadas.

Comentários:

//Indica que esse método não pode ser sobrescrito


final int soma (int a, int b) {//...//}

//Essa classe não pode ser estendida


final class Carro { //...// }

Conforme vimos em aula, a classe final não pode ter filhos e Método Final não pode
ser sobrescrita.

16712855225

Gabarito: C

16. (CESPE - - SERPRO - Analista - Desenvolvimento de Sistemas A linguagem


Java, orientada a objetos, tem como característica ser compilada em um código
executado em máquina virtual.

Comentários:

Java é também uma linguagem portável e multiplataforma! O Compilador é capaz


de gerar um código intermediário (bytecode), que permite que o mesmo programa
possa ser executado em qualquer máquina ou sistema operacional que possua uma

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 83 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

JVM. Ademais, busca que todos os aspectos da linguagem sejam independentes de


plataforma (Ex: ela especifica o tamanho e comportamento de cada tipo de dado).

Conforme vimos em aula, está perfeito! Qual o nome desse código? Bytecode!

Gabarito: C

17. (CESPE - - TRT - 5ª Região (BA) - Técnico Judiciário - Tecnologia da


Informação A instrução import Java.awt.* indica que o programa irá utilizar
componentes gráficos.

Comentários:

Essa questão é polêmica! Alguns afirmar que é possível inserir a instrução, mas não
utilizar componentes gráficos. Não faria sentido importar um pacote para não
utilizar suas funcionalidades, mas é possível – apesar de má prática! Eu acredito que
a questão cabe recurso, sim!

Gabarito: C

18. (CESPE - - TRT - 5ª Região (BA) - Técnico Judiciário - Tecnologia da


Informação Em Java, os métodos public de uma classe são utilizados pelos
clientes da classe para manipular dados armazenados em objetos dessa classe.

Comentários:

Pessoal, esses Modificadores de Acesso determinam quão acessíveis são esses


elementos. Vamos vê-los agora em mais detalhes:
16712855225

 <public>: essa instrução indica que a classe, método ou atributo assim declaradas
podem ser acessadas em qualquer lugar e a qualquer momento da execução do
programa – é o modificador menos restritivo.

Perfeito, são públicos para toda e qualquer classe.

Gabarito: C

19. (CESPE - 2013 - SERPRO - Analista - Desenvolvimento de Sistemas A tecnologia


JSE (Java Small Editon) utilizada pela plataforma iOS permite o desenvolvimento

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 84 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

de aplicações para todos os seus dispositivos, como estações gráficas, iPad, iPod,
entre outros.

Comentários:

 Java Micro Edition (Java ME): trata-se do padrão aplicado a dispositivos


compactos ou móveis, como smartphones, tablets, controles remotos, etc. Permite
o desenvolvimento de softwares embarcados, i.e., aplicações que rodam em um
dispositivo de propósito específico, desempenhando alguma tarefa útil. Em geral,
possuem limitações de recursos como memória ou processamento.

Conforme vimos em aula, a questão está cheia de erros! Primeiro, JSE é a sigla de
Java Standard Edition. Segundo, a tecnologia proposta no item é o JME!

Gabarito: E

(CESPE - 2013 - MPOG - Tecnologia da Informação O JME foi criado para


trabalhar com ambientes de programação multiprocessados em ambientes
distribuídos.

Comentários:

 Java Micro Edition (Java ME): trata-se do padrão aplicado a dispositivos compactos
ou móveis, como smartphones, tablets, controles remotos, etc. Permite o
desenvolvimento de softwares embarcados, i.e., aplicações que rodam em um
dispositivo de propósito específico, desempenhando alguma tarefa útil. Em geral,
possuem limitações de recursos como memória ou processamento.

 Java Enterprise Edition (Java EE): trata-se do padrão para desenvolvimento de


16712855225

sistemas corporativos, voltada para aplicações multicamadas, baseadas em


componentes executados em servidores de aplicações – ele inclui o Java SE.
Contém bibliotecas para acesso a base de dados, RPC, CORBA, entre outras. As
aplicações podem ou não estar na internet.

Conforme vimos em aula, Java ME possui diversas limitações de recursos. Na


verdade, é o Java EE que é ideal para ambientes distribuídos.

Gabarito: E

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 85 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

21. (CESPE - 2013 - ANTT - Analista Administrativo - Desenvolvimento de Sistemas


da Informação JSE, JME, JEE e JCE são edições da tecnologia Java voltadas para
o desenvolvimento de aplicações para desktop/servidores, dispositivos móveis,
ambientes corporativos e ambientes em nuvem, respectivamente.

Comentários:

 Java Micro Edition (Java ME): trata-se do padrão aplicado a dispositivos


compactos ou móveis, como smartphones, tablets, controles remotos, etc. Permite
o desenvolvimento de softwares embarcados, i.e., aplicações que rodam em um
dispositivo de propósito específico, desempenhando alguma tarefa útil. Em geral,
possuem limitações de recursos como memória ou processamento.

Conforme vimos em aula, está quase tudo certo! No entanto, JCE é uma API de
Criptografia (Java Cryptography Extension). Não se trata de uma plataforma ou
ambiente de desenvolvimento em nuvem!

Gabarito: E

(CESPE - - HEMOBRÁS - Técnico de Informática O Java dá suporte a


programação concorrente (multithreading).

Comentários:

Dessa forma, aplicações funcionam da mesma maneira em qualquer ambiente.


Podemos dizer que Java é uma linguagem concorrente ou multithreaded, i.e., pode
realizar diversas tarefas assincronamente com o uso de threads, que são suportadas
de modo nativo. Java torna a manipulação de threads tão simples quanto trabalhar
com qualquer variável. 16712855225

Conforme vimos em aula, Java dá suporte à programação concorrente. Observem


que a própria questão escreveu “a” sem crase. As bancas não ajudam :-(

Gabarito: C

(CESPE - - ANAC - Técnico Administrativo - Informática) A linguagem de


programação Java permite operações de bit, como, por exemplo, AND (&) e OR
(|).

Comentários:

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 86 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

ARITMÉTICOS ATRIBUIÇÃO RELACIONAIS LÓGICOS BIT A BIT


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

Conforme vimos em aula, esses são de fato operadores de bit!

Gabarito: C

24. (CESPE - 2010 - MPU - Técnico de Informática Na linguagem Java, um objeto


do tipo Integer pode receber valor nulo, porém uma variável primitiva int não pode.

Comentários:

NOME TIPO TAMANHO MÍNIMO MÁXIMO DEFAULT


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

7 Casas Decimais 0.0


DECIMAL
double 64 bits 15 Casas Decimais 0.0

Conforme vimos em aula, int é uma variável primitiva que recebe valores inteiros,
i.e., não pode receber valor nulo. Já o tipo Integer é um objeto, logo pode receber
valores nulos.

Gabarito: C

( PE - 2013 - TRT - 10ª REGIÃO (DF e TO) - Técnico Judiciário - Tecnologia da


Informação É possível indicar que parte de um código em um método pode
gerar uma exceção, por meio da utilização da palavra-chave finally.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 87 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

Comentários:

É útil para liberar recursos do sistema quando utilizamos, por exemplo, conexões de
banco de dados e abertura de buffer para leitura ou escrita de arquivos. finally virá
após os blocos de catch. Portanto, o try indica que um bloco de código pode ocorrer
erro; o catch tem o objetivo de capturar, manipula e trata erros; e o finally busca realizar
ações mesmo após a captura de erros. Vejamos a estrutura básica:

Conforme vimos em aula, a questão trata do try e, não, do finally.

Gabarito: E

(CESPE - 2014 - ANATEL - Analista Administrativo - Tecnologia da Informação e


Comunicação A linguagem Java possui checked exceptions que estendem
java.lang.Exception, em que o compilador força o programador a capturar tais
exceções. Essas exceções devem ser tratadas com um bloco try-catch ou com
um throws.

Comentários:

16712855225

A segunda define erros para os quais as aplicações normalmente têm condições de


realizar um tratamento, logo Exception e Error são subtipos de Throwable. As exceções
ainda se dividem em verificadas (Checked), quando obrigatoriamente devem ser

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 88 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

tratadas e não-verificadas (Unchecked), quando não há essa obrigação – programador


decide! E como se detectam, manipulam e tratam as exceções?

Conforme vimos em aula, podemos ter vários blocos catch de um único try. Além
disso, de fato elas devem tratadas (try-catch) ou propagadas (throws).

Gabarito: C

27. (CESPE – 2004 – STJ - Analista Judiciário - Análise de Sistemas) O Java collections
framework da API Java J2SE possui um conjunto de interfaces e implementações
que define estruturas usadas para manipular coleções de objetos. As interfaces
fundamentais do framework estão associadas à identificação de funcionalidades
típicas de estruturas de dados clássicas. Assim, a interface java.util.List está ligada
a estruturas de listas, a interface java.util.Set está associada a estruturas do tipo
conjuntos e a interface java.util.Map refere-se a estruturas do tipo mapas. Set,
List e Map possuem a interface abstrata java.util.Collection como superinterface.

Comentários:

Por fim, vamos falar sobre os Mapas (java.util.Map). Aqui já começamos diferente,
porque mapas não são coleções. Pensem comigo: muitas vezes queremos buscar
rapidamente um objeto, dada alguma informação sobre ele (Ex: dada a placa do
carro, obter todos os dados). Poderíamos utilizar uma lista e percorrer todos os
elementos, mas isso é péssimo para a performance – aqui entra o mapa!

Conforme vimos em aula, mapas não são coleções – não são filhos de java.util.Collection.

Gabarito: E
16712855225

(CESPE – 2004 – STJ - Analista Judiciário - Análise de Sistemas) As classes


java.util.LinkedList e java.util.ArrayList são implementações para listas
encadeadas e coleções do tipo arranjos com tamanho modificável,
respectivamente, para a interface java.util.List.

Comentários:

Galera, não sei se algum de vocês já programou em C! Se sim, vocês se lembram de


como era complicado utilizar ponteiros, ponteiros para ponteiros, alocação dinâmica
de memória? Pois é, Java não exige que você faça nada disso! As coisas aqui são

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 89 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

muito mais simples e já existe bastante funcionalidade implementada e pronta para


ser utilizada. As principais classes implementadoras são: ArrayList, LinkedList, Vector.

Conforme vimos em aula, essas são – de fato – classes implementadoras de


java.util.List.

Gabarito: C

(CESPE – – ANCINE – Analista de Sistemas) Os tipos de dados HashSet,


ArrayList e HashMap são classes que implementam os tipos de dados Set, List e
Map, respectivamente.

Comentários:

Galera, não sei se algum de vocês já programou em C! Se sim, vocês se lembram de


como era complicado utilizar ponteiros, ponteiros para ponteiros, alocação dinâmica
de memória? Pois é, Java não exige que você faça nada disso! As coisas aqui são
muito mais simples e já existe bastante funcionalidade implementada e pronta para
ser utilizada. As principais classes implementadoras são: ArrayList, LinkedList, Vector.

Como os conjuntos não possuem ordem, as operações baseadas em índice que


existem nas listas não aparecem nos conjuntos. Set é a interface Java que define os
métodos que um conjunto deve implementar. As principais classes implementadoras
são: HashSet, TreeSet e LinkedHashSet. Cada implementação possui suas características
sendo apropriadas para contextos diferentes.

Em um dicionário eu associo um vocábulo a uma definição. A chave é um objeto


utilizado para recuperar um valor. O mapa costuma aparecer junto com outras
coleções, para poder realizar essas buscas. As principais classes implementadoras da
16712855225

interface Map são: HashMap, TreeMap e LinkedHashMap. Cada implementação possui suas
características sendo apropriadas para contextos diferentes.

Conforme vimos em aula, a questão está perfeita!

Gabarito: C

(CESPE – – SGA/AC – Analista de Sistemas – C ArrayList implementa a


interface List e Collection.

Comentários:

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 90 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

Galera, não sei se algum de vocês já programou em C! Se sim, vocês se lembram de


como era complicado utilizar ponteiros, ponteiros para ponteiros, alocação dinâmica
de memória? Pois é, Java não exige que você faça nada disso! As coisas aqui são
muito mais simples e já existe bastante funcionalidade implementada e pronta para
ser utilizada. As principais classes implementadoras são: ArrayList, LinkedList, Vector.

Conforme vimos em aula, ArrayList é uma classe implementadora da Interface List,


que por sua vez estende a interface java.util.Collection. ArrayList não implementa Collection
diretamente.

Gabarito: E

31. (CESPE – 2008 – MPE/RR - Analista de Sistemas) O pacote java.awt contém


diversas classes para criar interfaces gráficas de usuário em aplicações Java.

Comentários:

A Plataforma Java oferece recursos para construção de interfaces gráficas de usuário


(GUI), entre eles: AWT (java.awt) e Swing (javax.swing)! O primeiro é um conjunto básico
de classes e interfaces que definem os componentes de uma janela desktop. Já o
Swing é um conjunto sofisticado de classes e interfaces que definem os componentes
visuais necessários para construir uma interface gráfica de usuário.

Conforme vimos em aula, trata-se de um pacote de classes para criar interfaces


gráficas de usuário em Java.

Gabarito: C
16712855225

(CESPE – – MPE/RR - Analista de Sistemas) No AWT, um componente é


qualquer classe que possa ser representada em uma tela sem interação com
usuário.

Comentários:

A Plataforma Java oferece recursos para construção de interfaces gráficas de usuário


(GUI), entre eles: AWT (java.awt) e Swing (javax.swing)! O primeiro é um conjunto básico
de classes e interfaces que definem os componentes de uma janela desktop. Já o
Swing é um conjunto sofisticado de classes e interfaces que definem os componentes
visuais necessários para construir uma interface gráfica de usuário.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 91 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

Conforme vimos em aula, trata-se de uma interface com o usuário, logo interage
com o usuário.

Gabarito: E

(CESPE – – MPE/RR - Analista de Sistemas) O Swing suporta o


desenvolvimento de interfaces gráficas para usuários (GUI) com o uso da IDE
NetBeans

Comentários:

A Plataforma Java oferece recursos para construção de interfaces gráficas de usuário


(GUI), entre eles: AWT (java.awt) e Swing (javax.swing)! O primeiro é um conjunto básico
de classes e interfaces que definem os componentes de uma janela desktop. Já o
Swing é um conjunto sofisticado de classes e interfaces que definem os componentes
visuais necessários para construir uma interface gráfica de usuário.

Conforme vimos em aula, a questão está correta! Qual a IDE utilizada pouco
importa, o swing suporta o desenvolvimento de GUI e ponto final!

Gabarito: C

34. (CESPE – 2011 – MEC - Analista de Sistemas) AWT é um conjunto de


componentes GUI, integrante da arquitetura JEE6, constante no pacote java.awt,
desenvolvidas para substituir as GUIs do SWING.

Comentários:
16712855225

O AWT (javax.awt) veio primeiro, é mais pesado, é gerado pelo sistema operacional,
logo é dependente de plataforma. O Swing (javax.swing) é mais leve, é gerado por uma
Máquina Virtual Java (JVM), logo é independente de plataforma. Galera, nem tudo é
diferente! Vejam: ambos são fáceis de programar, porque a orientação a objetos
proporciona alterar partes do programa, sem alterar toda a estrutura.

Conforme vimos em aula, AWT veio primeiro que o Swing! Esse último veio dar mais
dinamismo e leveza aos componentes – hoje em dia, pouco se usa de AWT!

Gabarito: E

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 92 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

(CESPE – 2015 – TCU - Analista de Sistemas No contexto de um código na


linguagem Java, o comando a seguir é utilizado com a finalidade específica de
passar para o campo de visibilidade pública saldo o valor da variável deposito
com o tipo double. public void saldo (double deposito).

Comentários:

A redação ficou um pouco confusa, mas vejam que a questão fala em passar para
campo. Que campo? O saldo é um método e, não, um campo.
Gabarito: E

(CESPE – 2014 – ANATEL - Analista de Sistemas No JSE (Java Standard Edition)


versão 8, é possível utilizar recursos inerentes à programação funcional por meio
de uma nova característica da linguagem chamada expressões Lambda, que
permitem o tratamento de funções como argumentos de métodos.

Comentários:

Pessoal, vocês já devem saber que nós temos uma nova versão! A cobrança ainda é
raríssima (só encontrei uma questão), mas é bom saber um pouco sobre as principais
novidades. A grande novidade foram as Lambda Expressions! Pois é, Java agora tem
algumas características de programação funcional. Professor, o que é exatamente
programação funcional?

É um paradigma de programação que trata a computação como uma avaliação de


funções matemáticas e que evita estados ou dados mutáveis. Ela enfatiza a aplicação
de funções, em contraste com a programação imperativa, que enfatiza mudanças
no estado do programa. As Lambda Expressions permitem passar comportamentos,
ou funções como argumentos em uma chamada de método.
16712855225

Conforme vimos em aula, a questão está perfeita!


Gabarito: C

ACERTEI ERREI

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 93 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

(FCC - 2011 - TRE-RN - Técnico Judiciário - Programação de Sistemas Em relação


ao Java Standard Edition, é INCORRETO afirmar:

a) Possui gerenciamento de memória embutido, por meio do coletor de lixo.

b) Ambiente indicado para o desenvolvimento de aplicativos para dispositivos


móveis ou portáteis.

c) Permite o desenvolvimento de aplicações desktop de linha de comando e


interfaces gráficas Swing.

d) Portabilidade dos programas compilados para diversos sistemas operacionais,


sem necessidade de recompilação.

e) Usa conceitos tais como orientação a objetos e multithreading.

Comentários:

O acesso a arrays e strings, e a conversão de tipos são checados em tempo de


execução para assegurar a sua validade. O Garbage Collector faz a desalocação
automática de memória evitando, erros de referência e desperdício de memória.
Finalmente, o recurso de Exception Handling permite o tratamento de erros em tempo de
16712855225

execução, por um mecanismo robusto, análogo ao do C++.

(a) Conforme vimos em aula, ele contém um Garbage Collector para gerenciamento
de memória;

 Java Micro Edition (Java ME): trata-se do padrão aplicado a dispositivos


compactos ou móveis, como smartphones, tablets, controles remotos, etc. Permite
o desenvolvimento de softwares embarcados, i.e., aplicações que rodam em um
dispositivo de propósito específico, desempenhando alguma tarefa útil. Em geral,
possuem limitações de recursos como memória ou processamento.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 94 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

(b) Conforme vimos em aula, esse é o Java ME (Java Micro Edition);

A Plataforma Java oferece recursos para construção de interfaces gráficas de usuário


(GUI), entre eles: AWT (java.awt) e Swing (javax.swing)! O primeiro é um conjunto básico
de classes e interfaces que definem os componentes de uma janela desktop. Já o
Swing é um conjunto sofisticado de classes e interfaces que definem os componentes
visuais necessários para construir uma interface gráfica de usuário.

(c) Conforme vimos em aula, ele permite desenvolvimento de aplicações desktop e


de interfaces gráficos (Swing e AWT);

Vocês sabiam que Java é uma Linguagem WORA? Pois é, esse acrônimo significa
Write Once, Run Anywhere ou Escreva uma vez, execute em qualquer lugar. Trata-
se de um slogan para exemplificar os benefícios multiplataforma da linguagem Java!
Idealmente, isso significa que um programa em Java (uma vez compilado em um
bytecode) pode rodar em qualquer equipamento que possua uma JVM!

(d) Conforme vimos em aula, é uma linguagem WORA (Write Once, Run Anywhere);

Dessa forma, aplicações funcionam da mesma maneira em qualquer ambiente.


Podemos dizer que Java é uma linguagem concorrente ou multithreaded, i.e., pode
realizar diversas tarefas assincronamente com o uso de threads, que são suportadas
de modo nativo. Java torna a manipulação de threads tão simples quanto trabalhar
com qualquer variável.

(e) Conforme vimos em aula, é uma linguagem orientada a objetos e possui suporte
nativo a threads;

16712855225

Gabarito: B

(FCC - 2010 - TRT - 22ª Região (PI) - Técnico Judiciário - Tecnologia da


Informação A plataforma Java disponibiliza um interpretador que traduz, em
tempo de execução, o bytecode para instruções nativas do processador,
permitindo, dessa forma, que uma mesma aplicação seja executada em qualquer
plataforma computacional que possua essa implementação. Trata-se de:

a) Java Virtual Machine.


b) Java API.
c) JavaBeans.
d) J2SE.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 95 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

e) JavaFX.

Comentários:

O bytecode é um código intermediário, que é posteriormente interpretado e


executado por uma Java Virtual Machine (JVM). O que é isso, professor? É um
programa que carrega e executa os aplicativos Java, convertendo bytecodes em
código executável. Lembram que eu falei que Java é uma Linguagem WORA? Pois é,
isso ocorre em grande parte por conta do bytecode e da Máquina Virtual Java.

Conforme vimos em aula, trata-se da Java Virtual Machine (JVM)!

Gabarito: A

(FCC - 2010 - Sergipe Gás S.A. - Analista de Sistemas É tida como uma das
principais linguagens de programação orientada a objeto; tem como
característica a compilação para um bytecode e execução por uma máquina
virtual. Trata-se da linguagem:

a) Algol.
b) Delphi.
c) C++.
d) Java.
e) PHP.

Comentários:

Java é também uma linguagem portável e multiplataforma! O Compilador é capaz


de gerar um código intermediário (bytecode), que permite que o mesmo programa
16712855225

possa ser executado em qualquer máquina ou sistema operacional que possua uma
JVM. Ademais, busca que todos os aspectos da linguagem sejam independentes de
plataforma (Ex: ela especifica o tamanho e comportamento de cada tipo de dado).

Conforme vimos em aula, trata-se da linguagem Java.

Gabarito: D

(FCC - 2010 - TCE- - Agente da Fiscalização Financeira - Informática - Suporte


de Web Os aplicativos Java “rodam” em diferentes ambientes. A tradução dos

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 96 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

códigos Java (bytecode), para instruções específicas de cada sistema e


dispositivo, é uma função do programa:

a) Java Community Process (JCP).


b) Java Virtual Module (JVM).
c) Java Virtual Machine (JVM).
d) Java Comunication Process (JCP).
e) Java Enterprise Machine (JEM).

Comentários:

O bytecode é um código intermediário, que é posteriormente interpretado e


executado por uma Java Virtual Machine (JVM). O que é isso, professor? É um
programa que carrega e executa os aplicativos Java, convertendo bytecodes em
código executável. Lembram que eu falei que Java é uma Linguagem WORA? Pois é,
isso ocorre em grande parte por conta do bytecode e da Máquina Virtual Java.

Conforme vimos em aula, trata-se da Java Virtual Machine (JVM)!

Gabarito: C

(FCC - 2009 - -SE - Técnico Judiciário - Programação de Sistemas Um objeto


é instanciado em Java por meio do operador:

a) instanceof.
b) extend.
c) new.
d) this.
e) type. 16712855225

Comentários:

Palavras Descrição
Testa se um objeto é uma instância de uma classe específica ou se é null.
Instanceof

Utilizado para aplicar o conceito de herança para uma classe, onde uma
Extends classe receberá os métodos e variáveis de instância da classe chamada de
pai.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 97 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

Utilizada para se criar novas instâncias de objetos.


New

Representa a instância que está atualmente sendo executada.


This

Conforme vimos em aula, trata-se da palavra-reservada new – lembrando que type


não é um operador!

Gabarito: C

(FCC - 2009 - TRT - 16ª REGIÃO (MA) - Técnico Judiciário - Tecnologia da


Informação Uma classe Java pode ser instanciada por um comando, cuja sintaxe
é:

a) nome_Objeto nome_Classe = new nome_Objeto();


b) nome_Classe nome_Objeto = new nome_Classe();
c) nome_Classe nome_instancia = new nome_Objeto();
d) nome_Instancia nome_Objeto = new nome_Instancia();
e) nome_Instancia nome_Classe = new nome_Instancia();

Comentários:

/* 1) Operador NEW é responsável por criar um objeto;


* 2) NomeClasse() é o construtor da Classe NomeClasse;
* 3) NomeObjeto é uma variável do Tipo NomeClasse; */

NomeClasse NomeObjeto = new NomeClasse();

/* Observem que é possível atribuir o objeto de uma 16712855225

* classe para uma variável de outra classe */

Conforme vimos em aula, o operador new cria um novo objeto! Para tal, utiliza-se
o construtor da classe que se deseja criar uma instância: Nome_Classe( ). Por fim, ele
atribui esse novo objeto a uma variável Nome_Objeto pertencente a classe Nome_Classe.

Gabarito: B

(FCC - 2009 - TRT - 16ª REGIÃO (MA) - Técnico Judiciário - Tecnologia da


Informação A diretiva public é utilizada em Java para aplicar a encapsulação
pública:

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 98 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

a) aos métodos e classes, apenas.


b) aos atributos, métodos e classes.
c) às classes, apenas.
d) aos atributos, apenas.
e) aos atributos e classes, apenas.

Comentários:

Pessoal, esses Modificadores de Acesso determinam quão acessíveis são esses


elementos. Vamos vê-los agora em mais detalhes:

 <public>: essa instrução indica que a classe, método ou atributo assim declaradas
podem ser acessadas em qualquer lugar e a qualquer momento da execução do
programa – é o modificador menos restritivo.

Conforme vimos em aula, o public pode ser aplicado a atributos, métodos e classes.

Gabarito: B

(FCC - 2008 - TCE-AL - Programador Em Java, para alterar a visibilidade do


elemento em que se aplica, entre outros, utiliza-se o modificador de acesso:

a) static.
b) abstract.
c) protected.
d) volatile.
e) transient.
16712855225

Comentários:

Pessoal, esses Modificadores de Acesso determinam quão acessíveis são esses


elementos. Vamos vê-los agora em mais detalhes:

 <protected>: essa instrução indica que métodos ou atributos (classes, não) assim
declaradas somente podem ser acessadas dentro do pacote em que está contida
ou por subclasses no mesmo pacote.

Apenas um desses é um Modificador de Acesso: protected.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 99 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

Gabarito: C

(FCC - 2007 - MPU - Analista de Informática - Desenvolvimento de Sistemas


Analise os seguintes valores, variáveis e operações usando expressões Java:

byte j = 30;
short k = 54;
int m = 40;
long n = 12L;
long resultado = 0L;
resultado += j;
resultado += k;
resultado /= n;
resultado -= m;

Após a última operação, o resultado será igual a:

a) -7.
b) -32.
c) -33.
d) 60.
e) 84.

Comentários:

resultado = resultado + j = 0L + 30 = 30L; //Houve cast implícito


resultado = resultado + j = 30L + 54 = 84L; //Houve cast implícito
resultado = resultado/n = 84L/12L = 7L;
resultado = resultado m = 7L 40 = -33L //Houve cast implícito

Gabarito: C

10. (FCC - - TRE-MG - Técnico Judiciário - Programação de Sistemas Os


16712855225

métodos Java que não retornam valores devem possuir no parâmetro tipo-de-
retorno a palavra:

a) static.
b) public.
c) void.
d) main.
e) string args.

Comentários:

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 100 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

Palavras Descrição
Representa um retorno vazio, i.e., nenhum retorno para esse método.
Void

Conforme vimos em aula, trata-se da palavra-reservada void.

Gabarito: C

11. (FCC - 2012 - TST - Analista Judiciário - Análise de Sistemas) Considere o


programa abaixo escrito na linguagem Java:

public class Programa


{
public static void main(String args[])
{
for(int i=3; i<20; i+=2)
{
System.out.print((i%3) + "");
}
}
}

O resultado a ser informado ao usuário após a execução do programa acima é:

a) 0 0 1 0 0 1 0 0 1
b) 0 1 2 0 1 2 0 1 2
c) 0 1 0 1 0 1 0 1 0
d) 1 2 1 2 1 2 1 2 1
e) 0 2 1 0 2 1 0 2 1

Comentários: 16712855225

i = 3; 3%3 = 0;
i = 5; 5%3 = 2;
i = 7; 7%3 = 1;
i = 9; 9%3 = 0;
i = 11; 11%3 = 2;
i = 13; 13%3 = 1;
i = 15; 15%3 = 0;
i = 17; 17%3 = 2;
i = 19; 19%3 = 1;

Lembrando que o Operador % oferece o resto da divisão entre dois números.

Gabarito: E

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 101 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

12. (FCC - 2012 - MPE-AP - Analista Ministerial - Tecnologia da Informação Analise


o código das classes a seguir presentes em um mesmo pacote de um projeto
Java:

public class NewClassA {


public double calcular(int x, int y) {
return x + y;
}

public double calcular(double x, double y) {


return x * y;
}
}

public class NewClassB extends NewClassA {

public class Start {


public static void main(String[] args) {

}
}

Com base nos códigos apresentados e nos conceitos da orientação a objetos é


correto afirmar:

a) No método main da classe Start não é possível instanciar objetos das classes
NewClassA e NewClassB, pois essas classes não contêm um construtor válido.

b) Se for digitada a instrução NewClassB c = new NewClassA(); no método main da classe


Start será instanciado um objeto da NewClassA.

c) Se for digitada a instrução NewClassA b = new NewClassB(); no método main da classe


Start ocorrerá um erro, pois não é possível criar um objeto da NewClassA por meio
16712855225

do construtor da NewClassB.

d) A existência de dois métodos de mesmo nome na NewClassA que recebem a


mesma quantidade de parâmetros indica que está ocorrendo uma sobrescrita de
métodos.

e) Por meio de um objeto da NewClassB será possível acessar os métodos presentes


na NewClassA.

Comentários:

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 102 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

(a) Não, mesmo que não tenha um construtor explícito, o compilador cria um
construtor padrão no momento da criação do objeto; (b) Não, não se pode atribuir
uma instância de classe-pai a variável de uma classe-filha; (c) Não, não haveria erro!
Pode-se atribuir uma instância de classe filha a variável de uma classe-pai; (d) Não,
isso é sobrecarga; (e) Perfeito, ela herda tudo da classe-pai.

Gabarito: E

13. (FCC - 2012 - TCE- - Auxiliar de Fiscalização Financeira Em um programa Java,


considere a existência de uma variável do tipo long chamada cod contendo o
valor 1234. Para passar o valor contido nessa variável para uma variável do tipo
byte chamada codNovo, deve-se fazer casting. Para isso, utiliza-se a instrução:
byte codNovo =

a) Byte.valueOf(cod);
b) (long) cod;
c) Byte.pasreByte(cod);
d) (byte) cod;
e) (cast) cod;

Comentários:

16712855225

Conforme vimos em aula, estamos indo do valor maior para o valor menor, portanto
precisamos fazer um cast explícito: byte codNovo = (byte) cod.

Gabarito: D

14. (FCC - 2012 - TRE- - Técnico Judiciário - Programação de Sistemas Para


chamar o método soma da classe Calculo, e mostrar na tela o retorno desse
método, é correto utilizar:

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 103 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03
public class Calculo {
public static double soma(double n1, double n2) {
return n1 + n2;
}
public static double soma(double n1, double n2, double n3) {
return n1 + n2 + n3;
}
}

a) Calculo c = new Calculo(); System.out.println (c.soma(10, 20, 30)); ou


System.out.println (Calculo.soma(10, 20));

b) Exclusivamente as instruções Calculo c = new Calculo(); System.out.println


(c.soma(10, 20));

c) Exclusivamente a instrução System.out.println (Calculo.soma(10, 20, 50));

d) Exclusivamente as instruções Calculo c = new Calculo(); double r = c.soma(10,


20); System.out.println(r);

e) Calculo c = Calculo.soma(10,20,30); System.out.println (c); ou


System.out.println (Calculo.soma(10, 20));

Comentários:

Vamos lá! Observem que há dois métodos estáticos, i.e., não é necessário criar um
objeto dessa classe para ter acesso aos seus métodos. Logo, há duas possibilidades:
pode-se instanciar um objeto dessa classe (Calculo c = new Calculo();) e chamar o método
pelo objeto (c.soma()) ou fazer o mesmo sem utilizar o objeto (Calculo.soma()). Portanto,
as letras B, C, D funcionariam, mas não exclusivamente, porque pode-se acessar o
método pelo objeto ou pela classe.
16712855225

Gabarito: A

15. (FCC - 2012 - TRE- - Técnico Judiciário - Programação de Sistemas Com


relação a herança na programação orientada a objetos com Java, é INCORRETO
afirmar:

a) Uma subclasse herda os métodos da superclasse, entretanto, pode ter seus


próprios métodos.

b) Quando se instancia um objeto da subclasse, podem ser passados valores


para os atributos da superclasse.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 104 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

c) Um objeto da subclasse pode ser um objeto da superclasse.

d) Em uma superclasse, para acessar métodos da subclasse deve ser usada a


instrução super.

e) Para definir que a subclasse herda as características da superclasse utiliza-se


a instrução extends na declaração da subclasse.

Comentários:

(a) Perfeito, ela pode criar seus próprios métodos; (b) Perfeito, porque eles são
herdados; (c) Perfeito, eles são herdados da superclasse; (d) Não, super é utilizado
para acessar métodos da superclasse; (e) Perfeito, esse operador indica que a
superclasse será estendida.

Gabarito: D

16. (FCC - 2011 - TRT - 4ª REGIÃO (RS) - Técnico Judiciário - Tecnologia da


Informação No ambiente de programação Java:

a) uma classe abstrata permite apenas métodos abstratos.


b) o corpo de um método abstrato termina com ponto e vírgula e a declaração
é delimitada por chaves.
c) uma interface pode definir tanto métodos abstratos quanto não abstratos.
d) a herança múltipla permite que mais classes sejam estendidas.
e) toda classe é uma subclasse direta ou indireta da classe Object.

Comentários: 16712855225

Cada classe, na hierarquia de classes, representa uma camada que adiciona diversas
capacidades a um objeto. No topo desta hierarquia você sempre vai encontrar uma
classe chamada de Object (Objeto). Qualquer classe estende implicitamente (sem
necessidade de declarar) a classe Object. Claro que, na maioria das vezes, isso ocorre
indiretamente.

(a) Não, ela permite métodos concretos; (b) Não, não tem chaves; (c) Não, todos os
métodos são abstratos; (d) Java não suporta herança múltipla; (e) Perfeito,
absolutamente todas as classes são filhas da Classe Object.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 105 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

Gabarito: E

17. (FCC - 2010 - TRT - 8ª Região (PA e AP) - Analista Judiciário - Tecnologia da
Informação São tipos primitivos da linguagem Java:

a) int, string, long e real.


b) char, int, real e bit.
c) boolean, double, float e byte.
d) real, short, long e char.
e) string, long int, short int e float.

Comentários:

NOME TIPO TAMANHO MÍNIMO MÁXIMO DEFAULT


LÓGICO boolean - false true false
CARACTERE char 16 bits 0 216 – 1 ‘\u0000’
byte 8 bits -27 27 – 1 0
short 16 bits -215 215 – 1 0
INTEIRO
int 32 bits -231 231 – 1 0
long 64 bits -263 263 – 1 0
float 32 bits 7 Casas Decimais 0.0
DECIMAL
double 64 bits 15 Casas Decimais 0.0

(a) string e real, não; (b) real e bit, não; (c) Perfeito! (d) real, não; (e) apenas float.

Gabarito: C

18. (FCC - 2010 - - - Agente Legislativo de Serviços Técnicos e Administrativos


16712855225

- Processamento de Dados Os tipos de dados primitivos em Java são:

a) char, boolean, byte, short, int, long, float e double.


b) char, boolean, byte, short, int, long, float, double e String.
c) byte, short, int, long, float e double.
d) byte, short, int, long, float, double, String e Date.
e) char, boolean, byte, short, int, long, float, double, String e Date.

Comentários:

NOME TIPO TAMANHO MÍNIMO MÁXIMO DEFAULT

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 106 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

LÓGICO boolean - false true false


CARACTERE char 16 bits 0 216 – 1 ‘\u0000’
byte 8 bits -27 27 – 1 0
short 16 bits -215 215 – 1 0
INTEIRO
int 32 bits -231 231 – 1 0
long 64 bits -263 263 – 1 0
float 32 bits 7 Casas Decimais 0.0
DECIMAL
double 64 bits 15 Casas Decimais 0.0

São oito tipos: byte, short, int, long, float, double, char e boolean.

Gabarito: A

19. (FCC - 2009 - TRT - 15ª Região - Analista Judiciário - Tecnologia da Informação
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: 16712855225

a) I, II, III e IV.


b) II e IV, somente.
c) III e IV, somente.
d) IV, somente.
e) III, somente.

Comentários:

(I) Não, bytecode é o resultado da compilação do código-fonte; (II) Não, o código


intermediário é chamado bytecode; (III) Perfeito, é exatamente assim; (IV) Não, a

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 107 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

compilação ocorre apenas uma vez e a interpretação a cada vez que o programa é
executado.

Gabarito: E

(FCC - 2008 - TCE-AL - Programador Os três elementos básicos quando


contidos num arquivo fonte Java devem obrigatoriamente se apresentar na
seguinte ordem:

a) import, package e class.


b) class, package e import.
c) class, import e package.
d) package, class e import.
e) package, import e class.

Comentários:

A diferença entre as duas formas de importação de pacotes é o consumo de recursos


do computador. Como o asterisco importa todos os sub-pacotes, o consumo de
memória será alto e, muito provavelmente, não usaremos todas as classes de todos
os pacotes importados. Por isso, o recomendado é sempre importar apenas o pacote
que será utilizado. A ordem é Package Import Class.

Conforme vimos em aula, deve-se declarar o pacote; depois, import; por fim, classe.

Gabarito: E

21. (FCC - 2014 – TRF/3 – Analista de Sistemas Considere a classe escrita em Java:
16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 108 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

O valor que será impresso na execução do método main é:

a) 6.0
b) 7
c) 8.0
d) 5.0
e) 12.5

Comentários:

Isso é um exemplo de polimorfismo! A questão é: qual método multi será utilizado?


Ele envia os valores 2.5 e 2! Ele pode entrar no primeiro método? Não, porque o
valor-padrão de número decimal no Java é Double, logo – para entrar no primeiro
método – teria que enviar o valor 2.5f, visto que é do tipo Float. Ele pode entrar no
segundo método? Não, visto que o valor 2.5 não pode ser inteiro! Ele pode entrar no
terceiro método? Sim, visto que o valor 2.5 é Double e o valor 2 é inteiro! Eu posso
passar um valor inteiro a uma variável do tipo Double? Sim, o que eu não posso
fazer é o contrário. Logo, o valor impresso será 2.5*2+3 = 8.0.

Gabarito: C

(FCC - - TCE-AL - Programador Considerando que as variáveis Java X, Y e


Z foram todas inicializadas com zero, os resultados das mesmas após as
alterações realizadas pelas atribuições X *= 2, Y -= 5 e Z /=3, respectivamente,
serão:

a) 0, -5 e 0
b) 0, 5 e 0 16712855225

c) 1, -5 e 3
d) 2, -5 e 3
e) 2, 5 e 3

Comentários:

X = X*2 = 0*2 = 0;
Y = Y-5 = 0-5 = -5;
Z = Z/3 = 0/3 = 0;

Portanto, a resposta é 0, -5 e 0.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 109 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

Gabarito: A

(FCC - 2008 - MPE-RS - Técnico em Informática - Área Sistemas A função Java:

public boolean VerificarCPF (string CPF);

representa um exemplo do conceito de:

a) override.
b) overload.
c) herança.
d) encapsulamento.
e) polimorfismo.

Comentários:

Essa questão é estranha! Ele não especifica exatamente o que ele quer saber, mas
vamos lá: por eliminação! (a) Impossível inferir algo sobre isso; (b) Impossível inferir
algo sobre isso; (c) Impossível inferir algo sobre isso; (d) Bem, há um modificador de
acesso, portanto representa um exemplo do conceito de encapsulamento; (e)
Impossível inferir algo sobre isso.

Gabarito: D

24. (FCC - 2007 - MPU - Analista de Informática - Desenvolvimento de Sistemas


Quanto às variáveis Java, um inteiro de 64 bits em notação de complemento de
dois que pode assumir valores entre -263 e 263 -1 é:

a) long. 16712855225

b) short.
c) float.
d) byte.
e) double.

Comentários:

NOME TIPO TAMANHO MÍNIMO MÁXIMO DEFAULT


LÓGICO boolean - false true false
CARACTERE char 16 bits 0 216 – 1 ‘\u0000’
INTEIRO byte 8 bits -27 27 – 1 0

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 110 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

short 16 bits -215 215 – 1 0


int 32 bits -231 231 – 1 0
long 64 bits -263 263 – 1 0
float 32 bits 7 Casas Decimais 0.0
DECIMAL
double 64 bits 15 Casas Decimais 0.0

Conforme vimos em aula, trata-se do tipo long.

Gabarito: A

(FCC - 2005 - TRE-MG - Técnico Judiciário - Programação de Sistemas A


seqüência de etapas para implementação de um programa Java é:

a) interpretação, codificação, execução e compilação.


b) codificação, interpretação, compilação e execução.
c) interpretação, codificação, compilação e execução.
d) codificação, compilação, interpretação e execução.
e) compilação, codificação, execução e interpretação.

Comentários:

O bytecode é um código intermediário, que é posteriormente interpretado e


executado por uma Java Virtual Machine (JVM). O que é isso, professor? É um
programa que carrega e executa os aplicativos Java, convertendo bytecodes em
código executável. Lembram que eu falei que Java é uma Linguagem WORA? Pois é,
isso ocorre em grande parte por conta do bytecode e da Máquina Virtual Java.

Conforme vimos em aula, devemos codificar o programa em .java; esse arquivo é


compilado em um código intermediário (bytecode) em .class; depois é interpretado
16712855225

em uma JVM; e, por fim, é executado.

Gabarito: D

(FCC - 2012 - TRE- - Técnico Judiciário - Programação de Sistemas Considere


a variável idade declarada no método main de uma classe Java, com a seguinte
instrução:

int idade=12;

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 111 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

Analise:

I. System.out.println (idade<18?"Menor de idade":"Maior de idade");

II. if(idade<18) {System.out.println("Menor de idade");} else


{System.out.println("Maior de idade");}

III. if(idade<18) {System.out.println("Menor de idade");} else if (idade>=18)


{System.out.println("Maior de idade");}

IV. switch(idade) {case<18: System.out.println("Menor de idade"); break;


case>=18: System.out.println("Maior de idade");}

Contém uma instrução correta que exibirá na tela a frase "Menor de idade":

a) I, II, III e IV.


b) I, II e III, apenas.
c) II e III, apenas.
d) II, apenas.
e) I e III, apenas.

Comentários:

(I) Operador Ternário: 12 é menor que 18, portanto irá imprimir “Menor de Idade”;
(II) 12 é menor que 18, portanto irá imprimir “Menor de Idade”; (III) 12 é menor que
18, portanto irá imprimir “Menor de Idade”; (IV) Case não aceita <, >, <=, >=, etc.

Gabarito: B
16712855225

27. (FCC - 2012 - TRE- - Técnico Judiciário - Programação de Sistemas) Considere


a estrutura de repetição seguinte:

public static void main(String{} args) {


int cont=1, r=0;
cont=1;
do {
r=r+cont;
cont+=4;
} while(cont<=5);
System.out.println(r);
System.out.println(cont);
}

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 112 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

A saída na tela será:

a) 15 e 6.
b) 1 e 5.
c) 0 e 1.
d) 6 e 9.
e) 9 e 7.

Comentários:

r = r + cont = 0 + 1 = 1;
cont = cont + 4 = 1 + 4 = 5;
r = r + cont = 1 + 5 = 6;
cont = cont + 4 = 5 + 4 = 9; //Sai do loop

Portanto, r = 6 e cont = 9.

Gabarito: D

(FCC - 2011 - TRE-AP - Técnico Judiciário - Programação de Sistemas Em relação


à plataforma de desenvolvimento JSE, considere:

I. Possibilita o desenvolvimento de aplicações desktop através de linha de


comando e através da interface gráfica Swing.

II. É multiplataforma: permite a portabilidade dos programas compilados para


diversos sistemas operacionais, sem necessidade de alteração do código ou de
recompilação.
16712855225

III. Faz uso explícito de ponteiros e usa conceitos modernos, tais como,
orientação a objetos e suporte a multithreading.

IV. Possui o gerenciamento de memória embutido, por meio do garbage


collector.

Está correto o que se afirmar em:

a) I, II e III, somente.
b) I, II e IV, somente.
c) I, III e IV, somente.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 113 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

d) II, III e IV, somente.


e) I, II, III e IV.

Comentários:

(I) Perfeito, é possível desenvolver aplicações desktop utilizando interface gráfica,


como Swing e AWT; (II) Perfeito, é uma linguagem WORA (Write Once, Run
Anywhere); (III) Não, não faz uso explícito de ponteiros; (IV) Perfeito, o Garbage
Collector realiza o gerenciamento de memória.

Gabarito: B

(FCC - 2011 - INFRAERO - Analista de Sistemas - Desenvolvimento e


Manutenção No Java, um tipo inteiro (int) utiliza quatro bytes para
armazenamento. A faixa máxima possível de valores inteiros para se armazenar
em uma variável do tipo primitivo int é de:

a) -8388608 a 8388607.
b) -128 a 127.
c) -32768 a 32767.
d) -9223372036854775808 a 9223372036854775807.
e) -2147483648 a 2147483647.

Comentários:

NOME TIPO TAMANHO MÍNIMO MÁXIMO DEFAULT


LÓGICO boolean - false true false
CARACTERE char 16 bits 0 216 – 1 ‘\u0000’
byte 8 bits -27 27 – 1 0
16712855225

short 16 bits -215 215 – 1 0


INTEIRO
int 32 bits -231 231 – 1 0
long 64 bits -263 263 – 1 0
float 32 bits 7 Casas Decimais 0.0
DECIMAL
double 64 bits 15 Casas Decimais 0.0

Basta fazer a conta: -231 a 231 – 1 = -2147483648 a 2147483647.

Gabarito: E

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 114 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

(FCC - 2010 - TRT - 9ª REGIÃO (PR) - Técnico Judiciário - Tecnologia da


Informação O JVM mais o núcleo de classes da plataforma Java e os arquivos
de suporte formam o:

a) o J2EE.
b) o JDK.
c) o JRE.
d) uma JSP.
e) uma API.

Comentários:

Um programa escrito para a plataforma Java necessita de um ambiente de execução


chamado Java Runtime Environment (JRE)! O que tem nesse negócio, professor? Ele
contém uma Máquina Virtual (JVM) e Bibiliotecas (APIs). E o Java Development Kit
(JDK)? Bem, eles contêm a JRE e outros componentes úteis para executar aplicações
(Exemplo: Javac, Javadoc, Jar, Appletviewer, Jconsole, Jstack, Jhat, etc).

Conforme vimos em aula, trata-se da Java Runtime Environment (JRE): ambiente


mínimo necessário para rodar aplicativos Java.

Gabarito: C

31. (FCC - 2014 - TRT - 16ª REGIÃO (MA) - Analista Judiciário - Tecnologia da
Informação Considere as classes a seguir, presentes em uma aplicação Java
orientada a objetos:

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 115 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

16712855225

Em uma classe principal foram digitadas, no interior do método main, as


seguintes linhas:

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 116 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

As linhas que contêm a instrução s = f.calcularSalario( ); demonstram um


conceito da orientação a objetos conhecido como:

a) encapsulamento.
b) sobrecarga de métodos.
c) polimorfismo.
d) sobrescrita de construtores.
e) métodos abstratos.

Comentários:

Primeiro, vamos analisar o código! Saca só... temos três classes: Funcionário,
Mensalista e Diarista. Observe que as classes Mensalista e Diarista 'estendem' a
classe Funcionário, i.e., são filhas de Funcionário! Agora vamos analisar cada classe:

A classe Funcionário possui dois construtores: Funcionário( ) e Funcionário(int id,


String nome, double valorBase), além dos métodos getValorBase( ) e calcularSalario(
). Aí você vai me dizer: professor, tem dois construtores? Sim, com mesmo nome e
assinaturas diferentes! Portanto, temos uma: Sobrecarga (Overloading) de
Construtores. Bacana?

Já a classe Mensalista possui um construtor Mensalista(double descontos, int id,


String nome, double valorBase) e um método calcularSalario( ). Opa, perae... esse
método é igual ao método da classe Funcionário, concorda? Mesmo nome e mesma
assinatura! Portanto, temos uma Sobrescrita (ou Override) de métodos.

Por fim, a classe Diarista possui um construtor Diarista(int diasPorSemana, int id,
String nome, double valorBase) e um método calcularSalario( ). De novo, você vai
dizer: professor, esse método também é igual àquele da classe Funcionário e
16712855225

Mensalista. É verdade, portanto temos uma Sobrescrita (ou Override) de métodos.

Agora vamos para o método main! Observe que ele cria uma variável f do tipo
Funcionário. Em seguida, ele cria um objeto Diarista e atribui à variável f. Professor,
pode isso? Sim, eu posso atribuir um objeto de uma classe-filha para uma variável
do tipo da classe-pai - eu não posso é fazer o contrário (pelo menos, sem um
casting). Na linha seguinte, ele diz: s = f.calcularSalario( ).

Chegamos ao ponto crucial! Ele chama o método calcularSalario( ), mas você lembra
que nós temos 3 métodos com esse nome? Temos um na classe-pai e dois nas
classes-filhas, sobrescrevendo o método da classe-pai. E qual desses ele está

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 117 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

chamando? Lembra que na linha anterior ele diz que f recebe o objeto da classe
Diarista? Pois é, portanto, o método calcularSalario( ) é aquele da classe Diarista.
Mais abaixo, ele faz exatamente a mesma coisa, mas atribui o objeto Mensalista() à
variável f, portanto, na segunda vez que ele chama esse método, refere-se ao objeto
da classe Mensalista. Entendido? Agora vamos para os itens:

(a) Encapsulamento? Não, não tem nenhum modificador de acesso aí;

(b) Sobrecarga de Métodos? Não! Lá em cima, há sobrecarga de construtores. Nessa


linha, há sobrescrita de métodos.

(c) Polimorfismo? Perfeito! Nós temos uma sobrescrita de métodos (que é um tipo
de Polimorfismo).

(d) Sobrescrita de Construtores? Não! Lá em cima, há sobrecarga de construtores.


Nessa linha, há sobrescrita de métodos.

(e) Métodos Abstratos? Não, não há nenhum método abstrato nessa questão.

Aí você vai me dizer: Professor, mas um construtor é um tipo de método! Logo, se há


uma sobrecarga de construtores, há uma sobrecarga de métodos! Sim, concordo
contigo! No entanto, temos que lembrar que é uma questão da FCC! Nesse caso, a
terceira opção não apresenta problema algum! Já a segunda opção, pode-se dizer
que não é exatamente sobrecarga de métodos; é algo mais específico, é uma
sobrecarga de construtores. Percebe? Dessa forma, eu recomendo não brigar com
a banca e marcar a opção que não gera dúvidas. Agora... se for bastante técnico
aqui, você está corretíssimo! A questão possui duas respostas e deveria ser anulada.

16712855225

Gabarito: C

(FCC - 2010 - - - Agente Legislativo de Serviços Técnicos e Administrativos


- Processamento de Dados Métodos estáticos em Java são aqueles que:

a) realizam alguma tarefa que é dependente do conteúdo de algum objeto.

b) não podem ser acessados diretamente pelo nome da classe a que pertencem,
mas sim por meio de um objeto da classe.

c) realizam alguma tarefa que não é dependente do conteúdo de algum objeto.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 118 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

d) são acessados por objetos que não necessitam de ser instanciados


explicitamente.

e) existem em subclasses de uma herança.

Comentários:

(a) Não, é estático, logo não depende de objetos; (b) Não, é justamente o inverso;
(c) Perfeito, não depende de objetos! (d) Na verdade, precisam sim ser instanciados
explicitamente; (e) Isso não define um método estático.

Gabarito: C

(FCC - - TCE-AL - Programador NÃO são nomes válidos em Java:

a) _Real e $real
b) um1 e dois2
c) 3tres e tres3
d) Codigo e codigo
e) cod_valor e cod$valor

Comentários:

Deve ser a combinação de uma ou mais letras e dígitos UNICODE-16: Letras: A-Z;
Letras: a-z; Underscore: _ ; Cifrão: $ ;Números: 0-9.

1. Não pode ser uma palavra-reservada (palavra-chave);


2. Não pode ser true, false ou null;
Não pode começar com números; 16712855225

4. Não pode conter espaços em branco ou caracteres de formatação;

Conforme vimos em aula, “tres3” é um nome válido, mas “3tres” não!

Gabarito: C

34. (FCC - 2010 - TCE- - Agente da Fiscalização Financeira - Informática - Suporte


de Web A tecnologia Java é, basicamente, dividida em JSE,

a) JEE e JME.
b) JEE e JPE.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 119 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

c) JDE e JME.
d) JDE e JPE.
e) JEEP e JME.

Comentários:

 Java Standard Edition (Java SE): trata-se de uma ferramenta de desenvolvimento


para a Plataforma Java. Ela contém todo o ambiente necessário para a criação e
execução de aplicações Java, incluindo a Máquina Virtual (JVM), Compilador
(Javac), Bibliotecas (APIs), entre outras ferramentas. Em geral, rodam em
computadores pessoais, notebooks, etc.

 Java Enterprise Edition (Java EE): trata-se do padrão para desenvolvimento de


sistemas corporativos, voltada para aplicações multicamadas, baseadas em
componentes executados em servidores de aplicações – ele inclui o Java SE.
Contém bibliotecas para acesso a base de dados, RPC, CORBA, entre outras. As
aplicações podem ou não estar na internet.

 Java Micro Edition (Java ME): trata-se do padrão aplicado a dispositivos


compactos ou móveis, como smartphones, tablets, controles remotos, etc. Permite
o desenvolvimento de softwares embarcados, i.e., aplicações que rodam em um
dispositivo de propósito específico, desempenhando alguma tarefa útil. Em geral,
possuem limitações de recursos como memória ou processamento.

Conforme vimos em aula, esses são os mais importantes mesmo!

Gabarito: A

(FCC - 2009 - TRT - 16ª REGIÃO (MA) - Técnico Judiciário - Tecnologia da


16712855225

Informação Uma classe Java pode ser instanciada por um comando, cuja sintaxe
é:

a) nome_Objeto nome_Classe = new nome_Objeto();


b) nome_Classe nome_Objeto = new nome_Classe();
c) nome_Classe nome_instancia = new nome_Objeto();
d) nome_Instancia nome_Objeto = new nome_Instancia();
e) nome_Instancia nome_Classe = new nome_Instancia();

Comentários:

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 120 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03
/* 1) Operador NEW é responsável por criar um objeto;
* 2) NomeClasse() é o construtor da Classe NomeClasse;
* 3) NomeObjeto é uma variável do Tipo NomeClasse; */

NomeClasse NomeObjeto = new NomeClasse();

/* Observem que é possível atribuir o objeto de uma


* classe para uma variável de outra classe */

Conforme vimos em aula, trata-se da segunda opção!

Gabarito: B

(FCC - 2005 - TRE-MG - Programador de computador Os erros gerados durante


a execução de um programa Java devem ser controlados com uma estrutura
que pode combinar o uso dos blocos:

a) try e finally, somente.


b) try e catch ou try e finally, somente.
c) try, catch e finally, somente.
d) try e catch, somente.
e) try e catch, try e finally ou try, catch e finally.

Comentários:

try { //Não vem sozinho: try/catch, try/finally ou try/catch/finally

//Código a ser executado


} catch (ClasseDeExceção objDaExceção) { //Não vem sozinho: try/catch ou try/catch/finally

//Tratamento da exceção
} finally { //Não vem sozinho: try/finally ou try/catch/finally.

//Código a ser executado mesmo que uma exceção seja lançada


} 16712855225

Conforme vimos em aula, as combinações possíveis são try/catch, try/finally e


try/catch/finally.

Gabarito: E

ACERTEI ERREI

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 121 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

(FUNCAB - 2010 - PRODAM- - Analista de TI - Desenvolvimento de Sistemas


Seja a seguinte classe Java:

<mod> public class Xpto


{

Qual das alternativas a seguir contém um modificador que ao ser usado na


declaração acima em substituição ao termo <mod> impedirá que a classe Xpto
seja estendida?

a) static
b) const
c) abstract
d) final
e) virtual

Comentários:

//Essa classe não pode ser estendida


final class Carro {...}
16712855225

Conforme vimos em aula, trata-se do Final.

Gabarito: D

(ESAF - 2012 - Receita Federal - Analista Tributário da Receita Federal - Prova 2


- Área Informática Em programação Java, o comando while:

a) executa um bloco exclusivamente de comandos de atribuição.


b) executa um bloco de comandos enquanto sua condição for verdadeira.
c) executa um bloco de comandos até que sua condição seja verdadeira.
d) equivale ao comando what-if.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 122 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

e) é idêntico ao comando do while.

Comentários:

(a) Não, podem ter outros comandos – não é só atribuição; (b) Perfeito, enquanto
for verdadeira, continua a iteração; (c) Não, enquanto ela for verdadeira; (d) Não,
esse comando não existe; (e) Não, esse comando entra no bloco e só depois avalia
a condição.

Gabarito: B

(CONSULPLAN – – Prefeitura de Natal – Analista de Sistemas) Analise as


afirmativas abaixo colocando V para as afirmativas Verdadeiras e F para as Falsas.
A linguagem JAVA se divide nas seguintes edições:

( ) J2SE (Java 2 Standard Edition) - tecnologia Java para computadores pessoais,


notebooks e arquiteturas com poder de processamento e memória
consideráveis.

( ) J2EE (Java 2 Enterprise Edition) - tecnologia Java para aplicações corporativas


que podem estar na internet ou não.

( ) J2ME (Java 2 Micro Edition) - tecnologia Java para dispositivos móveis com
limitações de memória ou processamento.

( ) J2FE (Java 2 Full Edition) - tecnologia Java para aplicações em computadores


de grande porte (mainframe).

A seqüência está correta em: 16712855225

a) F, F, F, F
b) V, V, V, F
c) V, F, F, V
d) F, V, F, V
e) V, V, V, V

Comentários:

 Java Standard Edition (Java SE): trata-se de uma ferramenta de desenvolvimento


para a Plataforma Java. Ela contém todo o ambiente necessário para a criação e

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 123 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

execução de aplicações Java, incluindo a Máquina Virtual (JVM), Compilador


(Javac), Bibliotecas (APIs), entre outras ferramentas. Em geral, rodam em
computadores pessoais, notebooks, etc.

 Java Enterprise Edition (Java EE): trata-se do padrão para desenvolvimento de


sistemas corporativos, voltada para aplicações multicamadas, baseadas em
componentes executados em servidores de aplicações – ele inclui o Java SE.
Contém bibliotecas para acesso a base de dados, RPC, CORBA, entre outras. As
aplicações podem ou não estar na internet.

 Java Micro Edition (Java ME): trata-se do padrão aplicado a dispositivos


compactos ou móveis, como smartphones, tablets, controles remotos, etc. Permite
o desenvolvimento de softwares embarcados, i.e., aplicações que rodam em um
dispositivo de propósito específico, desempenhando alguma tarefa útil. Em geral,
possuem limitações de recursos como memória ou processamento.

Conforme vimos em aula, as três primeiras alternativas estão perfeitas; a última


simplesmente não existe.

Gabarito: B

(Instituto Cidades - 2012 - TCM-GO - Auditor de Controle Externo - Informática


Analise:

I. O Java refere-se tanto a uma linguagem de programação quanto a uma


plataforma;

II. O Java SE (Standard Edition) é formalmente chamado de J2SE;


16712855225

III. O J2EE é a edição corporativa do Java. Esta versão inclui o Java Standard
Edition além de outras tecnologias como javamail, servlets, JSF e Enterprise Java
Beans.

IV. O Java possui uma versão para dispositivos móveis chamada J2ME (Micro
Edition).

São verdadeiras as afirmações:

a) I, II e IV, somente;
b) I, III e IV, somente;

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 124 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

c) II, III e IV, somente;


d) I e IV, somente;
e) Todas as afirmações.

Comentários:

Java é tanto uma plataforma quanto uma linguagem de programação orientada a


objetos que permite o desenvolvimento de aplicações em diversas plataformas
diferentes. Como já foi dito anteriormente, Java está presente desde dispositivos
pequenos (Smartphone, Tablet, etc) a máquinas de grande porte (Servidores,
Mainframes, etc). A linguagem Java possui quatro ambientes de desenvolvimento:

(a) Conforme vimos em aula, é tanto uma linguagem quanto uma plataforma;

 Java Standard Edition (Java SE): trata-se de uma ferramenta de desenvolvimento


para a Plataforma Java. Ela contém todo o ambiente necessário para a criação e
execução de aplicações Java, incluindo a Máquina Virtual (JVM), Compilador
(Javac), Bibliotecas (APIs), entre outras ferramentas. Em geral, rodam em
computadores pessoais, notebooks, etc.

(b) Conforme vimos em aula, é o nome antigo de Java SE;

 Java Enterprise Edition (Java EE): trata-se do padrão para desenvolvimento de


sistemas corporativos, voltada para aplicações multicamadas, baseadas em
componentes executados em servidores de aplicações – ele inclui o Java SE.
Contém bibliotecas para acesso a base de dados, RPC, CORBA, entre outras. As
aplicações podem ou não estar na internet.

(c) Conforme vimos em aula, é exatamente isso;


16712855225

 Java Micro Edition (Java ME): trata-se do padrão aplicado a dispositivos


compactos ou móveis, como smartphones, tablets, controles remotos, etc. Permite
o desenvolvimento de softwares embarcados, i.e., aplicações que rodam em um
dispositivo de propósito específico, desempenhando alguma tarefa útil. Em geral,
possuem limitações de recursos como memória ou processamento.

(d) Conforme vimos em aula, é o Java ME (nome atual).

Gabarito: E

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 125 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

(UFBA - 2012 - UFBA - Técnico de Tecnologia da Informação O código-fonte de


um programa de computador escrito na linguagem Java, é compilado para um
formato intermediário conhecido como bytecode.

Comentários:

Java é também uma linguagem portável e multiplataforma! O Compilador é capaz


de gerar um código intermediário (bytecode), que permite que o mesmo programa
possa ser executado em qualquer máquina ou sistema operacional que possua uma
JVM. Ademais, busca que todos os aspectos da linguagem sejam independentes de
plataforma (Ex: ela especifica o tamanho e comportamento de cada tipo de dado).

Conforme vimos em aula, a questão está perfeita! No entanto, há uma coisa muito
errada nessa questão! O que, professor? Não se separa sujeito do predicado com
vírgula! Jamais... Vacilo, UFBA! ;-)

Gabarito: C

(PaqTcPB - 2012 - UEPB - Técnico em Informática - Programador) Em Java, um


bloco de código é:

a) Tudo que está entre ( )


b) Tudo que está entre { }
c) Tudo que está entre [ ]
d) Tudo que está entre < >
e) Tudo que está no mesmo nível de indentação.

Comentários:
16712855225

Blocos de programação são aglomerados de instruções e declarações que têm escopo


conjunto. Em outras palavras, as variáveis definidas como locais dentro de um bloco
somente serão presentes dentro deste bloco, assim como as instruções ali presentes.
Os blocos de programação são delimitados por chaves { } e podem ser aninhados, já
os comandos sempre são terminados com ponto-e-vírgula.

Conforme vimos em aula, bloco de código vem delimitado por chaves { }.

Gabarito: B

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 126 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

(CESGRANRIO - 2012 - Petrobrás - Técnico de Exploração de Petróleo Júnior -


Informática Ao escrever o código da Classe PortaDeCofre em Java para que ela
atenda a interface Porta, como um programador deve começar a declaração da
classe?

a) public class Porta:PortaDeCofre {


b) public class PortaDeCofre :: Porta {
c) public class PortaDeCofre inherits Porta {
d) public class PortaDeCofre extends Porta {
e) public class PortaDeCofre implements Porta {

Comentários:

A sintaxe para implementar uma Interface utiliza a palavra reservada implements:

public class Teste implements FiguraGeometrica

Conforme vimos em aula, utilizamos a palavra-reservada implements.

Gabarito: E

(PaqTcPB - 2012 - UEPB - Técnico em Informática - Programador Em linguagem


de programação, um identificador é o nome que utilizamos para representar
variáveis, classes, objetos. etc. Em Java, qual dos itens abaixo não é um
identificador válido?

a) falso
b) true
c) maior_valor 16712855225

d) Mp10
e) xBACON

Comentários:

1. Não pode ser uma palavra-reservada (palavra-chave);


Não pode ser true false ou null;
3. Não pode começar com números;
4. Não pode conter espaços em branco ou caracteres de formatação;

Conforme vimos em aula, não se pode utilizar true.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 127 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

Gabarito: B

(ESAF - - - Tecnologia da Informação Com relação a essa


característica, é correto afirmar que:

a) métodos declarados como public em uma superclasse, quando herdados,


precisam ser protected em todas as subclasses dessa classe.

b) métodos declarados como protected em uma superclasse, quando herdados,


precisam ser protected ou public nas subclasses dessa classe.

c) o nível de acesso protected é mais restritivo do que o nível de acesso default.

d) métodos declarados como public só podem ser acessados a partir dos


métodos da própria classe ou de classes derivadas.

e) métodos declarados como default só podem ser acessados a partir dos


métodos da própria classe.

Comentários:

(a) Não, essa afirmação não faz qualquer sentido; (b) Sim, as subclasses nunca
podem ser mais restritivas que as superclasses; (c) Não, default é mais restritivo; (d)
Não, eles podem ser acessados por quaisquer métodos de quaisquer classes ou
pacotes; (e) Não, eles podem ser acessados pela própria classe, pelas subclasses e
pelas classes do mesmo pacote.

16712855225

Gabarito: B

10. (UFBA - – UFBA – Analista de Sistemas) O bloco finally em uma instrução try
catch finally sempre será executado quer ocorra ou não uma exceção no bloco try.

Comentários:

Podemos encadear vários blocos catch, dependendo do número de exceções que


podem ser lançadas por uma classe ou método. O bloco catch obtém o erro criando
uma instância da exceção. Quando uma exceção é lançada e é necessário que
determinada ação seja tomada mesmo após a sua captura, utilizamos a palavra
reservada finally – é opcional, mas se existir, sempre será executado.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 128 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

Conforme vimos em aula, é um bloco opcional. No entanto, caso exista, sempre


será executado – com exceção ou não!

Gabarito: C

11. (CONSULPLAN - 2007 - Chesf - Analista de Sistemas – I É possível utilizar vários


blocos catch para capturar exceções vindas de um único bloco try.

Comentários:

Podemos encadear vários blocos catch, dependendo do número de exceções que


podem ser lançadas por uma classe ou método. O bloco catch obtém o erro criando
uma instância da exceção. Quando uma exceção é lançada e é necessário que
determinada ação seja tomada mesmo após a sua captura, utilizamos a palavra
reservada finally – é opcional, mas se existir, sempre será executado.

Conforme vimos em aula, podemos ter vários blocos catch de um único try.

Gabarito: C

12. (AOCP - 2012 - BRDE - Analista de Sistemas - Desenvolvimento de Sistemas -


Java threads são objetos que podem cooperar e comunicar-se entre si para
compartilhar objetos em memória, a tela, ou outros tipos de recursos e
periféricos.

Comentários:

Quando nós executamos essas tarefas em paralelo, estamos usando Threads! Vocês
16712855225

sabem o que essa palavra significa em português? Fios ou Linhas! Em outras palavras,
criamos linhas de execução de tarefas paralelas em memória – cada linha responsável
por executar alguma coisa simultaneamente e relativamente independentes. Em Java,
as Threads são objetos presentes no Pacote java.lang.

Conforme vimos em aula, realmente são objetos que representam recursos


compartilhados em memória.

Gabarito: C

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 129 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

13. (FGV – 2009 – MEC - Analista de Sistemas – D) Swing é um mecanismo simples


e consistente para estender a funcionalidade de um servidor web e para acessar
existentes sistemas de negócio.

Comentários:

A Plataforma Java oferece recursos para construção de interfaces gráficas de usuário


(GUI), entre eles: AWT (java.awt) e Swing (javax.swing)! O primeiro é um conjunto básico
de classes e interfaces que definem os componentes de uma janela desktop. Já o
Swing é um conjunto sofisticado de classes e interfaces que definem os componentes
visuais necessários para construir uma interface gráfica de usuário.

Conforme vimos em aula, a questão não faz o menor sentido – não tem
absolutamente nada a ver com Swing.

Gabarito: E

14. (ESAF – – CGU - Analista de Sistemas) 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áficos e imagens, é denominado:

a) java.util.
b) java.applet.
c) java.graphic.
d) java.image.
e) java.awt.
16712855225

Comentários:

A Plataforma Java oferece recursos para construção de interfaces gráficas de usuário


(GUI), entre eles: AWT (java.awt) e Swing (javax.swing)! O primeiro é um conjunto básico
de classes e interfaces que definem os componentes de uma janela desktop. Já o
Swing é um conjunto sofisticado de classes e interfaces que definem os componentes
visuais necessários para construir uma interface gráfica de usuário.

Conforme vimos em aula, trata-se do pacote java.awt.

Gabarito: E

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 130 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

15. (FGV – 2015 – PGE/RO – Analista de Sistemas) Na linguagem de programação


Java, para indicar que uma classe A é derivada de B, utiliza-se, na declaração de
A, o modificador:

a) imports;
b) extends;
c) inherits;
d) subclass;
e) superclass.

Comentários:

A palavra-chave extends faz com que uma subclasse herde (receba) todos os atributos
e métodos declarados na classe-pai (desde que ela não seja final), incluindo todas as
classes-pai da classe-pai. A classe-filha pode acessar todos os atributos e métodos
não-privados. Ela herda, mas não acessa (ao menos diretamente) métodos e
atributos privados.

Conforme vimos em aula, trata-se do extends.

Gabarito: B

16. (FGV – 2015 – PGE/RO – Analista de Sistemas) São tipos primitivos na linguagem
de programação Java:

a) int, float, double, char, boolean;


b) int, double, string, char, boolean;
c) integer, real, byte, char, boolean; 16712855225

d) byte, word, short, integer, char;


e) int, real, char, string, boolean.

Comentários:

Vamos falar agora sobre uma das linguagens mais famosas do mundo! Professor, o
que é Java? É uma linguagem de programação orientada a objetos, multiplataforma,
robusta, portável, segura, extensível, concorrente e distribuída. E ela é totalmente
orientada a objetos? Não! Por que não? Porque nem todos os seus tipos de dados são
objetos (possui alguns tipos primitivos: int, float, long, double, char, etc).

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 131 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

Conforme vimos em aula, trata-se do int, float, double, char e boolean.

Gabarito: A

17. (FGV – 2014 – TJ/GO – Analista de Sistemas) Se uma classe na linguagem Java é
declarada com o modificador abstract, então essa classe:

a) não pode ser referenciada;


b) não pode ser estendida;
c) não pode ser instanciada;
d) pode ser instanciada apenas uma vez;
e) não pode possuir métodos estáticos.

Comentários:

Palavras Descrição
abstract Aplicado a um método ou classe indica que a implementação completa deste
método ou classe é efetuada posteriormente, por uma subclasse. Caso seja
uma classe, significa que ela não pode ser instanciada.

Conforme vimos em aula, ela não pode ser instanciada.

Gabarito: C

18. (FGV – 2014 – /GO – Analista de Sistemas) Na linguagem de programação


Java, uma classe declarada com o modificador final:

a) não pode ser instanciada;


b) não pode ser estendida;
16712855225

c) pode ter o modificador abstract também presente na declaração;


d) não pode ter métodos estáticos;
e) não pode ter métodos de instância.

Comentários:

Portanto para declarar uma classe, deve-se colocar a palavra class seguida de um
identificador que irá servir de nome para a classe. O identificador pode ser qualquer
palavra, exceto palavras reservadas. Por exemplo: class Conta introduz a declaração

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 132 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

de uma nova classe chamada Conta. Note que, por convenção, o nome de uma classe
inicia sempre com uma letra maiúscula. A Palavra-Chave é opcional, podendo ser:

//Essa classe pode ser acessada por todos


public class Carro {...}

//Essa classe não pode gerar instâncias


abstract class Carro {...}

//Essa classe não pode ser estendida


final class Carro {...}

Conforme vimos em aula, ela não pode ser instanciada.

Gabarito: B

19. (FGV – 2010 – BADESC – Analista de Sistemas) Observe o código em Java a


seguir, em que se pode verificar a aplicação dos operadores de pré-decremento
e pós-decremento.

public class Decrementa {


public static void main (string args {} )
{
int m, n = 44;
m = --n;
m = n--;
system.out.println (m);
system.out.println (n);
}
}

Após a execução do código, as variáveis m e n exibirão, respectivamente, os


16712855225

valores:

a) 42 e 41.
b) 42 e 42.
c) 42 e 43.
d) 43 e 42.
e) 43 e 43.

Comentários:

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 133 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

Vamos analisar essa questão! O examinador queria saber se o aluno conhecia os


operadores de pré-incremento e os operadores de pós-incremento. Observem que
na linha 5, temos um operador de pré-incremento. Isso significa que a m será
atribuído o valor de n-1, ou seja, 43. Ao final dessa linha, m = n = 43. Na linha 6,
temos um operador de pós-incremento. Isso significa que a m será atribuído o valor
de n, ou seja, 43 e só depois será feita a operação, i.e., m = 43, mas ao final dessa
linha, n = 42. Então, temos m = 43 e n = 42. Agora o engraçado é que nada isso
será executado porque o comando não é system.out, mas System.out, mas a questão
ignorou esse errinho.

Gabarito: D

(FGV – 2015 – TJ/BA – Analista de Sistemas) Em Java, os métodos declarados


sem modificadores em uma interface são implicitamente:

a) públicos e estáticos;
b) públicos e abstratos;
c) privados e estáticos;
d) públicos e finais;
e) privados e abstratos.

Comentários:

Galera, se o método é declarado sem modificador dentro de uma interface, então


ele é implicitamente público e evidentemente abstrato.

Gabarito: B

ACERTEI 16712855225

ERREI

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 134 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

LISTA DE EXERCÍCIOS COMENTADOS (CESPE)


JAVA SE

(CESPE - 2013 - SERPRO - Analista - Desenvolvimento de Sistemas Garbage


Collector é a tecnologia que gerencia a memória alocada para o programa, a
fim de liberar objetos que não estão sendo utilizados.

(CESPE - 2012 - TRE-RJ - Técnico Judiciário - Programação de Sistemas A


linguagem de programação Java é muito utilizada por ter como característica
gerar um código independente de plataforma que pode ser executado em
qualquer arquitetura e sistema operacional que tenha o sistema Java.

(CESPE - 2012 - Banco da Amazônia - Técnico Científico - Análise de Sistemas


No Java, a JRE possui tudo que é necessário para desenvolver programas em
Java.

(CESPE - 201 - Banco da Amazônia - Técnico Científico - Análise de Sistemas


Em Java, para toda classe, método e variável de instância que se declara há um
controle de acesso, independentemente de o controle ser explicitamente
indicado.

(CESPE - 2012 - Banco da Amazônia - Técnico Científico - Análise de Sistemas


O operador instanceof só pode ser usado para testar valores null.

(CESPE - 2012 - MPE-PI - Analista Ministerial - Informática - Cargo 6 Em Java,


qualquer método de uma classe pode ser sobrescrito por métodos de outra
classe. 16712855225

(CESPE - 2011 - -ES - Técnico de Informática - Específicos) O JVM (Java Virtual


Machine) é um interpretador que atribui portabilidade à linguagem Java,
possibilitando, consequentemente, a sua execução em qualquer sistema
operacional.

(CESPE - 2011 - TRE-ES - Técnico - Programação de Sistemas – Específicos O


encapsulamento em Java somente pode ser realizado por meio do modificador
de acesso protegido.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 135 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

(CESPE - 2010 - TRT - 21ª Região (RN) - Técnico Judiciário - Tecnologia da


Informação A linguagem de programação Java, em razão de sua portabilidade
— uma vez que o compilador Java converte o código fonte em bytecodes,
executados por uma máquina virtual — é bastante utilizada para oferecer
conteúdos dinâmicos na Web.

10. (CESPE - 2010 - T -BA - Técnico Judiciário - Programação de Sistemas Em


programação orientada a objetos, o pacote tem como função agrupar classes
dentro de um grupo. Em Java, o pacote Swing (javax.swing) é composto de várias
classes para a implementação de interfaces gráficas em desktop.

11. (CESPE - - ANAC - Analista Administrativo - Tecnologia da Informação


Pelo uso de polimorfismo, uma chamada de método pode fazer que diferentes
ações ocorram, dependendo do tipo do objeto que recebe a chamada.

12. (CESPE - 2010 - EMBAS - Analista de Saneamento - Analista de Tecnologia da


Informação - Desenvolvimento O trecho de código a seguir está incorreto
porque uma variável booleana em Java usa a sintaxe == e não =.

Public void disconnect() {


Connected = false;
}

13. (CESPE - - TRE-MA - Técnico Judiciário - Programação de Sistemas) Para


definição e manipulação de uma exceção em Java, devem constar no programa,
obrigatoriamente, os termos:

a) try e catch.
b) try e finally. 16712855225

c) finally e catch.
d) finally e retry.
e) try e retry.

14. (CESPE - 2009 - TRT - 17ª Região (ES) - Técnico Judiciário - Tecnologia da
Informação Ao contrário dos tipos primitivos que não são objetos, os tipos de
objetos são determinados pela classe de origem.

15. (CESPE - 2009 - TRT - 17ª Região (ES) - Técnico Judiciário - Tecnologia da
Informação Uma classe final indica uma classe que não pode ser estendida. Um
método final não pode ser redefinido em classes derivadas.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 136 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

16. (CESPE - - SERPRO - Analista - Desenvolvimento de Sistemas A linguagem


Java, orientada a objetos, tem como característica ser compilada em um código
executado em máquina virtual.

17. (CESPE - - TRT - 5ª Região (BA) - Técnico Judiciário - Tecnologia da


Informação A instrução import Java.awt.* indica que o programa irá utilizar
componentes gráficos.

18. (CESPE - - TRT - 5ª Região (BA) - Técnico Judiciário - Tecnologia da


Informação Em Java, os métodos public de uma classe são utilizados pelos
clientes da classe para manipular dados armazenados em objetos dessa classe.

19. (CESPE - 2013 - SERPR - Analista - Desenvolvimento de Sistemas) A tecnologia


JSE (Java Small Editon) utilizada pela plataforma iOS permite o desenvolvimento
de aplicações para todos os seus dispositivos, como estações gráficas, iPad, iPod,
entre outros.

(CESPE - 2013 - MPOG - Tecnologia da Informação O JME foi criado para


trabalhar com ambientes de programação multiprocessados em ambientes
distribuídos.

21. (CESPE - 2013 - ANTT - Analista Administrativo - Desenvolvimento de Sistemas


da Informação JSE, JME, JEE e JCE são edições da tecnologia Java voltadas para
o desenvolvimento de aplicações para desktop/servidores, dispositivos móveis,
ambientes corporativos e ambientes em nuvem, respectivamente.

(CESPE - - HEMOBRÁS - Técnico de Informática O Java dá suporte a


programação concorrente (multithreading).
16712855225

(CESPE - - ANAC - Técnico Administrativo - Informática) A linguagem de


programação Java permite operações de bit, como, por exemplo, AND (&) e OR
(|).

24. (CESPE - 2010 - MPU - Técnico de Informática Na linguagem Java, um objeto


do tipo Integer pode receber valor nulo, porém uma variável primitiva int não pode.

(CESPE - 2013 - TRT - 10ª REGIÃO (DF e TO) - Técnico Judiciário - Tecnologia da
Informação É possível indicar que parte de um código em um método pode
gerar uma exceção, por meio da utilização da palavra-chave finally.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 137 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

(CESPE - 2014 - ANATEL - Analista Administrativo - Tecnologia da Informação e


Comunicação) A linguagem Java possui checked exceptions que estendem
java.lang.Exception, em que o compilador força o programador a capturar tais
exceções. Essas exceções devem ser tratadas com um bloco try-catch ou com
um throws.

27. (CESPE – 2004 – STJ - Analista Judiciário - Análise de Sistemas) O Java collections
framework da API Java J2SE possui um conjunto de interfaces e implementações
que define estruturas usadas para manipular coleções de objetos. As interfaces
fundamentais do framework estão associadas à identificação de funcionalidades
típicas de estruturas de dados clássicas. Assim, a interface java.util.List está ligada
a estruturas de listas, a interface java.util.Set está associada a estruturas do tipo
conjuntos e a interface java.util.Map refere-se a estruturas do tipo mapas. Set,
List e Map possuem a interface abstrata java.util.Collection como superinterface.

(CESPE – 2004 – STJ - Analista Judiciário - Análise de Sistemas) As classes


java.util.LinkedList e java.util.ArrayList são implementações para listas
encadeadas e coleções do tipo arranjos com tamanho modificável,
respectivamente, para a interface java.util.List.

(CESPE – – ANCINE – Analista de Sistemas) Os tipos de dados HashSet,


ArrayList e HashMap são classes que implementam os tipos de dados Set, List e
Map, respectivamente.

(CESPE – – SGA/AC – Analista de Sistemas – C ArrayList implementa a


interface List e Collection.

31. (CESPE – 2008 – MPE/RR - Analista de Sistemas) O pacote java.awt contém


16712855225

diversas classes para criar interfaces gráficas de usuário em aplicações Java.

(CESPE – – MPE/RR - Analista de Sistemas) No AWT, um componente é


qualquer classe que possa ser representada em uma tela sem interação com
usuário.

(CESPE – – MPE/RR - Analista de Sistemas) O Swing suporta o


desenvolvimento de interfaces gráficas para usuários (GUI) com o uso da IDE
NetBeans

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 138 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

34. (CESPE – 2011 – MEC - Analista de Sistemas) AWT é um conjunto de


componentes GUI, integrante da arquitetura JEE6, constante no pacote java.awt,
desenvolvidas para substituir as GUIs do SWING.

(CESPE – 2015 – TCU - Analista de Sistemas) No contexto de um código na


linguagem Java, o comando a seguir é utilizado com a finalidade específica de
passar para o campo de visibilidade pública saldo o valor da variável deposito
com o tipo double. public void saldo (double deposito).

(CESPE – 2014 – ANATEL - Analista de Sistemas) No JSE (Java Standard Edition)


versão 8, é possível utilizar recursos inerentes à programação funcional por meio
de uma nova característica da linguagem chamada expressões Lambda, que
permitem o tratamento de funções como argumentos de métodos.

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 139 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

LISTA DE EXERCÍCIOS COMENTADOS (FCC)


JAVA SE

(FCC - 2011 - TRE-RN - Técnico Judiciário - Programação de Sistemas Em relação


ao Java Standard Edition, é INCORRETO afirmar:

a) Possui gerenciamento de memória embutido, por meio do coletor de lixo.

b) Ambiente indicado para o desenvolvimento de aplicativos para dispositivos


móveis ou portáteis.

c) Permite o desenvolvimento de aplicações desktop de linha de comando e


interfaces gráficas Swing.

d) Portabilidade dos programas compilados para diversos sistemas operacionais,


sem necessidade de recompilação.

e) Usa conceitos tais como orientação a objetos e multithreading.

(FCC - 2010 - TRT - 22ª Região (PI) - Técnico Judiciário - Tecnologia da


Informação A plataforma Java disponibiliza um interpretador que traduz, em
tempo de execução, o bytecode para instruções nativas do processador,
permitindo, dessa forma, que uma mesma aplicação seja executada em qualquer
plataforma computacional que possua essa implementação. Trata-se de:

a) Java Virtual Machine.


b) Java API. 16712855225

c) JavaBeans.
d) J2SE.
e) JavaFX.

(FCC - 2010 - Sergipe Gás S.A. - Analista de Sistemas É tida como uma das
principais linguagens de programação orientada a objeto; tem como
característica a compilação para um bytecode e execução por uma máquina
virtual. Trata-se da linguagem:

a) Algol.
b) Delphi.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 140 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

c) C++.
d) Java.
e) PHP.

(FCC - 2010 - TCE- - Agente da Fiscalização Financeira - Informática - Suporte


de Web Os aplicativos Java “rodam” em diferentes ambientes. A tradução dos
códigos Java (bytecode), para instruções específicas de cada sistema e
dispositivo, é uma função do programa:

a) Java Community Process (JCP).


b) Java Virtual Module (JVM).
c) Java Virtual Machine (JVM).
d) Java Comunication Process (JCP).
e) Java Enterprise Machine (JEM).

(FCC - - -SE - Técnico Judiciário - Programação de Sistemas Um objeto


é instanciado em Java por meio do operador:

a) instanceof.
b) extend.
c) new.
d) this.
e) type.

(FCC - 2009 - TRT - 16ª REGIÃO (MA) - Técnico Judiciário - Tecnologia da


Informação Uma classe Java pode ser instanciada por um comando, cuja sintaxe
é:

a) nome_Objeto nome_Classe = new nome_Objeto();


16712855225

b) nome_Classe nome_Objeto = new nome_Classe();


c) nome_Classe nome_instancia = new nome_Objeto();
d) nome_Instancia nome_Objeto = new nome_Instancia();
e) nome_Instancia nome_Classe = new nome_Instancia();

(FCC - 2009 - TRT - 16ª REGIÃO (MA) - Técnico Judiciário - Tecnologia da


Informação A diretiva public é utilizada em Java para aplicar a encapsulação
pública:

a) aos métodos e classes, apenas.


b) aos atributos, métodos e classes.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 141 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

c) às classes, apenas.
d) aos atributos, apenas.
e) aos atributos e classes, apenas.

(FCC - 2008 - TCE-AL - Programador Em Java, para alterar a visibilidade do


elemento em que se aplica, entre outros, utiliza-se o modificador de acesso:

a) static.
b) abstract.
c) protected.
d) volatile.
e) transient.

(FCC - 2007 - MPU - Analista de Informática - Desenvolvimento de Sistemas


Analise os seguintes valores, variáveis e operações usando expressões Java:

byte j = 30;
short k = 54;
int m = 40;
long n = 12L;
long resultado = 0L;
resultado += j;
resultado += k;
resultado /= n;
resultado -= m;

Após a última operação, o resultado será igual a:

a) -7. 16712855225

b) -32.
c) -33.
d) 60.
e) 84.

10. (FCC - - TRE-MG - Técnico Judiciário - Programação de Sistemas Os


métodos Java que não retornam valores devem possuir no parâmetro tipo-de-
retorno a palavra:

a) static.
b) public.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 142 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

c) void.
d) main.
e) string args.

11. (FCC - 2012 - TST - Analista Judiciário - Análise de Sistemas) Considere o


programa abaixo escrito na linguagem Java:

O resultado a ser informado ao usuário após a execução do programa acima é:

a) 0 0 1 0 0 1 0 0 1
b) 0 1 2 0 1 2 0 1 2
c) 0 1 0 1 0 1 0 1 0
d) 1 2 1 2 1 2 1 2 1
e) 0 2 1 0 2 1 0 2 1

12. (FCC - 2012 - E-AP - Analista Ministerial - Tecnologia da Informação Analise


o código das classes a seguir presentes em um mesmo pacote de um projeto
Java:

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 143 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

Com base nos códigos apresentados e nos conceitos da orientação a objetos é


correto afirmar:

a) No método main da classe Start não é possível instanciar objetos das classes
NewClassA e NewClassB, pois essas classes não contêm um construtor válido.

b) Se for digitada a instrução NewClassB c = new NewClassA(); no método main da


classe Start será instanciado um objeto da NewClassA.

c) Se for digitada a instrução NewClassA b = new NewClassB(); no método main da


classe Start ocorrerá um erro, pois não é possível criar um objeto da NewClassA por
meio do construtor da NewClassB.

d) A existência de dois métodos de mesmo nome na NewClassA que recebem a


mesma quantidade de parâmetros indica que está ocorrendo uma sobrescrita de
métodos.

e) Por meio de um objeto da NewClassB será possível acessar os métodos presentes


na NewClassA.

13. (FCC - 2012 - TCE- - Auxiliar de Fiscalização Financeira Em um programa Java,


considere a existência de uma variável do tipo long chamada cod contendo o
valor 1234. Para passar o valor contido nessa variável para uma variável do tipo
byte chamada codNovo, deve-se fazer casting. Para isso, utiliza-se a instrução:
byte codNovo =

a) Byte.valueOf(cod);
b) (long) cod;
c) Byte.pasreByte(cod); 16712855225

d) (byte) cod;
e) (cast) cod;

14. (FCC - 2012 - TRE- - Técnico Judiciário - Programação de Sistemas Para


chamar o método soma da classe Calculo, e mostrar na tela o retorno desse
método, é correto utilizar:

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 144 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

a) Calculo c = new Calculo(); System.out.println (c.soma(10, 20, 30)); ou


System.out.println (Calculo.soma(10, 20));

b) Exclusivamente as instruções Calculo c = new Calculo(); System.out.println


(c.soma(10, 20));

c) Exclusivamente a instrução System.out.println (Calculo.soma(10, 20, 50));

d) Exclusivamente as instruções Calculo c = new Calculo(); double r = c.soma(10,


20); System.out.println(r);

e) Calculo c = Calculo.soma(10,20,30); System.out.println (c); ou


System.out.println (Calculo.soma(10, 20));

15. (FCC - 2012 - TRE- - Técnico Judiciário - Programação de Sistemas Com


relação a herança na programação orientada a objetos com Java, é INCORRETO
afirmar:

a) Uma subclasse herda os métodos da superclasse, entretanto, pode ter seus


próprios métodos.

b) Quando se instancia um objeto da subclasse, podem ser passados valores


para os atributos da superclasse.
16712855225

c) Um objeto da subclasse pode ser um objeto da superclasse.

d) Em uma superclasse, para acessar métodos da subclasse deve ser usada a


instrução super.

e) Para definir que a subclasse herda as características da superclasse utiliza-se


a instrução extends na declaração da subclasse.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 145 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

16. (FCC - 2011 - TRT - 4ª REGIÃO (RS) - Técnico Judiciário - Tecnologia da


Informação No ambiente de programação Java:

a) uma classe abstrata permite apenas métodos abstratos.


b) o corpo de um método abstrato termina com ponto e vírgula e a declaração
é delimitada por chaves.
c) uma interface pode definir tanto métodos abstratos quanto não abstratos.
d) a herança múltipla permite que mais classes sejam estendidas.
e) toda classe é uma subclasse direta ou indireta da classe Object.

17. (FCC - 2010 - TRT - 8ª Região (PA e AP) - Analista Judiciário - Tecnologia da
Informação São tipos primitivos da linguagem Java:

a) int, string, long e real.


b) char, int, real e bit.
c) boolean, double, float e byte.
d) real, short, long e char.
e) string, long int, short int e float.

18. (FCC - 2010 - - - Agente Legislativo de Serviços Técnicos e Administrativos


- Processamento de Dados Os tipos de dados primitivos em Java são:

a) char, boolean, byte, short, int, long, float e double.


b) char, boolean, byte, short, int, long, float, double e String.
c) byte, short, int, long, float e double.
d) byte, short, int, long, float, double, String e Date.
e) char, boolean, byte, short, int, long, float, double, String e Date.

19. (FCC - 2009 - TRT - 15ª Região - Analista Judiciário - Tecnologia da Informação
16712855225

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.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 146 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

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.

(FCC - 2008 - TCE-AL - Programador Os três elementos básicos quando


contidos num arquivo fonte Java devem obrigatoriamente se apresentar na
seguinte ordem:

a) import, package e class.


b) class, package e import.
c) class, import e package.
d) package, class e import.
e) package, import e class.

21. (FCC - 2014 – TRF/3 – Analista de Sistemas Considere a classe escrita em Java:

16712855225

O valor que será impresso na execução do método main é:

a) 6.0
b) 7
c) 8.0

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 147 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

d) 5.0
e) 12.5

(FCC - - TCE-AL - Programador Considerando que as variáveis Java X, Y e


Z foram todas inicializadas com zero, os resultados das mesmas após as
alterações realizadas pelas atribuições X *= 2, Y -= 5 e Z /=3, respectivamente,
serão:

a) 0, -5 e 0
b) 0, 5 e 0
c) 1, -5 e 3
d) 2, -5 e 3
e) 2, 5 e 3

(FCC - 2008 - MPE-RS - Técnico em Informática - Área Sistemas A função Java:

public boolean VerificarCPF (string CPF);

representa um exemplo do conceito de:

a) override.
b) overload.
c) herança.
d) encapsulamento.
e) polimorfismo.

24. (FCC - 2007 - MPU - Analista de Informática - Desenvolvimento de Sistemas


Quanto às variáveis Java, um inteiro de 64 bits em notação de complemento de
dois que pode assumir valores entre -263 e 263 -1 é:
16712855225

a) long.
b) short.
c) float.
d) byte.
e) double.

(FCC - 2005 - TRE-MG - Técnico Judiciário - Programação de Sistemas A


seqüência de etapas para implementação de um programa Java é:

a) interpretação, codificação, execução e compilação.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 148 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

b) codificação, interpretação, compilação e execução.


c) interpretação, codificação, compilação e execução.
d) codificação, compilação, interpretação e execução.
e) compilação, codificação, execução e interpretação.

(FCC - 2012 - TRE- - Técnico Judiciário - Programação de Sistemas Considere


a variável idade declarada no método main de uma classe Java, com a seguinte
instrução:

int idade=12;

Analise:

I. System.out.println (idade<18?"Menor de idade":"Maior de idade");

II. if(idade<18) {System.out.println("Menor de idade");} else


{System.out.println("Maior de idade");}

III. if(idade<18) {System.out.println("Menor de idade");} else if (idade>=18)


{System.out.println("Maior de idade");}

IV. switch(idade) {case<18: System.out.println("Menor de idade"); break;


case>=18: System.out.println("Maior de idade");}

Contém uma instrução correta que exibirá na tela a frase "Menor de idade":

a) I, II, III e IV.


b) I, II e III, apenas.
c) II e III, apenas. 16712855225

d) II, apenas.
e) I e III, apenas.

27. (FCC - 2012 - TRE- - Técnico Judiciário - Programação de Sistemas) Considere


a estrutura de repetição seguinte:

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 149 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

A saída na tela será:

a) 15 e 6.
b) 1 e 5.
c) 0 e 1.
d) 6 e 9.
e) 9 e 7.

(FCC - 2011 - TRE-AP - Técnico Judiciário - Programação de Sistemas Em relação


à plataforma de desenvolvimento JSE, considere:

I. Possibilita o desenvolvimento de aplicações desktop através de linha de


comando e através da interface gráfica Swing.
II. É multiplataforma: permite a portabilidade dos programas compilados para
diversos sistemas operacionais, sem necessidade de alteração do código ou de
recompilação.
III. Faz uso explícito de ponteiros e usa conceitos modernos, tais como,
orientação a objetos e suporte a multithreading.
IV. Possui o gerenciamento de memória embutido, por meio do garbage
collector.
16712855225

Está correto o que se afirmar em:

a) I, II e III, somente.
b) I, II e IV, somente.
c) I, III e IV, somente.
d) II, III e IV, somente.
e) I, II, III e IV.

(FCC - 2011 - INFRAERO - Analista de Sistemas - Desenvolvimento e


Manutenção No Java, um tipo inteiro (int) utiliza quatro bytes para

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 150 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

armazenamento. A faixa máxima possível de valores inteiros para se armazenar


em uma variável do tipo primitivo int é de:

a) -8388608 a 8388607.
b) -128 a 127.
c) -32768 a 32767.
d) -9223372036854775808 a 9223372036854775807.
e) -2147483648 a 2147483647.

(FCC - 2010 - TRT - 9ª REGIÃO (PR) - Técnico Judiciário - Tecnologia da


Informação O JVM mais o núcleo de classes da plataforma Java e os arquivos
de suporte formam o:

a) o J2EE.
b) o JDK.
c) o JRE.
d) uma JSP.
e) uma API.

31. (FCC - 2014 - TRT - 16ª REGIÃO (MA) - Analista Judiciário - Tecnologia da
Informação Considere as classes a seguir, presentes em uma aplicação Java
orientada a objetos:

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 151 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

16712855225

Em uma classe principal foram digitadas, no interior do método main, as


seguintes linhas:

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 152 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

As linhas que contêm a instrução s = f.calcularSalario( ); demonstram um


conceito da orientação a objetos conhecido como:

a) encapsulamento.
b) sobrecarga de métodos.
c) polimorfismo.
d) sobrescrita de construtores.
e) métodos abstratos.

(FCC - 2010 - - - Agente Legislativo de Serviços Técnicos e Administrativos


- Processamento de Dados Métodos estáticos em Java são aqueles que:

a) realizam alguma tarefa que é dependente do conteúdo de algum objeto.

b) não podem ser acessados diretamente pelo nome da classe a que pertencem,
mas sim por meio de um objeto da classe.

c) realizam alguma tarefa que não é dependente do conteúdo de algum objeto.

d) são acessados por objetos que não necessitam de ser instanciados


explicitamente.

e) existem em subclasses de uma herança.

(FCC - - TCE-AL - Programador NÃO são nomes válidos em Java:

a) _Real e $real
b) um1 e dois2
c) 3tres e tres3 16712855225

d) Codigo e codigo
e) cod_valor e cod$valor

34. (FCC - 2010 - TCE- - Agente da Fiscalização Financeira - Informática - Suporte


de Web A tecnologia Java é, basicamente, dividida em JSE,

a) JEE e JME.
b) JEE e JPE.
c) JDE e JME.
d) JDE e JPE.
e) JEEP e JME.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 153 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

(FCC - 2009 - TRT - 16ª REGIÃO (MA) - Técnico Judiciário - Tecnologia da


Informação Uma classe Java pode ser instanciada por um comando, cuja sintaxe
é:

a) nome_Objeto nome_Classe = new nome_Objeto();


b) nome_Classe nome_Objeto = new nome_Classe();
c) nome_Classe nome_instancia = new nome_Objeto();
d) nome_Instancia nome_Objeto = new nome_Instancia();
e) nome_Instancia nome_Classe = new nome_Instancia();

(FCC - - TRE-MG - Programador de computador) Os erros gerados


durante a execução de um programa Java devem ser controlados com uma
estrutura que pode combinar o uso dos blocos:

a) try e finally, somente.


b) try e catch ou try e finally, somente.
c) try, catch e finally, somente.
d) try e catch, somente.
e) try e catch, try e finally ou try, catch e finally.

16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 154 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

LISTA DE EXERCÍCIOS COMENTADOS (DIVERSAS BANCAS)


JAVA SE

(FUNCAB - 2010 - PRODAM- - Analista de TI - Desenvolvimento de Sistemas


Seja a seguinte classe Java:

<mod> public class Xpto


{

Qual das alternativas a seguir contém um modificador que ao ser usado na


declaração acima em substituição ao termo <mod> impedirá que a classe Xpto seja
estendida?

a) static
b) const
c) abstract
d) final
e) virtual

(ESAF - 2012 - Receita Federal - Analista Tributário da Receita Federal - Prova 2


- Área Informática Em programação Java, o comando while:

a) executa um bloco exclusivamente de comandos de atribuição.


b) executa um bloco de comandos enquanto sua condição for verdadeira.
c) executa um bloco de comandos até que sua condição seja verdadeira.
16712855225

d) equivale ao comando what-if.


e) é idêntico ao comando do while.

(CONSULPLAN – – Prefeitura de Natal – Analista de Sistemas) Analise as


afirmativas abaixo colocando V para as afirmativas Verdadeiras e F para as Falsas.
A linguagem JAVA se divide nas seguintes edições:

( ) J2SE (Java 2 Standard Edition) - tecnologia Java para computadores pessoais,


notebooks e arquiteturas com poder de processamento e memória
consideráveis.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 155 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

( ) J2EE (Java 2 Enterprise Edition) - tecnologia Java para aplicações corporativas


que podem estar na internet ou não.

( ) J2ME (Java 2 Micro Edition) - tecnologia Java para dispositivos móveis com
limitações de memória ou processamento.

( ) J2FE (Java 2 Full Edition) - tecnologia Java para aplicações em computadores


de grande porte (mainframe).

A seqüência está correta em:

a) F, F, F, F
b) V, V, V, F
c) V, F, F, V
d) F, V, F, V
e) V, V, V, V

(Instituto Cidades - 2012 - TCM-GO - Auditor de Controle Externo - Informática


Analise:

I. O Java refere-se tanto a uma linguagem de programação quanto a uma


plataforma;

II. O Java SE (Standard Edition) é formalmente chamado de J2SE;

III. O J2EE é a edição corporativa do Java. Esta versão inclui o Java Standard
Edition além de outras tecnologias como javamail, servlets, JSF e Enterprise Java
Beans.
16712855225

IV. O Java possui uma versão para dispositivos móveis chamada J2ME (Micro
Edition).

São verdadeiras as afirmações:

a) I, II e IV, somente;
b) I, III e IV, somente;
c) II, III e IV, somente;
d) I e IV, somente;
e) Todas as afirmações.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 156 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

(UFBA - 2012 - UFBA - Técnico de Tecnologia da Informação O código-fonte de


um programa de computador escrito na linguagem Java, é compilado para um
formato intermediário conhecido como bytecode.

(PaqTcPB - 2012 - UEPB - Técnico em Informática - Programador) Em Java, um


bloco de código é:

a) Tudo que está entre ( )


b) Tudo que está entre { }
c) Tudo que está entre [ ]
d) Tudo que está entre < >
e) Tudo que está no mesmo nível de indentação.

(CESGRANRIO - 2012 - Petrobrás - Técnico de Exploração de Petróleo Júnior -


Informática Ao escrever o código da Classe PortaDeCofre em Java para que ela
atenda a interface Porta, como um programador deve começar a declaração da
classe?

a) public class Porta:PortaDeCofre {


b) public class PortaDeCofre :: Porta {
c) public class PortaDeCofre inherits Porta {
d) public class PortaDeCofre extends Porta {
e) public class PortaDeCofre implements Porta {

(PaqTcPB - 2012 - UEPB - Técnico em Informática - Programador Em linguagem


de programação, um identificador é o nome que utilizamos para representar
variáveis, classes, objetos. etc. Em Java, qual dos itens abaixo não é um
identificador válido?
16712855225

a) falso
b) true
c) maior_valor
d) Mp10
e) xBACON

(ESAF - - - Tecnologia da Informação Com relação a essa


característica, é correto afirmar que:

a) métodos declarados como public em uma superclasse, quando herdados,


precisam ser protected em todas as subclasses dessa classe.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 157 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

b) métodos declarados como protected em uma superclasse, quando herdados,


precisam ser protected ou public nas subclasses dessa classe.

c) o nível de acesso protected é mais restritivo do que o nível de acesso default.

d) métodos declarados como public só podem ser acessados a partir dos


métodos da própria classe ou de classes derivadas.

e) métodos declarados como default só podem ser acessados a partir dos


métodos da própria classe.

10. (UFBA - – UFBA – Analista de Sistemas) O bloco finally em uma instrução try
catch finally sempre será executado quer ocorra ou não uma exceção no bloco try.

11. (CONSULPLAN - 2007 - Chesf - Analista de Sistemas – I É possível utilizar vários


blocos catch para capturar exceções vindas de um único bloco try.

12. (AOCP - 2012 - BRDE - Analista de Sistemas - Desenvolvimento de Sistemas - III)


Java threads são objetos que podem cooperar e comunicar-se entre si para
compartilhar objetos em memória, a tela, ou outros tipos de recursos e
periféricos.

13. (FGV – 2009 – MEC - Analista de Sistemas – D) Swing é um mecanismo simples


e consistente para estender a funcionalidade de um servidor web e para acessar
existentes sistemas de negócio.

14. (ESAF – – CGU - Analista de Sistemas) A linguagem Java possui uma API
(Application Program Interface) que disponibiliza pacotes e classes com diversas
16712855225

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áficos e imagens, é denominado:

a) java.util.
b) java.applet.
c) java.graphic.
d) java.image.
e) java.awt.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 158 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

15. (FGV – 2015 – PGE/RO – Analista de Sistemas) Na linguagem de programação


Java, para indicar que uma classe A é derivada de B, utiliza-se, na declaração de
A, o modificador:

a) imports;
b) extends;
c) inherits;
d) subclass;
e) superclass.

16. (FGV – 2015 – PGE/RO – Analista de Sistemas) São tipos primitivos na linguagem
de programação Java:

a) int, float, double, char, boolean;


b) int, double, string, char, boolean;
c) integer, real, byte, char, boolean;
d) byte, word, short, integer, char;
e) int, real, char, string, boolean.

17. (FGV – 2014 – TJ/GO – Analista de Sistemas) Se uma classe na linguagem Java é
declarada com o modificador abstract, então essa classe:

a) não pode ser referenciada;


b) não pode ser estendida;
c) não pode ser instanciada;
d) pode ser instanciada apenas uma vez;
e) não pode possuir métodos estáticos.

18. (FGV – 2014 – TJ/GO – Analista de Sistemas) Na linguagem de programação


16712855225

Java, uma classe declarada com o modificador final:

a) não pode ser instanciada;


b) não pode ser estendida;
c) pode ter o modificador abstract também presente na declaração;
d) não pode ter métodos estáticos;
e) não pode ter métodos de instância.

19. (FGV – 2010 – BADESC – Analista de Sistemas) Observe o código em Java a


seguir, em que se pode verificar a aplicação dos operadores de pré-decremento
e pós-decremento.

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 159 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

public class Decrementa {


public static void main (string args {} )
{
int m, n = 44;
m = --n;
m = n--;
system.out.println (m);
system.out.println (n);
}
}

Após a execução do código, as variáveis m e n exibirão, respectivamente, os


valores:

a) 42 e 41.
b) 42 e 42.
c) 42 e 43.
d) 43 e 42.
e) 43 e 43.

GV – 2015 – TJ/BA – Analista de Sistemas) Em Java, os métodos declarados


sem modificadores em uma interface são implicitamente:

a) públicos e estáticos;
b) públicos e abstratos;
c) privados e estáticos;
d) públicos e finais;
e) privados e abstratos.
16712855225

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 160 de 161


Curso Regular de Desenvolvimento de Software
Curso de Teoria e Exercícios - 2016
Prof. Diego Carvalho – Aula 03

GABARITO DOS EXERCÍCIOS COMENTADOS (CESPE)


JAVA SE

1 2 3 4 5 6 7 8 9 10
C C E C E E C E C C
11 12 13 14 15 16 17 18 19 20
C E A C C C C C E E
21 22 23 24 25 26 27 28 29 30
E C C C E C E C C E
31 32 33 34 35 36 37 38 39 40
C E C E E C

GABARITO DOS EXERCÍCIOS COMENTADOS (FCC)


JAVA SE

1 2 3 4 5 6 7 8 9 10
B A D C C B B C C C
11 12 13 14 15 16 17 18 19 20
E E D A D E C A E E
21 22 23 24 25 26 27 28 29 30
C A D A D B D B E C
31 32 33 34 35 36 37 38 39 40
C C C A B E

16712855225

GABARITO DOS EXERCÍCIOS COMENTADOS (DIVERSAS)


JAVA SE

1 2 3 4 5 6 7 8 9 10
D B B E C B E B B C
11 12 13 14 15 16 17 18 19 20
C C E E B A C B D B

Prof. Diego Carvalho www.estrategiaconcursos.com.br Pág. 161 de 161

Você também pode gostar