Nível de dificuldade: Intermediário Preveja a saída dos seguintes programas Java. Programa 1: Java public class Calculator { int num = 100; public void calc(int num) { this.num = num * 10; } public void printNum() { System.out.println(num); } public static void main(String[] args) { Calculator obj = new Calculator(); obj.calc(2); obj.printNum(); } } Opções: A) 20 B) 100 C) 1000 D) 2 Resposta: A) 20 Explicação: Aqui, o nome da variável de instância da classe (num) é o mesmo que calcular() nome da variável local do método (num). Então, para fazer referência à variável de instância de classe de calcular() método esse palavra-chave é usada. Então, em declaração isto.num = num * 10 num representa a variável local do método cujo valor é 2 e isto.num representa variável de instância de classe cujo valor inicial é 100. Agora em imprimirNum() método, pois não possui variável local cujo nome seja igual à variável de instância de classe, portanto, podemos usar diretamente num para fazer referência à variável de instância, embora isto.num pode ser usado. Programa 2: Java public class MyStuff { String name; MyStuff(String n) { name = n; } public static void main(String[] args) { MyStuff m1 = new MyStuff('guitar'); MyStuff m2 = new MyStuff('tv'); System.out.println(m2.equals(m1)); } @Override public boolean equals(Object obj) { MyStuff m = (MyStuff) obj; if (m.name != null) { return true; } return false; } } Opções: A) A saída é verdadeira e MyStuff cumpre o contrato Object.equals(). B) A saída é falsa e MyStuff cumpre o contrato Object.equals(). C) A saída é verdadeira e MyStuff NÃO cumpre o contrato Object.equals(). D) A saída é falsa e MyStuff NÃO cumpre o contrato Object.equals(). Responder : C) A saída é verdadeira e MyStuff NÃO cumpre o contrato Object.equals(). Explicação: Como é igual (objeto obj) O método na classe Object compara dois objetos com base na relação de equivalência. Mas aqui estamos apenas confirmando se o objeto é nulo ou não, então não cumpre Object.equals() contrato. Como m1 não é nulo verdadeiro será impresso. Programa 3: Java class Alpha { public String type = 'a '; public Alpha() { System.out.print('alpha '); } } public class Beta extends Alpha { public Beta() { System.out.print('beta '); } void go() { type = 'b '; System.out.print(this.type + super.type); } public static void main(String[] args) { new Beta().go(); } } Opções: A) alfa beta b b B) alfa beta a b C) beta alfa b b D) beta alfa a b Responder : A) alfa beta b b Explicação: A declaração novo Beta().go() é executado em duas fases. Na primeira fase Beta construtor de classe é chamado. Não há nenhum membro da instância presente em Beta aula. Então agora Beta construtor de classe é executado. Como Beta extensão de classe Alfa aula então a ligação vai para Alfa construtor de classe como primeira instrução por padrão (colocado pelo compilador) é super() no Beta construtor de classe. Agora, como uma variável de instância ( tipo ) está presente em Alfa class para que ele ganhe memória e agora Alfa o construtor da classe é executado e então chama return para Beta próxima instrução do construtor de classe. Então alfa beta é impresso. Na segunda fase ir() método é chamado neste objeto. Como existe apenas uma variável ( tipo ) no objeto cujo valor é um . Então será alterado para b e impresso duas vezes. O super palavra-chave aqui não adianta. Programa 4: Java public class Test { public static void main(String[] args) { StringBuilder s1 = new StringBuilder('Java'); String s2 = 'Love'; s1.append(s2); s1.substring(4); int foundAt = s1.indexOf(s2); System.out.println(foundAt); } } Opções: A) -1 B) 3 C) 4 D) UMA StringIndexOutOfBoundsException é lançado em tempo de execução. Responder : C) 4 Explicação: acrescentar(String str) métodoconcatena o str para s1 . O substring (índice interno) método retorna a String do índice fornecido até o final. Mas como não existe nenhuma variável String para armazenar a string retornada, ela será destruída. indexOf(String s2) método retorna o índice da primeira ocorrência de s2 . Portanto, 4 é impresso como s1='JavaLove'. Programa 5: Java class Writer { public static void write() { System.out.println('Writing...'); } } class Author extends Writer { public static void write() { System.out.println('Writing book'); } } public class Programmer extends Author { public static void write() { System.out.println('Writing code'); } public static void main(String[] args) { Author a = new Programmer(); a.write(); } } Opções: A) Escrevendo... B) Escrevendo livro C) Escrevendo código D) A compilação falha Responder : B) Escrevendo livro Explicação: Como os métodos estáticos não podem ser substituídos, não importa qual objeto de classe é criado. Como um é um Autor tipo referenciado então sempre Autor método de classe é chamado. Se removermos escrever() método de Autor aula então Escritor método de classe é chamado como Autor extensão de classe Escritor aula.