Revisao OCPJP - Princípios OO

27
Revisão OCPJP7 Princípios OO

Transcript of Revisao OCPJP - Princípios OO

Page 1: Revisao OCPJP - Princípios OO

Revisão OCPJP7

Princípios OO

Page 2: Revisao OCPJP - Princípios OO

Questão

Qual afirmação é verdadeira?

A. At line 7 extending the abstract class “Switch” is more appreciate

than implementing the interface “Switchable”

B. At line 7 implementing the interface “Switchable” is more

appreciate than extending the abstract class “Switch”

C. At line 7 implementing the interface or extending the interface won’t

give us any advantage over another.

D. Since the both the interface and the abstract class are abstract,

both of them will provide same flexibility.

E. Implementing or extending will fail this code from compiling.

Dado o código:

Page 3: Revisao OCPJP - Princípios OO

RespostaB é a opção correta. Nesse código tanto a interface quanto a classe abstrata

fornecem a mesma funcionalidade para a classe It, mas implementar a interface é

melhor porque permite a classe It estender outra classe se necessário.

A é incorreta, pois se usarmos a herança de classe não poderemos fazê-lo

novamente na classe It.

C e D estã incorretas, pois nesse caso a interface claramente nos provê mais

flexibilidade do que a classe abstrata.

E é incorreta já que o metodo sw() foi corretamente sobrecarregado na linha 9

Page 4: Revisao OCPJP - Princípios OO

QuestãoConsidere as afirmações

I. Implementing an interface and extending an abstract class provide same functionality and flexibility. II. We should override all the methods when we extend an abstract class or Implement an interface to a non abstract class.III. Interfaces and the abstract classes are same.

Qual está correto? Selecione um:

A. All

B. Only I

C. Only II

D. Only III

E. None

Page 5: Revisao OCPJP - Princípios OO

RespostaE é a resposta correta.Afirmação I é incorreta. Ao se estender uma classe abstrata, assim como estender

uma classe concreta, não se pode estender outra classe. No entanto ao se implementar uma interface, pode-se implementar outras além ainda pode estender uma classe.

Afirmação II é incorreta, uma classe abstrata também pode ter métodos não abastratos, assim se você estender uma classe abstrata não necessariamente precisará sobrescrever “todos” os seus métodos.

Afirmação III é incorreta, mesmo se uma interface for 100% abstrata, existem diferenças entra classes abstratas e interfaces. Uma grande diferença é que todos os métdos de uma interface são abstratos e publicos por padrão, enquanto que nas classes abstratas não.

Page 6: Revisao OCPJP - Princípios OO

QuestãoSelecione um:

A. Does not compile

B. ClassCastException is thrown

C. Prints "super"

D. Prints "sub"

Qual é o resultado de compilar e executar o código abaixo?

Page 7: Revisao OCPJP - Princípios OO

RespostaD é a resposta correta.

O código demonstra o uso de retorno com covariantes, o tipo de de retorno do método sendo sobrescrito é um subtipo do tipo de retorno do método sobrescrito.

Aqui o super tipo é uma interface, o que é perfeitamente permitido. O objeto da classe Second foi designado a uma variável declarada do tipo First. Isso também é permitido já que a classe Second é uma subclasse de First. Já que o código compila a opção A está incorreta.

Com a sobrescrita, mesmo que o tipo declarado tenha sido First, o método invocado foi o da classe Second, assim a saída é “sub”, o que torna as alternativas C incorreta e D correta.

Page 8: Revisao OCPJP - Princípios OO

QuestãoQuais das opções são retornos legais do metodo callMe() na classe

Test? Selecione 2

a. X

b. AA

c. B

d. C

Page 9: Revisao OCPJP - Princípios OO

RespostaOpções C e D estão corretas.

O suporte a retorno de tipos covariantes permite sobrescrever um método da super classe retornando qualquer subtipo do tipo de retorno no método da classe super.

