Você está na página 1de 10

1. Sim ou Não?

O código abaixo compila e roda sem


problemas? int[][] a = new int[10][10]; for(int[] is : a)
{ for(int i : is){ System.out.println(i); } }
Sim
Não

Explicação sobre a resposta


Um novo tipo de for foi adicionado ao java 5.0, o 'enhanced for'. Com ele, os programadores não
precisam mais depender de índices para percorrer um array ou uma 'Collection'. No caso do
exercício temos um array multidimensional. No primeiro 'enhanced for' percorre uma array de array,
e, no segundo for, ele percorre por todos os elementos da array passada.

2. Qual é o resultado de compilar e executar o código


abaixo? public class Carro { public static void
main(String[] a) { new Carro().anda(); } public static void
anda() { System.out.println("andando...."); para(); }
public void para(){ System.out.println("parando...."); } }
O código não compila. O construtor Carro() não foi definido.
O código não compila. Não podemos chamar métodos estáticos em instâncias de objetos.
O código não compila. Métodos estáticos não devem chamar métodos não estáticos.
O código roda e imprime "andando...." "parando...."

Explicação sobre a resposta


Um método estático só pode chamar diretamente outros métodos estáticos ou variáveis estáticas.

3. Qual o resultado ao tentar compilar e rodar este


programa? public class Fors{ static int i; public static void
main(String args[]){ for(i=0;i<3;i++)
{ System.out.print(i); } for(int i=2; i<3;i++)
{ System.out.print(i); } int i; for(i=0;i<2;i++)
{ System.out.print(i); } System.out.print(Fors.i); } }
Imprime: 0122010
Imprime: 0122012
Imprime: 0122013
Erro de compilação no primeiro for
Erro de compilação no segundo for
Erro de compilação no terceiro for
Erro de tempo de execução
Nenhum dos anteriores
Explicação sobre a resposta
Não existe motivo para ocorrer um erro de compilação, portanto podemos simular a execução do
programa. O primeiro for inicializa a variável estática i com 0 e roda enquanto i for menor que 3,
isto é: imprime i de 0 até 2, sai quando i for 3. O i estático fica então valendo 3. Já o segunda for
declara uma nova variável i e só será executada para o valor 2. Portanto imprime o valor 2. O
terceiro for utiliza uma outra variável i interna ao método para imprimir 0 e 1. A variável interna ao
método fica com valor final 2. Por fim, o valor da variável estática i é impresso (3). Portanto a saída
é: 0122013.

4. Considere o código abaixo, com cada classe escrita em


arquivos separados chamados Pai.java, Filho.java e
Teste.java respectivamente: class Pai { Pai()
{ System.out.println("Pai"); } Pai(int valor)
{ System.out.println("Pai int: " + valor); } } class Filho
extends Pai { Filho() { System.out.println("Filho"); }
Filho(int valor) { super(valor); this(); } } public class Teste
{ public static void main(String[] args) { Pai p = new Pai();
Filho primeiro = new Filho(); } } Quais das seguintes
afirmações são verdadeiras?
O código não compila.
O código compila, imprime "Pai", "Filho" e depois para com um erro de execução.
O código compila e roda, imprimindo "Pai", "Filho" e por último "Pai".
O código compila e roda, imprimindo "Pai" e por último "Filho".
O código compila e roda, imprimindo "Pai", "Pai" e por último "Filho".

Explicação sobre a resposta


Todo construtor que não invoca this() ou super() possui por padrão uma invocação a super() sem
argumentos. No caso de chamar explicitamente this() ou super(), esta deve ser a primeira linha do
construtor, portanto um construtor só pode chamar explicitamente this() ou super(), mas não os dois
ao mesmo tempo. O resultado é que a classe Filho não compila. categoria: declaration and access
control
5. Qual a saída do programa a seguir ao executá-lo? class
NormalException extends Exception{} class
EspecialException extends RuntimeException{} public
class G{ public void metodo() throws
NormalException{ throw new NormalException(); } public
static void main(String args[]){ int a,b,c,d; a=b=c=d=0;
try{ new G().metodo(); a++; }catch(NormalException e)
{ b++; }catch(EspecialException e){ c++; }finally{ d++; }
System.out.println(a+","+b+","+c+","+d); } }
O programa não compila.
Saída: 1,0,0,1
Sáida: 1,1,0,1
Saída: 0,1,0,0
Saída: 1,1,1,1
Saída: 0,1,0,1

