Мы собрали 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();
}
}
Static method called
- Мы можем вызвать статические методы, используя переменную, ссылающуюся на 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);
}
}
false true
Что выведет следующая программа?
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);
}
}
Compilation Error
Что происходит при написании 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»