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

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

+37

  • Кто проходил: ilya201177
  • Дата прохождения: 04.12.2018
Выберите правильный результат выполнения кода:
class A { } 
class B extends A { } 
 
public class Main { 
   public static void main (String [] args) { 
       A a = new B(); 
       B b = (B) a; 
       System.out.println(a == b); 
   } 
} 
Ваши ответы
true
Какой принцип лежит в основе связывания "метод-вызов"?
Ваши ответы
позднее связывание за исключением методов с модификатором final, static или private
Какой будет результат компиляции и выполнения следующего кода?
class Base { 
  static { 
       System.out.println("Static"); 
  } 
  public Base(String s) { 
       System.out.println("Base " + s); 
  } 
} 
 
class Sub extends Base { 
   private final String Str = "Constructor"; 
   public Sub() { 
       super(Str); 
       System.out.println("Sub " + Str); 
   } 
 
   public static void main(String...args) { 
       Base B = new Sub(); 
   } 
} 
Ваши ответы
Ошибка компиляции
Объяснение:

В качестве аргумента при вызове конструктора суперкласса нельзя передавать нестатические поля класса, результат выполнения нестатического метода или ссылку this.

Какие независимые изменения можно сделать в следующем фрагменте кода, чтобы он компилировался (укажите все подходящие варианты)?
public class B implements Inter<String> {     // 1 
   public static void main(String[] args) {  
       new B().fun(); 
   }  
   public String fun() { 
       System.out.println("B"); 
       return null; 
    } 
}  
class C extends B implements Inter<Boolean> {  // 2 
}  
interface Inter<T> { 
    T fun(); 
} 
Ваши ответы
Убрать "extends B" из строки //2 и добавить реализацию метода fun в класс C
Убрать "implements Inter<Boolean>" из строки //2
Объяснение:

Код не компилируется, так как класс не может реализовывать два _различных_ варианта _параметризованного_ интерфейса, в данном случае это Inter<String> и Inter<Boolean>.
Вариант Убрать "implements Inter<String>" из строки //1 - тоже не подходит, так как в этом случае в классе C должен быть метод fun, возвращающий Boolean, но в классе B уже есть метод с такой сигнатурой, возвращающий String.

Какие утверждения верны по отношению к данному коду:
class A{ 
  A(int i){ //1 
  } 
} 
class B extends A{ //2 
}
Ваши ответы
компилятор попытается создать по умолчанию конструктор для класса В
ошибка компиляции в строке 2
Объяснение:

В переводе на русский: если в классе не содержится конструктора, то неявно создаётся конструктор по умолчанию. Конструктор по умолчанию просто вызывает конструктор по умолчанию из суперкласса. Если в суперклассе такого нет, то возникает ошибка компиляции.
Таким образом, поведение компилятора для данного примера кода однозначно описано в спецификации.

Какой будет результат?
1. class Dog { 
2.     public void bark() { System.out.print("woof "); } 
3. } 
4. class Hound extends Dog { 
5.     public void sniff() { System.out.print("sniff "); } 
6.     public void bark() { System.out.print("howl "); } 
7. } 
8. public class DogShow { 
9.     public static void main(String[] args) { new DogShow().go(); } 
10.     void go() { 
11.         new Hound().bark(); 
12.         ((Dog) new Hound()).bark(); 
13.         ((Dog) new Hound()).sniff(); 
14.     } 
15. } 
Ваши ответы
Ошибка компиляции в строке 13
Объяснение:

У класса Dog нет метода sniff.

Выберите все утверждения, которые верны по отношению к данному коду:
class Foo { 
   public int bar; 
   private Foo foo; 
} 
 
class Bar { 
   private Foo foo; 
   public FooBar[] bars; 
} 
 
public class FooBar { 
   public Foo foo; 
   public Bar bar; 
} 
Ваши ответы
Bar содержит Foo
Bar может содержать несколько экземпляров FooBar
Объяснение:

Foo содержит int, но не Bar.
Foo содержит только один экземпляр Foo, а не несколько.
FooBar содержит Foo, а не наоборот.

Какой код можно вставить в строку 1 без ошибки компилятора?
class Small{ 
   Number growUp(){ 
       System.out.println("I'm big now"); 
       return 5; 
   } 
} 
class Medium extends Small{ 
   //1 
}
Ваши ответы
protected Number growUp(){ System.out.println("I'm small"); return 5; }
public Integer growUp(int f){ System.out.println("I'm not so big"); return 5; }
Объяснение:

protected Number growUp(){ System.out.println("I'm small"); return 5; } - сигнатуры методов совпадают, область видимости не сужается, всё хорошо;
public Integer growUp(int f){ System.out.println("I'm not so big"); return 5; } - другой набор аргументов. Метод _не перегружается_, но создаётся новый.
private Number growUp(){ System.out.println("I want to be big"); return 5; } - при переопределении нельзя сужать область видимости.
protected Float growUp(float f){ System.out.println("I want to be bigger"); return 5f; } - снова другой набор параметров.

Даны интерфейсы:
interface A { 
   Integer a(); 
} 
interface B { 
   Number a(); 
} 
 
Какие фрагменты кода из перечисленных успешно скомпилируются?
Ваши ответы
class C implements A, B { 
   public Number a() { 
       return null; 
   } 
} 
abstract class C implements A, B { 
} 
Что произойдёт при компиляции данного кода ?
class A{ 
     public A method() throws Throwable{ // 1 
         return new Single(); 
         }  
     }  
 class Single extends A{ 
     public Single method(String str) throws RuntimeException{ // 2 
         return new Single();  
         } 
     public Single method() throws Exception{  //3 
         return new Double();  
         }  
     }  
 class Double extends Single{ 
     public void method(Integer digit) throws ClassCastException{      // 4 
     } 
     public Double method() throws IOException{  // 5 
         return new Double();  
         } 
     }