10 интересных вопросов по Java, которые вам могут задать на собеседовании

Мы собрали 10 каверзных примеров программ, которые выводят какую-либо информацию. Вы должны взглянуть на код и сказать, что же выведет программа. Не исключено, что программа даже не скомпилируется. В этом случае вам надо указать, что выведет компилятор.

Такие вопросы любят задавать на собеседованиях, а потому не лишним будет освежить свои знания языка программирования Java. В спойлерах будут скрыты ответы — то, что выведет программа или компилятор. Постарайтесь подумать сами, прежде чем смотреть правильный ответ.

Что выведет следующая программа?

package com.instanceofjava;
 
public class B {
 
  B b = new B();
 
 public int show(){
      return (true ? null : 0);
 }
 
 public static void main(String[] args)  {
 
        B b = new B();
        b.show();
    }
}
Exception in thread "main" java.lang.StackOverflowError
at com.instanceofjava.B.(B.java:3)
at com.instanceofjava.B.(B.java:5)
at com.instanceofjava.B.(B.java:5)
  • Каждый раз, когда мы создаем объект какого-либо класса, первым вызывается конструктор и выделяется память для всех нестатических переменных.
  • Здесь B b = new B(); объекту класса B присваивается новый объект того же класса.
  • Запись B b = new B(); приводит к рекурсивному исполнению конструктора, что создает бесконечные объекты. Именно поэтому во время выполнения этого кода будет возбуждено исключение java.lang.StackOverFlowError в потоке "main".
  • Распространенной причиной появления такого рода исключений является плохая рекурсия. Обычно это происходит из-за неправильного условия завершения.

Что выведет следующая программа?

package com.instanceofjava;
 
public class A{

 
 public static void show(){
 
        System.out.println("Static method called");
 }
 
 public static void main(String[] args)  {
 
        A obj = null;
        obj.show();
 
    }
}
  • Мы можем вызвать статические методы, используя переменную, ссылающуюся на null. Дело в том, что статические методы находятся на уровне класса. Именно поэтому мы можем вызывать статические функции как при помощи самого класса, так и при помощи переменной, равной null.

Что выведет следующая программа?

package com.instanceofjava;
 
public class A{
 
static int a = 1111;
static
{
        a = a-- - --a;
}
    
{
        a = a++ + ++a;
}
 
 public static void main(String[] args)  {
       System.out.println(a);
    }
}

Что выведет следующая программа?

package com.instanceofjava;
 
public class A{
 int GetValue()
 {
        return (true ? null : 0);
 }
 
 public static void main(String[] args)  {
      A obj = new A();
      obj.GetValue();
 }
}
Exception in thread "main" java.lang.NullPointerException

Что выведет следующая программа?

package com.instanceofjava;
 
public class A{ 
 public static void main(String[] args)  {
   Integer i1 = 128;
   Integer i2 = 128;
   System.out.println(i1 == i2);

   Integer i3 = 127;
   Integer i4 = 127;
   System.out.println(i3 == i4);
 }
}

Что выведет следующая программа?

package com.instanceofjava;
class A
{   
 void method(int i)
 {
 
 }
}
 
class B extends A
{
 @Override
 void method(Integer i)
 {
 
 }
}
Compile time Error:The method method(Integer) of type B must override or implement a supertype method
  • Какая строчка программы вызовет ошибку compile time error?
package com.instanceofjava;
class A
{   
 public static void main(String [] args)
 {
  Integer i = new Integer(null);
  String s = new String(null);
 }
}
Compile time Error at line number 9:The constructor String(String) is ambiguous

Что выведет следующая программа?

package com.instanceofjava;
class A
{   
 public static void main(String [] args)
 {
  String s = "ONE"+3+2+"TWO"+"THREE"+5+4+"FOUR"+"FIVE"+5;
  System.out.println(s);
 }
}
ONE32TWOTHREE54FOURFIVE5

Что выведет следующая программа?

package com.instanceofjava;
class A
{
 
 static int method1(int i)
 {
  return method2(i *= 11);
 }
 
 static int method2(int i)
 {
  return method3(i /= 11);
 }
 
 static int method3(int i)
 {
 return method4(i -= 11);
 }
 
 static int method4(int i)
 {
  return i += 11;
 }   
 
 public static void main(String [] args)
 {
  System.out.println(method1(11));
 }
}

Что выведет следующая программа?

package com.instanceofjava;
class A
{   
 public static void main(String [] args)
 {
  System.out.println(null);
 }
}

Что происходит при написании System.out.println(null);?

Происходит, разумеется, ошибка компиляции. У метода println есть несколько вариаций. Он может принимать String, Object или char[]. При передаче в эту функцию аргумента null компилятор не может определиться, к какому из трех методов обращаться.

Перегруженные методы:

  • public void prinltln(String str) {
  • public void prinltln(char[] ch) {
  • public void prinltln(Object ch) {

Для компилятора вызов System.out.println(null) является неоднозначным, поскольку для вывода null‘a могут более-менее подойти два метода: println(String) и println(char[]). Но компилятор не знает, к какому конкретно методу обратиться. Чтобы компиляция прошла успешно, следует написать:

  • System.out.println((String)null);
  • System.out.println((char[])null);
  • System.out.println((Object)null);

Но здесь нужно быть внимательным. Вызов System.out.println((char[])null); приведет к исключению runtime exception.

Перевод статьи «10 Interesting Core Java Interview Coding Questions and Answers»