Prévia do material em texto
Fundamentos da Programação Orientada a Objetos Figura 2 – Visibilidade x modificadores de acesso 1. Analise o código em Java apresentado a seguir. 1 package P2; 2 3 public class Lampada { 4 private boolean ligada; 5 private String tipo; 6 private int cor; 7 8 public Lampada (String tipo, int cor) { 9 this.ligada = false; 10 this.tipo = tipo; 11 this.cor = cor; 12 } 13 14 public void acende () { 15 this.ligada = true; 16 } 17 18 public void apaga () { 19 this.ligada = false; 20 } 21 22 public String estadoLampada() { 23 String ret = ""; 24 if (this.ligada) 25 ret += "ligada"; 26 else 27 ret += "desligada"; 28 if (this.cor == 1) 29 ret += ", luz branca"; 30 else if (this.cor == 2) 31 ret += ", luz verde"; 32 else 33 ret += ", luz vermelha"; 34 ret += ", tipo " + this.tipo; 35 return ret; 36 } 37 } 1 package P2; 2 public class Casa { 3 Lampada lampA; 4 Lampada lampB; 5 Lampada lampC; 6 7 public static void main(String[] args) { 8 int cor1 = 1; 9 int cor2 = 2; 10 int cor3 = 3; 11 12 Casa minhaCasa = new Casa(); 13 minhaCasa.lampA = new Lampada("incandescente", cor3); 14 minhaCasa.lampB = new Lampada("LED", cor1); 15 minhaCasa.lampC = new Lampada("fluorescente", cor2); 16 17 minhaCasa.lampA.acende(); 18 minhaCasa.lampC.acende(); 19 System.out.println("Lamp1 " + minhaCasa.lampB.estadoLampada()); 20 System.out.println("Lamp2 " + minhaCasa.lampC.estadoLampada()); 21 System.out.println("Lamp3 " + minhaCasa.lampA.estadoLampada()); 22 } 23 } De acordo com o código, assinale a alternativa a seguir que representa corretamente o que aparece na tela de console ao final da execução do programa. E) Gabarito da questão Lamp1 desligada, luz branca, tipo LED Lamp2 ligada, luz verde, tipo fluorescente Lamp3 ligada, luz vermelha, tipo incandescente. Feedback: De acordo com a sequência de comandos do programa, nas linhas 13, 14 e 15 do código da classe Casa, temos os atributos das lâmpadas com os seguintes tipos e cores: minhaCasa.lampA = new Lampada("incandescente", cor3); minhaCasa.lampB = new Lampada("LED", cor1); minhaCasa.lampC = new Lampada("fluorescente", cor2); Além disso, de acordo com as linhas 17 e 18 do código da classe casa, apenas as lâmpadas minhaCasa.lampA e minhaCasa.lampC estão acesas. Logo, os comandos para imprimir: System.out.println("Lamp1 " + minhaCasa.lampB.estadoLampada()); System.out.println("Lamp2 " + minhaCasa.lampC.estadoLampada()); System.out.println("Lamp3 " + minhaCasa.lampA.estadoLampada()); Apresentam na tela de console o seguinte conteúdo: Lamp1 desligada, luz branca, tipo LED é a lampB Lamp2 ligada, luz verde, tipo fluorescente é a lampC Lamp3 ligada, luz vermelha, tipo incandescente é a lampA. 2. Um website de uma loja disponibiliza inúmeros produtos para a venda. O fragmento de código a seguir apresenta a declaração da classe CarrinhoDeCompras desse sistema. 1 public class CarrinhoDeCompras { 2 private Cliente c; 3 private Produto[] produtos = new Produto[20]; 4 5 } Considerando o fragmento apresentado, assinale a alternativa correta a seguir. C) Gabarito da questão Seria melhor substituir o vetor de produtos por um ArrayList, uma vez que não se sabe quantos produtos podem ser incluídos no carrinho. Feedback: JUSTIFICATIVA DA RESPOSTA CORRETA* Uma das grandes características dos vetores é que ele possui tamanho fixo, no caso do vetor apresentado, 20 elementos (Produto[20]). Isso significa que o sistema não permitirá a adição de mais de 20 elementos no carrinho. Como é impossível saber de antemão quantos elementos um usuário do sistema poderá incluir em sua compra, o ideal é substituir essa estrutura pela classe ArrayList, que é dinâmica, ou seja, aumenta de tamanho conforme a necessidade. 3. Considere os blocos try...catch...finally a seguir. try { System.out.print("A"); try { System.out.print("B"); throw new Exception("Olá!"); } catch (RuntimeException e) { System.out.print("C"); } catch (Exception e) { System.out.print("D"); if (true) return; } finally { System.out.print("E"); } System.out.print("F"); } finally { System.out.print("G"); } System.out.println("H"); Com base no código apresentado, assinale a alternativa correta. B) Gabarito da questão O código imprime ABDEG. Feedback: JUSTIFICATIVA DA RESPOSTA CORRETA* Analisemos o código passo a passo a seguir. 1. Inicialmente, o código roda o comando System.out.print("A"), imprimindo A. 2. Em seguida, a linha System.out.print("B") é executada, imprimindo B. 3. A linha throw new Exception("Olá!"); executa em seguida, disparando a exceção. Isso desvia o código para o catch de Exception. 4. O código System.out.print("D"); é executado, imprimindo D. 5. Em seguida, a linha if (true) return; executa, forçando o método a sair da função. 6. Porém, antes de sair, o bloco finally mais interno é executado, imprimindo E. 7. E em seguida, o bloco finally mais externo é executado, imprimindo G. Portanto: ABDEG. 4. Os comandos condicionais, ou de desvio, permitem alterar o fluxo de execução de um código, dependendo do resultado de uma condição, que pode ser verdadeira ou falsa. Verifique como é utilizado o condicional do código Java a seguir. 1 package P1; 2 3 public class Main { 4 public static void main(String[] args) { 5 int a = -2; 6 int b = 5; 7 int c; 8 9 if (a b ? 2 - a : -5 * b); 11 } else { 12 c = a + b; 13 } 14 15 System.out.println("fim = " + c); 16 } 17 } O que aparecerá impresso após a execução? Assinale a alternativa correta. Alternativas A) Gabarito da questão Fim = -25 Feedback: JUSTIFICATIVA DA RESPOSTA CORRETA* O primeiro comando de decisão if (a b ? 2-a : -5*b); que atribui seu resultado a c. 5. O código a seguir descreve uma situação de uso de herança. Analise-o com atenção. class A { void print1() { System.out.println("A"); } void print2() { System.out.println("A2"); } void printAll() { print1(); print2(); } } class B extends A { void print2() { System.out.println("B"); } } public class C extends B { void print1() { System.out.println("C"); } public static void main(String[] args) { B teste = new C(); teste.printAll(); } } Sobre o código apresentado, assinale a alternativa correta a seguir. C) Gabarito da questão O código imprimirá C e B, uma vez que a criação do objeto foi feita com new C(). Feedback: JUSTIFICATIVA DA RESPOSTA CORRETA* O código demonstra o uso do polimorfismo. Essa característica fará com que o Java execute sempre o método mais específico, considerando o tipo do objeto criado. O objeto é criado por meio da palavra-chave new e, como podemos notar, ele é do tipo C. A classe C sobrescreve diretamente o método print1() da classe A. Por ser filha da classe B, e esta sobrescrever o método print2() da classe A, gerando uma versão mais específica, essa será a versão do método utilizada. Observe também que o fato de os métodos print1() e print2() serem chamados de dentro de um método da classe A não impede que o polimorfismo ocorra, ou seja, não obriga o Java a chamar as versões presentes em A. 6. Considere a linha de código a seguir. Retangulo retg1 = new Retangulo(); Terreno t = new Terreno(); t.forma = retg1;System.out.println(t.area()); Agora, analise as afirmativas a seguir. I. Area é um atributo do terreno. II. O objeto de retangulo está sendo associado ao terreno por meio do atributo forma. III. Retg1 e t são atributos de classe. IV. Retangulo e terreno são instâncias de classes. Assinale a alternativa a seguir que representa a(s) afirmativa(s) correta(s). D) Gabarito da questão II. Feedback: JUSTIFICATIVA DA RESPOSTA CORRETA* A afirmativa II está correta, pois atributos são as características dos objetos. Na programação, essas características são representadas por meio de variáveis especiais, declaradas no interior da classe e subordinadas a ela. O atributo forma, na variável t, é um atributo de terreno. Ao permitir a atribuição de ret1g, as duas classes ficaram associadas. 7. Na Programação Orientada a Objetos (POO), a herança é um mecanismo que possibilita que uma classe mais genérica seja especializada em outras classes, permitindo o reuso de código. Sobre a relação de herança em Java, assinale a alternativa correta a seguir. Alternativas C) Gabarito da questão É implementada no Java quando utilizamos a palavra-chave extends, declarada logo após o nome da classe. Feedback: JUSTIFICATIVA DA RESPOSTA CORRETA* A relação de herança em Java é implementada com a palavra-chave extends. Para haver herança entre classes, devemos declarar classes da forma apresentada a seguir. class B extends A { ... } Nesse exemplo, a classe B é filha da classe A e, portanto, herda seus atributos e métodos. Isso significa que a classe B é um tipo mais específico de A. Com a herança, a duplicação de código é evitada, pois o código da classe pai, no exemplo a classe A, é reaproveitado em todas as suas classes filhas. 8. A persistência de objetos permite que os dados desse objeto, ou seus atributos, sobrevivam ao programa que os gerou. Esses dados podem ser recuperados, como objetos, mesmo após o encerramento do seu programa, pois eles estão armazenados em algum arquivo. Considerando o contexto apresentado, analise as asserções a seguir e a relação proposta entre elas. I. Nem todo objeto que suporta a interface io.Serializable pode ser gravado em fluxos (streams) para arquivos. PORQUE II. Qualquer objeto, incluindo string e array, é escrito com método writeObject. A respeito das asserções apresentadas, assinale a alternativa correta a seguir. B) Gabarito da questão A asserção I é uma proposição falsa, e a II é uma proposição verdadeira. Feedback: JUSTIFICATIVA DA RESPOSTA CORRETA* II - Qualquer objeto, incluindo string e array, é escrito com método writeObject. Verdadeira. 9. As exceções, ou erros, ocorrem quando algo imprevisto ocorre, como erros da lógica do programa que executa ou acesso a recursos que não estão disponíveis, entre outras situações. Uma forma de lidar com esses imprevistos é realizar o tratamento de exceções nos locais do código em que elas podem ocorrer. Para isso, em Java, são utilizados os comandos try e catch, em que: · Try{ … }: bloco as linhas de código que podem gerar um erro ou lançar uma exceção. · Catch(tipo_excessao e) { … }: bloco em que é descrita a ação a ser executada quando uma determinada exceção for capturada. · Finally{...}: bloco de finalização. Considerando o contexto apresentado, analise as asserções a seguir e a relação proposta entre elas. I. Os blocos try-catch são declarados para tentar executar um conjunto de comandos (dentro do bloco try) e para tratar o lançamento de exceções (no bloco catch), se elas ocorrem. PORQUE II. O bloco finally independe da ocorrência, ou não, da exceção, e sempre finaliza os códigos dos blocos try-catch. A respeito das asserções apresentadas, assinale a alternativa correta a seguir. E) Gabarito da questão As asserções I e II são proposições verdadeiras, mas a II não é uma justificativa da I. Feedback: JUSTIFICATIVA DA RESPOSTA CORRETA* As duas asserções são verdadeiras, mas a segunda não justifica a primeira, apenas complementa as afirmações sobre a técnica de realizar o tratamento de exceções na linguagem Java. 10. Em qualquer linguagem de programação, existem palavras-chave que identificam diferentes elementos, como comandos e tipos de dados. Em Java, o que se pode afirmar sobre a palavra-chave static? Assinale a alternativa correta. Alternativas A) Marcada pelo aluno Quando é usada na declaração de um atributo, significa que o valor desse atributo será o mesmo para todos os objetos da classe. Feedback: JUSTIFICATIVA DA RESPOSTA CORRETA* Atributos e métodos estáticos pertencem à classe, não aos objetos dessa classe. Por esse motivo, se um atributo é declarado como static, ele será compartilhado por todos os objetos da sua classe. Portanto, para invocarmos métodos estáticos, precisamos indicar o nome da classe, e não o nome do objeto. A forma correta de realizar essa invocação é: Classe.metodoStatic(). O método estático mais conhecido é o main, pois dessa forma a JVM não precisa criar um objeto da sua classe para invocá-lo. No Java, na maior parte do tempo, estamos tratando de objetos. Logo, é muito raro utilizarmos métodos e atributos estáticos. A maior parte do nosso programa terá objetos, cada um com valores distintos para os seus atributos, cooperando entre si. 02 (1,00 ponto): Analise o código em Java apresentado a seguir. 1 package P8; 2 3 public class ExcecaoSaldoInsuficienteAplicacao extends Exception { public ExcecaoSaldoInsuficienteAplicacao (String mensagem) ( 4 super(mensagem); 5 6 } public ExcecaoSaldoInsuficienteAplicacao() { 76 8 super(); 9 } 10} 1 package P8; 2 3 public class ExcecaoSaldoInsuficienteSaque extends Exception { 4 public ExcecaoSaldoInsuficienteSaque (String mensagem) ( 5 super (mensagem); 6 } 7 public ExcecaoSaldoInsuficienteSaque() { 8 super(); 9 } 1 package P8; 2 3 public class ContaCorrente [ 4 private int numero; 5 private double saldo; private double aplicacao; public ContaCorrente (int numero, double saldo) ( this.numero пивего; this.saldo saldo; public void retirar (double valor) throws ExcecaoSaldoInsuficienteSaque } 12 13 if (saldo valor) 14 throw new ExcecaoSaldolnsuficienteSaque 15 ("PROBLEMA C/C: numero Saldo RS saldo insuficiente para saque de R$ valor); saldo saldo valor; 16 17 10 public void aplicar (double valor) throws ExcecaoSaldoInsuficienteAplicacao 19 20 if (saldo valor) 21 throw new ExcecaoSaldoInsuficienteAplicacao 22 24 ("PROBLEMA C/C: numero Saldo RS saldo. insuficiente para aplicacao de R$ valor); saldo saldo valor; 23 aplicacao aplicacao valor; 25 @Override 20 public String toString() { 22 20 return "ContaCorrente [Cta: numero, saldo RS saldo, aplicacao RS aplicacao "T": 10 11 29 } 30) 1 package PB; 2 3 public class Banco ( public static void main(String[] args) { 49 ContaCorrente ccl new ContaCorrente (20, 200); ContaCorrente cc2 new ContaCorrente(10,100); try { 8 5 6 7 9 cc1.retirar(40); 10 cc1.aplicar(500); 11 12 13 14 15 cc2.retirar(20); cc2.aplicar(500); catch (ExcecaoSaldoInsuficienteSaque e) { System.out.println(e.getMessage()); catch (ExcecaoSaldoInsuficienteAplicacao) ( 16 17 System.out.println(e.getMessage()); 18 finally ( System.out.println(ccl.toString()); 19 System.out.println(cc2.toString()); 20 } 21 } 22) De acordo com o código Java apresentado, qual será a saída na tela de console da aplicação? Assinale a alternativa correta a seguir. ) Gabarito da questão PROBLEMA - C/C: 20 Saldo R$ 160.0 insuficiente para aplicacao de R$ 500.0 ContaCorrente [Cta: 20, saldo R$ 160.0, aplicacao = R$ 0.0] 08 (1,00 ponto): Interfaces e classes abstratas permitem a criação de métodos sem implementação, que serão utilizados pelas classes filhas, por meio de polimorfismo. Sobre esses conceitos, analise o código a seguir. interface A { void m1(); } interface B { void m1(); void m2(); } abstract class ClasseAbstrata implements A, B { public void m1() { } } class Classe extends ClasseAbstrata { void m3() { } D) Gabarito da questão A classe "classe" está incompleta e não compilará, para complementá-la seria necessário implementar o método m2(). 09 (1,00 ponto): Para salvar umobjeto de uma classe Java em um arquivo, é preciso transformar esse objeto em uma sequência de bytes. Dessa forma, ele poderá ser armazenado em disco, ação que é realizada quando o programa transmite o objeto serializado para um arquivo, via um stream (fluxo de bytes). O stream, portanto, é um objeto de transmissão, no qual um fluxo sequencial de dados é transmitido de uma origem para um destino. Existem dois tipos de stream: o FileOutputStream, que permite a gravação de dados em arquivo, e o FileInputStream, que permite a leitura de dados de um arquivo. Juntos, eles são responsáveis por manipular objetos em uma sequência de bytes. Por fim, existem duas classes chamadas ObjectInputStream e ObjectOutputStream, que são responsáveis por recuperar e gravar, respectivamente, a estrutura do objeto serializado, obtido de um stream. Com base no texto sobre gravação e recuperação de objetos, assinale a alternativa a seguir que indica corretamente qual é o requisito essencial para que os objetos de uma determinada classe possam ser convertidos em um fluxo de bytes, de forma a serem armazenados e recuperados de arquivos. D) Marcada pelo aluno A classe dos objetos a serem gravados e recuperados deve implementar a interface java.io.Serializable. 10 (1,00 ponto): Analise o código em Java apresentado a seguir. package PS; 2 public abstract class Veiculo [ private String placa; private int ano private String marca; private String modelo; private double km; public Veiculo(String place, ant ano, String marca, String modelo, double km) ( 12 this.placa placa; this.ano anop 13 this marca mancaz 14 this.modelo modelo; this.km 15 public String toString() { 17 String dados 19 dadose "Marca: modelo "\n"; pa dados "Modelo: ano 23 dados "Ano Fabricacao: placan"; dados "Placa: km 12 dados "Kilomeragem: return dados, public abstract double pedagio(); 26 2 package PS; public class Carro extends Veiculo ( int capacidade; public Carro(String place, int ano, String manca, String modelo, double kn, ant cap) { super(placa, ano, marca, modelo, ke); this.capacidade cap; public String toString() ( String dados super.toString(); return dados "Capacidade: capacidade, @Override public double pedagio() ( return 4.5; package PS; public class Caminhas extends Veiculo ( private int eixos, public Caminhao(String placa, int ano, String marca, String modelo, double in, int wixος) ( super(placa, ano, marca, modelo, kw); this.eixoswixos public String toString() ( 13 String dados super.toString(); return dades 25 public int getlinos() [ return this.eines; 26 Override public double pedagio() ( 20 return 5.0zίκος; } 1 package PS, 2 import java.util.ArrayList; public class Transportadora ( ArrayList(Veiculo frota; public static void main(String[] args) { Transportadora cargo new Transportadora(); double pedagiolotal 0; int c01 Int cargo.frota new ArrayList(Veiculos(); carge.frota.add(new Caminhao("BEC0404", 2019, "Volkswagen", "Constellation ",180000.0,6)); cargo.frota.add(new Caminhao("ASC3130", 2014, "Mercedes-Bena", "Accelo", 200000.0,2)); cargo.frota.add(new Carro("DIA4678", 2018, "Renault", "Master", 80000.0,1593)); cargo.frota.add(new Carro("I101234", 2015, "Flat", "Fiorino",100000.0,650)); cargo.frota.add(new Carro("CAR0909", 2020, "Ford", "EcoSport", 1000.0,350)); for (Veiculo: cargo.frota) ( 29 System.out.println(v.toString()); System.out.println("); if (v instanceof Carro) if (instanceof Caminhao) ((Caminhao) v).getEixos(); pedagiolotal v.pedagio(); System.out.println("Valor de System.out.println("Valor de System.out.println("Pedagio Frota: R$ pedagiolotal); 12 E) Marcada pelo aluno Valor de cr: 3. Valor de cm: 8. Pedagio Frota: R$ 53.5. image1.png image2.png