Explicação sobre a resposta


Uma vez que o método main cria um objeto de classe G e chama seu método 'metodo', esta
chamada joga uma exception do tipo NormalException. Portanto, o código a++ não será executado,
e sim o b++. Após executar o código do bloco catch corresppondente, o bloco finally será
executado, somando um à variável d. Lembre-se que um bloco finally é sempre executado não
importanto se uma exceção for lançada ou não.

6. O que podemos dizer sobre o código abaixo? class


ClasseMae{ protected void meuMetodo(){ } } class Outra
extends ClasseMae{ public void meuMetodo() throws
SQLException{ } }
O código compila.
O código não compila: não podemos reescrever um método protected como public.
O código não compila: o método 'meuMetodo' na classe 'Outra' não lança nunca SQLException,
então não se pode declarar que ele lança SQLException.
O código não compila: não podemos reescrever um método que não lança exceções do tipo
checked com um que lança exceções do tipo checked.

Explicação sobre a resposta


É necessário estar bem acostumado com as regras de reescrita (override) de métodos. Quando você
reescreve um método, sempre pode aumentar sua visibilidade, o que não poderia era reescrever um
método public como protected. Sobre que exceções um método reescrito pode lançar: apenas as
mesmas exceções ou menos que as declaradas pelo método na superclasse onde foi escrita pela
última vez. Isso só vale para checked exceptions. Se as exceções adicionais forem
RuntimeExceptions ou Errors, essas pode m ser declaradas mesmo que não tenham sido declaradas
no método da superclasse. Essas duas classes estão quebrando essa última regra: SQLException não
está sendo declarada no throws da classe ClasseMae.
7. O que acontece ao compilar e executar o programa a
seguir? public class Fundamentos{ public static void
main(String args[]){ int i; while(i<10){ i++;
System.out.println(i); } } }
O programa não compila.
O programa imprime de 0 a 9.
O programa imprime de 0 a 10
O programa imprime de 1 a 9
O programa imprime de 1 a 10

Explicação sobre a resposta


Variáveis locais (variáveis declaradas dentro de métodos, também conhecidas como variáveis
temporárias ou de pilha) não são inicializadas automaticamente. Você precisa sempre inicializar
essa variáveis antes de utilizar seus valores. Esse programa não compila, pois a variáveis antes de
utilizar seus valores. Esse programa não compila, pois a variável i não foi inicializada e estamos
usando-a no while.

8. Considere o código abaixo: for (int i = 0; i < 3; i++) { for


(int j = 1; j < 3; j++) { if (i % j == 0) { continue; } else
{ System.out.println("i = " + i + ", j = " + j); } } } Qual
dessas linhas será mostrada na tela?
i = 0, j = 1
i = 0, j = 2
i = 1, j = 1
i = 1, j = 2
i = 2, j = 1
i = 2, j = 2

Explicação sobre a resposta


Os valores de 'i' vão variar de 0 até 2 e os de 'j' vão variar de 1 até dois. Sempre que i valor 0 ou 2 a
condição i%j==0 será verdade, e quando 'i' valer 1 e 'j' também valer 1 a condição i%j==0 também
será verdade, restando apenas a impressão de i valendo 1 e j valendo 2

9. Qual resposta é verdadeira em relação ao código