O tipo de retorno declarado nas opções A e B são supertipos do tipo de retorno do método na classe super, o que não é permitido. Assim as opções A e B estão incorretas.

Page 10: Revisao OCPJP - Princípios OO

QuestãoO que acontecerá na tentativa de compilar e executar o código?

Selecione 1

a. Compiles fine and prints "Derived" at runtime

b. Compiler error

c. Compiles fine but no output is produced

d. Compiles fine and prints "Base" at runtime

Page 11: Revisao OCPJP - Princípios OO

RespostaOpção B é a resposta correta.Quando um objeto da classe Derived é construído no método main, uma chamada

super() é automaticamente feita pelo construtor da classe. No entanto, não existe um constrututor sem argumentos na classe super, causando um erro de compilação.

O compilador iria prover um construdor default, se nenhum construtor fosse declarado na classe. No entanto, nesse caso, a classe base definiu apenas um construtor com argumento.

Page 12: Revisao OCPJP - Princípios OO

QuestãoO que acontecerá na tentativa de compilar e executar o código?

Selecione 1

a. Does not compile

b. Prints 0

c. Prints 10

d. Prints 7

Page 13: Revisao OCPJP - Princípios OO

RespostaOpção A é a correta.

O código não compila porque o construtor da classe A está declarado como privado. Isso cria um problema quando o construtor da subclase faz uma chamada implícita a super() para chamar o construtor ser argumentos da classe super quando B é instanciada.

Já que o código não compila, todas as outras opções são incorreta. Se o construtor de A não fosse privado, a saída seria 7.

Page 14: Revisao OCPJP - Princípios OO

QuestãoDado o código. Quais 3 afirmações são verdadeiras?

Selecione 3

A. Runtime exception.B. The code compiles and the output is 200.C. If lines 14, 15 and 16 were removed, compilation

would fail. D. If lines 19, 20 and 21 were removed, compilation

would fail.E. If lines 14, 15 and 16 were removed, the code

would compile and the output would be 200.F. If lines 19, 20 and 21 were removed, the code

would compile and the output would be 100.

Page 15: Revisao OCPJP - Princípios OO

RespostaOpções corretas são B, E e F

No código foi definido uma interface Foo. A classe A implementa a interface Foo, a classe A foi defininida em 2 locais: na linha 14 é definada como uma inner class da classe B, enquanto que na linha 19 é uma inner class de um método (o que é completamente legal). Inner class de métodos tem preferência sobre inner classe de classes.

Quando o metodo testFoo() é invocado ele internamente inova o método fubar() e passe um objeto da classe A como referência. O objeto A passado é um da classe inner do método testFoo. Assim na execuçãodo métod bar() 200 será printado sem nenhum erro ou alerta, conforme descrito na opção B.

Caso removêssemos as linhas 14,15 e 16, 200 seriam printado também sem nenhum erro, como descrito na opção E.

Se removessemos as linhas 19,20 e 21 (a segunda declaração da classe A), a classe inner A seria chamada e o resultado seria 100, como descrito na oção F.

Assim podemos descartar A, C e D, pois estão incorretas

Page 16: Revisao OCPJP - Princípios OO

QuestãoQual é o resultado?

Selecione 1.

a. Compilation succeeds.

b. Compilation fails due to multiple errors.

c. Compilation fails due to an error only on line 20.

d. Compilation fails due to an error only on line 21.

e. Compilation fails due to an error only on line 22.

f. Compilation fails due to an error only on line 12.

Page 17: Revisao OCPJP - Princípios OO

RespostaOpção A está correta.

O código declara corretamente a interface A com o método method1(), essa mesma interface também declara uma variável do tipo String. B é uma interface vazia, o que também é permitido. A interface C estende as interfaces A e B (um interface pode estender uma ou mais interfaces), nessa interface existem 2 métodos, um com a mesma assinatura do método declarado na interface A.

