Результаты прохождения теста ООП в Java пользователем Mikhail

Результат прохождения теста "ООП в Java" - Пройден

+57

  • Кто проходил: Mikhail
  • Дата прохождения: 23.08.2018
Какие классы скомпилируются ?
abstract interface IClazz{ 
   int doSmth(String s); 
} 
 
abstract class X implements IClazz{ 
 
} 
 
private abstract class Y implements IClazz{ 
 
} 
 
class Z implements IClazz{ 
   int doSmth(String s){ 
       return 0; 
   } 
} 
Ваши ответы
X
Объяснение:

Класс Y не компилируется, поскольку private не допускается.
Класс Z не компилируется, потому что метод doSmth() в интерфейсе имеет модификатор public, а в классе Z - модификатор по-умолчанию, что является сужение области видимости и не допускается.
Класс X компилируется. Методы, объявленные в суперинтерфейсе и не реализованные в классе, считаются абстрактными методами этого класса.

Что выведет пример:
public class Test { 
 
   static class A extends B { 
       static Integer q = 2; 
       static { 
           System.out.print("A"); 
           A.q = 4; 
       } 
   } 
 
   static class B { 
       static { 
           System.out.print("B"); 
           A.q++; 
       } 
   } 
 
   public static void main(String[] args) { 
       System.out.println(A.q); 
   } 
} 
Ваши ответы
Ошибка времени выполнения
Объяснение:

Первым, до инициализации класса "A", происходит инициализация суперкласса "B". У которого в статическом инициализаторе вызывается инкремент не инициализированного поля класса "A". Что вызывает ExceptionInInitializerError Caused by NullPointerException.

Как называется "интерпретация ссылки на объект как ссылки на базовый тип"?
Ваши ответы
Восходящее преобразование
Что будет выведено в результате выполнения кода:
public class test  
{   static void f(int a) 
    { 
       System.out.println("int"); 
    } 
 static  void f(Integer a) 
  { 
      System.out.println("Integer"); 
  } 
static   void f(Object a) 
   { 
      System.out.println("Object"); 
   } 
   static public void main(String[] args) 
  {     
      Object i = new Integer(10); 
      f(i); 
  } 
 
} 
Ваши ответы
Объяснение:

Обьяснение 1. Вариант с "int" отпадает так как в метод была передана ссылка, а не примитивный тип данных, далее можно заметить что статический метод f не переопределен, а перегружен, значит выбирается метод, основываясь на типе ссылки(Object) , а не на типе обьекта(Integer)

Что произойдёт в результате выполнения даного кода:
public class Tree { 
   int leavesCount; 
   String treeName; 
   Tree (int leaves){ 
       this.leavesCount = leaves; 
       System.out.println("int constructor"); 
   } 
   Tree (String treeName, int leaves){ 
       this(leaves); 
       this(treeName); 
       System.out.println("(String, int) constructor"); 
   } 
   Tree (String treeName){ 
       this.treeName = treeName; 
       System.out.println("String constructor"); 
   } 
   Tree () { 
       this("huge tree", 50000); 
       System.out.println("constructor without parameters"); 
   } 
   void printLeavesCount(){ 
       System.out.println("leavesCount = " + leavesCount + " treeName = " + treeName); 
   } 
   public static void main (String[] args) { 
       Tree tree = new Tree(); 
       tree.printLeavesCount(); 
   } 
} 
Ваши ответы
Ошибка компиляции
Объяснение:

При вызове одного конструктора через this вызывать второй запрещается

Какие исключения ПОТЕНЦИАЛЬНО могут возникнуть при присваивании одной переменной объектного типа, другой переменной ЛЮБОГО типа:
a = b;
при условии что компиляция прошла успешно.
Ваши ответы
Объяснение:

OutOfMemoryError - памяти может не хватить для autoboxing-а, например при присваивании объекту типа Integer значения int.

Что напечатает следующий код:
class Y { 
 public Y() { System.out.print("Y"); } 
} 
class Z { 
 public Z() { System.out.print("Z"); } 
} 
class X extends Z { 
 private Y m_objY = new Y(); 
 public X() { System.out.print("X"); } 
 
 public static void main(String[] args) { 
     X x = new X(); 
 }  
} 
Ваши ответы
ZYX
Объяснение:

Согласно JLS #12.5, объект инициализируется в следующем порядке:
1. Инициализируется суперкласс.
2. Инициализируются поля и выполняются инициализационные блоки, в порядке следования.
3. Выполняется оставшееся тело дочернего конструктора.
При этом, инициализация суперкласса происходит аналогичным образом.

Дан следующий код:
01. class Plant { 
02.     String getName() { return "plant"; } 
03.     Plant getType() { return this; } 
04. } 
05. class Flower extends Plant { 
06.    // insert code here 
07. } 
08. class Tulip extends Flower { } 
09. public class Test { 
10.     public static void main(String...arg) { }  
11. } 
 
Что будет допустимо вставить в строчку 6 чтобы код компилировался?
Ваши ответы
Plant getType() { return this; }
Tulip getType() { return new Tulip(); }
Flower getType() { return this; }
Что произойдет при попытке скомпилировать и запустить следующий код:
class Box { 
   int b,w; 
   void Box(int b, int w) { 
       this.b = b; 
       this.w = w; 
   } 
} 
public class MyBox extends Box { 
   MyBox() { 
       super(10, 15); 
       System.out.println(b + "," + w); 
   } 
   static public void main(String args[]) { 
       MyBox box = new MyBox(); 
   } 
} 
Ваши ответы
ничего из выше перечисленного
Объяснение:

Код не скомпилируется, поскольку класс Box не имеет конструктора Box(int b,int w) - там объявлен обычный метод void Box(int b,int w), но с именем, как у класса.

Что выведет следующий код ?
public class Clazz{ 
 int x = 2; 
 public int getX(){ 
   return x; 
 } 
 public static void main(String[] args){ 
   Clazz c = new SubClass(); 
   System.out.println(c.x + " " + c.getX()); 
 } 
} 
 
class SubClass extends Clazz{ 
 int x = 1; 
 public int getX(){ 
   return x; 
 } 
} 
Ваши ответы
2 1