
- Irei pular as questões que se sobrepõem a esta série de artigos para não duplicar informações desnecessariamente. Eu recomendo a leitura desses artigos, pois eles cobrem as perguntas mais comuns (populares) das entrevistas do Java Core.
- Eu poderia descrever as respostas com mais detalhes, mas não o farei, porque cada resposta poderia se arrastar por todo o artigo. E ninguém vai pedir esse nível de detalhe em qualquer entrevista de emprego.
11. Nomeie todos os métodos da classe Object
A classe Object possui 11 métodos:-
Class<?> getClass() — obtém a classe do objeto atual;
-
int hashCode() — obtém o código hash do objeto atual;
-
boolean equals(Object obj) — compara o objeto atual com outro objeto;
-
Clone de objeto() — cria e retorna uma cópia do objeto atual;
-
String toString() — obtém a representação em string do objeto;
-
void notify() — ativa uma thread aguardando no monitor deste objeto (a escolha da thread é aleatória);
-
void notifyAll() — ativa todas as threads que aguardam no monitor deste objeto;
-
void wait() — faz o thread atual esperar no monitor atual (congela o thread atual) até que uma chamada notify ou notifyAll ative o thread (funciona apenas em um bloco sincronizado);
-
void wait(long timeout) — faz o thread atual esperar no monitor atual (no bloco sincronizado atual), mas com um tempo limite para sair do estado de espera (ou novamente, até que uma chamada notify ou notifyAll ative o thread);
-
void wait(long timeout, int nanos) — este método é semelhante ao método anterior, mas com um tempo limite mais preciso;
-
void finalize() — este método é chamado (finalmente) antes do objeto ser removido pelo coletor de lixo. É usado para limpar recursos adquiridos.
12. Qual é a diferença entre try-with-resources e try-catch-finally ao trabalhar com recursos?
Normalmente, ao usar try-catch-finally , o bloco final é usado para fechar recursos. Java 7 apresenta a nova instrução try-with-resources . É análogo ao try-catch-finally para liberar recursos, mas é mais compacto e legível. Vamos lembrar como é o try-catch-finally :
String text = "some text......";
BufferedWriter bufferedWriter = null;
try {
bufferedWriter = new BufferedWriter(new FileWriter("someFileName"));
bufferedWriter.write(text);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
Agora vamos reescrever esse código, mas usando try-with-resources :
String text = "some text......";
try(BufferedWriter bufferedWriter =new BufferedWriter(new FileWriter("someFileName"))) {
bufferedWriter.write(text);
} catch (IOException e) {
e.printStackTrace();
}
Agora isso é de alguma forma mais simples, você não acha? Além do código mais simples, há alguns outros pontos a serem observados:
-
No try-with-resources , os recursos declarados entre parênteses (recursos que serão fechados) devem implementar a interface AutoCloseable e seu único método close() .
O método close é executado em um bloco finalmente implícito ; caso contrário, como o programa descobriria exatamente como fechar o recurso?
Mas você provavelmente raramente escreverá suas próprias implementações de recursos e seus métodos de fechamento.
-
Os blocos são executados nesta ordem:
- O bloco de tentativa .
- O bloco finalmente implícito .
- O bloco catch , que captura exceções que ocorrem nas etapas anteriores.
- O bloco finalmente explícito .
Como regra, as exceções lançadas mais abaixo na lista interrompem aquelas lançadas mais acima.
13. O que são operações bit a bit?
Operações bit a bit são operações em sequências de bits. Eles incluem operações lógicas e mudanças bit a bit. Operadores lógicos:-
AND bit a bit — Compara valores de bits. Qualquer bit definido como 0 (falso) define o bit correspondente no resultado como 0. Ou seja, se um bit for 1 (verdadeiro) em ambos os valores comparados, o bit resultante também será 1.
Denotado como AND ou &
Exemplo: 10111101 e 01100111 = 00100101
-
OR bit a bit — Esta operação é o oposto da anterior. Qualquer bit definido como 1 define o bit correspondente no resultado como 1. Conseqüentemente, se o bit for 0 em ambos os valores comparados, o bit resultante também será 0.
Denotado como OR ou |
Exemplo: 10100101 | 01100011 = 11100111
-
NOT bit a bit — Este operador é aplicado a um único valor. Ele inverte (inverte) os bits. Ou seja, os bits que eram 1 tornam-se 0; e aqueles que eram 0 tornam-se 1.
Denotado como NOT ou ~
Exemplo: ~10100101 = 01011010
-
OR exclusivo bit a bit — Compara valores de bits. Se ambos os bits forem 1, então o bit resultante será 0. Se ambos os bits forem 0, então o bit resultante será 0. Em outras palavras, para que o bit resultante seja 1, apenas um dos bits deve ser 1, e o outro bit deve ser 0.
Denotado como XOR ou ^
Exemplo: 10100101 ^ 01100011 = 11000110
- 01100011 >> 4 = 00000110
- 01100011 << 3 = 00011000


14. Quais objetos imutáveis padrão existem em Java?
Um objeto é imutável se não permite que seus valores originais sejam alterados. Pode ter métodos que retornem novos objetos do mesmo tipo com valores diferentes. Alguns objetos imutáveis padrão incluem:- sem dúvida, o tipo imutável mais famoso de Java é String;
- instâncias das classes wrapper que agrupam tipos padrão: Boolean, Character, Byte, Short, Integer, Long, Double, Float;
- Objetos BigInteger e BigDecimal, que geralmente são usados especialmente para números GRANDES;
- Objetos StackTraceElement que constituem um rastreamento de pilha (por exemplo, o rastreamento de pilha de uma exceção);
- um objeto da classe File — pode modificar arquivos, mas ao mesmo tempo o próprio objeto permanece inalterado;
- UUIDs, que são frequentemente usados para identificar elementos de forma exclusiva;
- todos os objetos de classes do pacote java.time;
- Objetos de localidade, que são usados para identificar uma região geográfica, política ou cultural.
15. Quais são as vantagens dos objetos imutáveis sobre os objetos comuns?
-
Objetos imutáveis são seguros para uso em um ambiente multithread . Eles fazem isso para que você não precise se preocupar com perda de dados devido a condições de corrida. Isso é diferente de quando você trabalha com objetos comuns. Nesse caso, é preciso pensar e criar bons mecanismos ao usar o objeto em um ambiente paralelo.
-
Objetos imutáveis são bons como chaves em um mapa. Se você usar um objeto mutável como uma chave HashMap e então o estado do objeto mudar, a estrutura de dados poderá ficar confusa: o objeto ainda estará presente, mas se você usar containsKey(), poderá não encontrá-lo.
-
Objetos imutáveis são ótimos para armazenar dados imutáveis (constantes) que nunca devem ser alterados enquanto o programa está em execução.
-
Outra vantagem é a atomicidade da falha. Se um objeto imutável lançar uma exceção, ele não será deixado em um estado indesejado (quebrado).
-
Essas classes são fáceis de testar.
-
Você não precisa de nenhum mecanismo adicional, como um construtor de cópia ou implementação de clonagem de objeto.
Perguntas sobre POO
16. Quais são as vantagens da OOP em geral e em comparação com a programação processual?
Ok, vantagens do OOP:-
Aplicações complexas são mais fáceis de escrever usando OOP do que programação processual, já que tudo é dividido em pequenos módulos — objetos que interagem entre si — e, como resultado, a programação é reduzida a relacionamentos entre objetos.
-
Aplicativos escritos com OOP são muito mais fáceis de modificar (quando os princípios de design são devidamente observados).
-
Como os dados e as operações de dados formam uma única entidade, eles não ficam espalhados por toda a aplicação (o que costuma acontecer na programação processual).
-
O princípio do encapsulamento protege os dados mais críticos do usuário.
-
O mesmo código pode ser reutilizado com dados diferentes porque as classes permitem criar muitos objetos, cada um com seus próprios valores.
-
A herança e o polimorfismo também permitem reutilizar e estender o código existente (em vez de duplicar funcionalidades semelhantes).
-
Estender um aplicativo é mais simples do que com uma abordagem processual.
-
A abordagem OOP torna possível abstrair detalhes de implementação.
17. Conte-nos quais são as desvantagens da OOP
Infelizmente, eles também existem:-
OOP requer muito conhecimento teórico que deve ser dominado antes que você possa escrever qualquer coisa.
-
As ideias OOP não são tão fáceis de entender e aplicar na prática (você precisa ser um pouco filósofo de coração).
-
OOP reduz ligeiramente o desempenho de um programa devido ao aumento da complexidade do sistema.
-
A abordagem OOP requer mais memória, pois tudo consiste em classes, interfaces, métodos, que ocupam muito mais memória do que variáveis comuns.
-
O tempo necessário para a análise inicial é maior do que para uma abordagem processual.
18. O que é polimorfismo estático versus polimorfismo dinâmico?
O polimorfismo permite que objetos da mesma classe ou interface se comportem de maneira diferente. Existem dois tipos de polimorfismo, também conhecidos como ligação precoce e ligação tardia. Polimorfismo estático ou ligação precoce:- ocorre em tempo de compilação (no início do ciclo de vida do programa);
- decide qual método executar em tempo de compilação;
- a sobrecarga de método é um exemplo de polimorfismo estático;
- a vinculação inicial inclui métodos privados, estáticos e finais;
- a herança não está envolvida na vinculação antecipada;
- o polimorfismo estático não envolve objetos específicos, mas sim informações sobre o tipo de classe que aparece à esquerda do nome de uma variável.
- ocorre em tempo de execução (enquanto o programa está em execução);
- o polimorfismo dinâmico decide qual implementação específica um método terá em tempo de execução;
- a substituição de método é um exemplo de polimorfismo dinâmico;
- ligação tardia significa atribuir um objeto específico, uma referência de seu tipo ou sua superclasse;
- a herança está associada ao polimorfismo dinâmico.
GO TO FULL VERSION