Já que os métodos de uma interface não possuem corpo, métodos com a mesma assinatura de métodos de interfaces estendidas podem ser declarados.

Sendo assim o código compila e a opção correta é A.

Page 18: Revisao OCPJP - Princípios OO

QuestãoInsira código no #1 para que o código compile e execute.

Selecione 2.

A. protected void amethod(int i) throws Exception {}

B. int amethod(float i){return 0;}

C. void amethod(int i) throws RuntimeException {}

D. public int amethod(int i) {return 0;}

Page 19: Revisao OCPJP - Princípios OO

RespostaOpções corretas são B e C.

Para que a sobrecarga seja válida a lista de argumentos do método deve ser diferente, o tipo de retorno pode ser o mesmo ou não. Assim a opção B é uma sobrecarga válida do método amethod() de MyClass. O modificar de acesso não faz diferença em sobrecarga.

A opção C é uma sobrescrita válida já que o tipo de retorno e os argumentos batem, nesse caso o modificador de acesso importa, devendo ser o mesmo ou mais amplo na sobrescrita. Exceções checadas novas não são permitidas serem lançadas, no entanto exeções não checadas novas podem ser lançadas.

Opção A não é uma maneira correta de sobrescrita, já que lança uma nova exceção checada que não foi lançada no metodo original.

Opção D não é uma sobrescrita ou sobrecarga válida já que os argumentos batem e apenas o tipo de retorno é diferente.

Page 20: Revisao OCPJP - Princípios OO

QuestãoQuais mudanças deveriam ser feitas no código para reuzir o

overhead de sincronização em um singleton.

Selecione 2.