abaixo? class Tipo { Tipo(String texto)
{ this(Integer.parseInt(texto)); System.out.println("Texto:
" + texto); } Tipo(int valor) { this("" + valor);
System.out.println("Valor " + valor); } } public class Teste
{ public static void main(String args[]) { Tipo tipo = new
Tipo("15"); } }
O código compila e roda indefinitivamente, sem imprimir nada.
O código compila e roda, imprimindo "Texto: 15" uma única vez e termina.
O código compila e roda indefinitivamente, revezando a impressão entre "Texto: 15" e "Valor:
15".
O código não compila pois detecta o loop.

Explicação sobre a resposta


Nem sempre o compilador detecta problemas de loops entre construtores. Portanto, deve-se
considerar que o código compila e roda indefinidamente, até ocorrer um erro do tipo
StackOverflowError.

10. Quais das seguintes afirmações sobre o código abaixo


são verdadeiras? public class Controle { public
Controle(String s) { } private Controle(int i) { } protected
Controle(double d) { } Controle(Controle principal) { } }
O código compila sem problemas
O construtor que recebe uma variável do tipo Controle não pode ser chamado por classes top-
level de outro pacote
Uma classe não pode ter mais de um construtor portanto o código não compila
Não existem construtores privados portanto o código não compila
O construtor que recebe uma variável do tipo Controle é chamado de destrutor
Construtores de classes públicas devem ser públicos portanto o código não compila

Explicação sobre a resposta


Um construtor pode ter os quatro tipos de modificadores de acesso; não existe um construtor
especial do tipo de destruição, somente o método finalize; membros sem modificadores de uma
classe só podem ser acessado sno mesmo pacote, portanto não podem ser acessados por outros
pacotes. categoria: constructors e subclassing

11. Qual resposta é verdadeira em relação ao código


abaixo? class Pai { public Pai()
{ System.out.println("Construtor do pai"); } } class Filho
extends Pai { Filho() { System.out.println("Construtor do
filho"); super(); } } public class Teste { public static void
main(String[] args) { Filho filho = new Filho(); } }
O código não compila.
O código compila e roda, imprimindo primeiro o "Construtor do pai" e depois o "Construtor do
filho"
O código compila e roda, imprimindo somente "Construtor do filho"
O código compila e roda, imprimindo primeiro o "Costrutor do filho" e depois o "Construtor do
pai"

Explicação sobre a resposta


A palavra chave super que invoca o construtor do pai explicitamente deve ser a primeira instrução
de um construtor, portanto o código da classe Filho não compila. categoria: declarações e controle
de acesso

12. Observe o código abaixo: class A{ void metodo(int a)


{} } class B extends A{ } Qual dos códigos abaixo pode ser
adicionado na linha 06?
private void metodo(int a){}
public int metodo(int a){return a}
public void metodo(int a){}
public void metodo(float a){}
void metodo(int b){}

Explicação sobre a resposta


A primeira resposta não pode ser pois você não pode reduzir a visibilidade de uma método
sobrescrito. A segunda resposta não pode ser pois o tipo de retorno só pode ser diferente no Java 5.0
caso o novo retorno estenda o retorno da classe mãe (retorno de tipo covariante). A terceira resposta
apenas aumenta a visibilidade do método, sem maiores problemas. A quarta resposta não caracteriza
sobrescrita de método e sim sobrecarga, pois muda os parâmetros recebidos. E a quinta resposta
apenas muda o nome do parâmetro e não o seu tipo, por isso também não há problemas.

13. Considere o código abaixo: int i=1,j=1; externo: for (i =


1; i <= 5; i++) { for (j = 1; j <= 5; j++) { if (i+j==5) { break
externo; } } } System.out.println(i+j); Qual será o
resultado apresentado na tela?
10
8
12
6
5
4

Explicação sobre a resposta


O break aprensentado se refere ao for com o label 'externo', ou seja quando ele for executado, não
parará o for mais interno como normalmente ocorre, mas sim aquele indicado pelo break, ou seja o
'externo'. A condição de parada do for é que i mais j seja igual a cinco. i varia de 1 até 5 e j também,
ou seja no primeiro laço, i vai valer i e j vai variar de 1 até cinco. Quando j valer 4 a condição de
parada será verdadeira, causando a parada do for 'externo', partindo para a próxima instrução que é
mostrar na tela a soma de i com j.

14. Considere o seguinte código: public class Teste{ public


static void main(){ System.out.println("teste"); } } O que
podemos dizer sobre ele?
O programa não compila.
O programa compila, mas dá erro de execução.
O programa compila, executa e imprime "teste".

Explicação sobre a resposta


Este programa compila perfeitamente. Mas no momento de tentar executar a classe Teste, a virtual
machine tenta procurar um método main estático, que seja público, retorne void, e receba como
parâmetro uma array de Strings. Ela não vai encontrar esse método, pois o main acima não recebe
uma array de Strings como parâmetro. Ou seja, o programa não executa, lançando uma exceção.

15. O que acontece ao compilar e rodar o código abaixo?


public class Teste { public static void main(String [] args)
{ int array[] = new int[]{ 1, 2, 3, 4}; for(int i = 1; i <
array.length; i++) { System.out.println("Posicao " + i + "
com valor " + array[i]); } } }
O código não compila
O código compila mas ao rodar acontece uma ArrayIndexOutOfBoundsException.
O código compila e roda, imprimindo Posicao 1 com valor 1 Posicao 2 com valor 2 Posicao 3
com valor 3 Posicao 4 com valor 4
O código compila e roda, imprimindo Posicao 0 com valor Posicao 1 com valor 1 Posicao 2 com
valor 2 Posicao 3 com valor 3
O código compila e roda, imprimindo Posicao 0 com valor 1 Posicao 1 com valor 2 Posicao 2
com valor 3 Posicao 3 com valor 4
O código compila e roda, imprimindo Posicao 1 com valor 2 Posicao 2 com valor 3 Posicao 3
com valor 4
O código compila e roda, imprimindo Posicao 1 com valor 1 Posicao 2 com valor 2 Posicao 3
com valor 3

Explicação sobre a resposta


O programa compila e roda. É importante lembrar que a array começa com o índice 0, portanto,
começando na segunda posição, para o índice 1 ele imprime 2, para 2 imprime 3 e para 3 imprime
4.

16. Quais das maneiras abaixo são declarações e


inicializações válidas para uma array?
int[] array = new int[10];
int array[] = new int[10];
int[] array = new int[];
int array[] = new int[];
int[] array = new int[2]{1, 2};
int[] array = new int[]{1, 2};
int[] array = int[10];
int[] array = new int[1, 2, 3];
int array[] = new int[1, 2, 3];
Explicação sobre a resposta
Os colchetes na declaração de um array podem vir antes ou depois do nome da variável. Já na hora
de inicializar uma array você deve dizer o tamanho dela OU os elementos que ela possui. Você não
pode definir as duas coisas, ou uma, ou outra.

17. Que situação o código abaixo indica? class


Carro{ String cor = "branco"; void mudaCor(String cor)
{ this.cor = cor; } } class Pessoa{ final Carro carro = new
Carro(); void mudaCorDoCarro(String cor)
{ carro.mudaCor(cor); } }
Que uma pessoa pode trocar de carro, mas um carro não pode trocar de cor.
Que uma pessoa não pode trocar de carro e não pode trocar a cor do carro.
Que uma pessoa pode trocar de carro e pode trocar a cor do carro.
Que uma pessoa não pode trocar de carro, mas pode trocar a cor do carro.

Explicação sobre a resposta


Apenas a referência para o objeto carro é final, ou seja você só pode mexer nos atributos do carro,
desde que você não troque a referência para o carro.

18. O que acontece ao tentarmos compilar e rodar o


programa Teste? abstract class Animal{ } class Mamifero
extends Animal{ } class Anfibio extends Animal{ } public
class Teste{ public static void main(String[] args){ Animal
animal = new Mamifero(); Anfibio anfibio = (Anfibio)
animal; } }
O programa não compila, erro na linha Animal animal = new Mamifero();
O programa não compila, erro na linha Anfibio anfibio = (Anfibio) animal;
O programa compila, mas lança exception na linha Animal animal = new Mamifero();
O programa compila, mas lança exception na linha Anfibio anfibio = (Anfibio) animal;
O programa compila e roda normalmente, sem lançar exceptions.

Explicação sobre a resposta


Como Mamifero estende Animal, podemos referenciar um mamifero como uma animal. Essa linha
compila e também roda sem problemas. Quando tentamos atribuir um animal para uma referência
de um anfibio, isso nem sempre é verdade, isto é, nem todo animal é um anfibio, O que nos força a
fazer o cast. Esta linha também compila, pois existe a chance de um animal ser um anfibio, mas na
hora de execução, sabemos que isso não é verdade, e uma exceção do tipo ClassCastExeception
será lançada.
19. Qual das seguintes declarações de classes é valida?
Considere que nenhuma das classes são aninhadas e cada
uma está dentro de um arquivo '.java' com o mesmo nome
que a classe.
protected class Classe{}
public abstract class Classe{}
private class Classe{}
static class Classe{}
synchronized Classe{}

Explicação sobre a resposta


Apenas classes aninhadas (nested) podem ser declaradas privadas, protegidas, ou estáticas. o
modificador synchronized não pode ser usado na declaração de uma classe, apenas em métodos ou
declaração de blocos.

20. Qual resposta é verdadeira em relação ao código


abaixo? class MeuTipo { MeuTipo(String s) { } MeuTipo()
{ } } class TipoFilho extends MeuTipo { }
O código compila. A classe TipoFilho herdou os dois construtores da classe pai.
O código não compila pois a classe TipoFilho não definiu nenhum construtor.
O código compila. A classe TipoFilho não pode ser instanciada pois não possui construtores.
O código compila. A classe TipoFilho possui um único construtor sem argumentos.

Explicação sobre a resposta


É possível não definir nenhum construtor pois toda classe escrita de tal maneira possui o construtor
padrão, sem argumentos. Construtores não são métodos sob o conceito de orientação a objetos e não
existe herança de construtores.

21. Observe o código abaixo: class Fluxo{ public static void


main(String args[]) { char c = 69; switch(c) { case 1 :
System.out.print("1 "); default: System.out.print("default
"); case 2 : System.out.print("2 "); case 3 :
System.out.print("3 "); case 4 : System.out.print("4
"); } } } Qual é o resultado apresentado na tela?
Não compila
Compila mas não roda
Compila e roda, mas não imprime nada
default 2 3 4
default
1 default 2 3 4
Explicação sobre a resposta
Como o valor de c não é igual a nenhum dos valores dos cases, a execução pula para default. Como
não há break, a execução continua depois de executar o código de default.

22. Ao compilar e executar o código abaixo, o que


acontece? public class Teste { public static void
main(String args[]) { String s1 = "a"; String s2 = "a"; s1
+= "bc"; System.out.println(s1);
System.out.println(s2); } }
O código não compila.
O código compila e imprime "abc", depois "abc".
O código compila e imprime "abc", depois "a".
O código compila e imprime "a", depois "a".

Explicação sobre a resposta


O exercício não possui nenhuma "pegadinha". Ele simplesmente concatena a string "bc" na string
"a" e atribui o resultado a variável s1. Como a variável s2 referencia a string "a", nada é alterado
nela. O exercício tenta questionar a existência do pool de strings, onde o comportamento é o
esperado, imprimir "abc" e depois "a", mas o programador iniciante pode se questionar se as duas
variáveis são alteradas.

23. Observe o código a seguir: import java.io.*; class


FileTeste{ public static void main(String args[]) { try
{ System.out.print("tenta "); File f = new File("teste.txt");
return; } catch (Exception e) { System.out.print("excecao
"); } finally { System.out.print("finalmente"); } } } Assuma
que o arquivo "teste.txt" não existe. Qual será o resultado
apresentado na tela?
Compila mas não roda
Não compila
tenta excecao finalmente
tenta feito finalmente
tenta finalmente

Explicação sobre a resposta


Você pode executar o return a partir de um método que "retorna" o tipo void. Instanciar java.io.File
não significa verificar se o arquivo existe ou não.

Você também pode gostar