A. Mark the static variable cache as volatile.B. Mark the static variable cache as static and volatile. C. Insert before line 15 the code block : if(cache ==

null) { synchronized(PageCache.class) { // code from line 15 to 17 } }

D. Nothing can be done to reduce the synchronization overhead.

Page 21: Revisao OCPJP - Princípios OO

RespostaOpções corretas são A e C.Neste fragmento de código , há uma classe PageCache que tem um método static final getInstance() e uma variável

cache estática . O construtor padrão da classe PageCache é marcado como privado.O construtor desta classe não pode ser chamado de uma classe externa , uma vez que é privado. Isso impede que

a instanciação da classe a partir de uma classe externa . Assim, apenas um método estático dentro da classe pode acessar o construtor da classe .

O método getInstance() serve essa responsabilidade . Quando o método getInstance() é chamado, ele verifica a variável de cache para ser nulo , se sim, ele instancia -lo , senão ele retornar o objeto que já é referenciado pela variável de cache. Assim, verifica-se que existe um e somente um objeto que é criado e retornado quando solicitado. Este tipo de padrão de design é chamado de padrão de projeto Singleton em Java. No entanto, quando multithreading entra em cena , se dois ou mais segmentos de alguma forma entrar no bloco if no método getInstance() , haverá duas instâncias do pagecache o que é contraditório com o padrão Singleton .

Então, marcando o método getInstance() como sincronizado garante a segurança do thread como apenas um segmento será capaz de introduzir o método de cada vez. Mas , esta é uma sobrecarga adicional , uma vez que diminui a velocidade de execução por cerca de 100 vezes .

Para evitar isto, a variável de cache pode ser marcado como volátil , que garante que o valor de cache é sempre lido a partir da memória principal quando os segmentos estão envolvidos , e o bloco sincronizado na opção C pode ser adicionada de modo que a sobrecarga de sincronizar o método é removido . Isso é chamado de bloqueio duplo marcada. Assim, as opções A e C são as respostas corretas.

Page 22: Revisao OCPJP - Princípios OO

QuestãoQual Design Patter é demonstrado no métdo Calendar.

getInstance()?.

Selecione 1.

A. Factory pattern

B. Singleton pattern

C. DAO pattern

D. None of these.

Page 23: Revisao OCPJP - Princípios OO

RespostaA resposta correta é a opção A.

Padrão de projeto de Factory em Java é um padrão no qual uma classe separada tem a responsabilidade de fornecer entidades no sistema como e quando necessário usando seus métodos expostos .

Em Java , o padrão de projeto de Factory é implementado , separando o código que cria objetos usando palavra-chave "new" . Este código é movido para uma classe separada e é parte de um novo método . Sempre que é necessário um objeto desta entidade correspondente, uma instância da classe de fábrica é referenciado eo método para a criação do objeto é chamado por essa instância . Isto leva a reutilização do código . Além disso, o princípio Java "abrir para a extensão fechado para modificação" é preservado.

Além disso , o método na Factory é chamada utilizando um objeto da classe Factory . Portanto, este método de criação do objeto é um método de instância ou seja, um método não -estático. Isto é útil quando é necessário um código de criação de objeto personalizado . Nesse caso, o método pode ser substituído pela classe estendendo a classe Factory e correspondente código personalizado podem ser adicionados conforme a necessidade .

Calendar é uma classe abstrata e getInstance() é um método estático dentro desta classe. Assim, quando chamamos Calendar.getInstance () , o novo calendário objeto é criado , cuja implementação real é dada por uma de suas subclasses , como GregorianCalendar . Este tipo de comportamento representa o padrão de Abstract Factory. Portanto, a resposta é A.

Page 24: Revisao OCPJP - Princípios OO

QuestãoQue seguinte retratam o padrão de fábrica?

Selecione 2.

A. StringBuilder.append()

B. DriverManager.getConnection()

C. Runtime.getRuntime()

D. Integer.valueOf(String)

Page 25: Revisao OCPJP - Princípios OO

RespostaAs respostas corretas são opção B e D.

Padrão de projeto de Factory em Java é um padrão no qual uma classe separada tem a responsabilidade de fornecer dedicado entidades no sistema como e quando necessário usando seus métodos expostos .

Método DriverManager.getConnection retorna um objeto do tipo Connection , que é uma interface. Assim, o tipo de objeto retornado depende da implementação da API JDBC. Então, essa API implementa projeto Abstract Factory . Além disso, Integer.valueOf (String) também leva o valor da String passada para ele e retorna um novo objeto Integer com este valor. Isto é porque os objetos inteiros são imutáveis ou seja , não podem ser alterados . Assim , B e D são respostas corretas.

StringBuilder.Append implementa o padrão de projeto Builder enquanto Runtime.getRuntime implementa o padrão de projeto Singleton. Então, A e C também não são respostas válidas .

Page 26: Revisao OCPJP - Princípios OO

QuestãoQual afirmação é verdadeira sobre as classes e interfaces ao lado?

Selecione 1.

a. Compilation will succeed for all classes and interfaces.

b. Compilation of class C will fail because of an error in line 2.

c. Compilation of class C will fail because of an error in line 6.

d. Compilation of class AImpl will fail because of an error in line 2.

Page 27: Revisao OCPJP - Princípios OO

RespostaA resposta correta é a opção C.

Em determinado trecho de código da classe C está estendendo a classe B e definir dois métodos doit () e execute (). Em determinada classe código AImpl implementa corretamente interface A, para que possamos dizer que Aimpl é do tipo A e pode ser usado no lugar onde é exigido objeto do tipo A.

Aqui Aimpl é usado como tipo em vez de A. Já que Aimpl implementa com sucesso interface A ele pode ser usado. Isso, é um exemplo válido de método de sobrescrito.

Mas, enquanto define o metodo execute() a classe C define como um tipo de objeto em vez de String no retorno, conforme definido na classe B. As Object é super classe de String ele não pode ser usado como tipo de retorno em um sobrescrita. Também uma classe não pode ter método com mesmo nome na superclasse com apenas diferente tipo de retorno. Assim, a classe C não pode definir método execute() com o tipo de retorno Object. Isso vai causar um erro de compilação como descrito na opção C.