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

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

+63

  • Кто проходил: ilya201177
  • Дата прохождения: 03.12.2018
Каким будет результат работы программы?
class Print1 { 
   private void print() { 
       System.out.println(777); 
   } 
   void print(Print1 p) { 
       p.print(); 
   } 
} 
 
public class Print2 extends Print1 { 
   void print() { 
       System.out.println(666); 
   } 
   public static void main(String[] args) { 
       Print1 p = new Print1(); 
       Print2 q = new Print2(); 
       p.print(q); 
   } 
} 
Ваши ответы
777
Объяснение:

метод *print* класса Print1 _не переопределяется_ методом *print* класса Print2, так как последний даже не знает о существовании такого в классе-родителе (ибо там он private). Эти методы *print* - это 2 разных метода, доступные _только_ каждый в своем классе. Поэтому, в методе *void print(Print1 p)* при вызове метода *print* компилятор находит приватный метод и, зная, что его дальнейшее переопределение невозможно в принципе, вызывает его.

Выберите все утверждения, которые верны по отношению к данному коду:
1: public interface Movable { 
2:       int step = 10; 
3:       void moveMe(); 
4: } 
 
5: class Circle implements Movable { 
6:      void moveMe(){ 
7:        step = 20; 
8:        System.out.println("Moving Circle with step="+step); 
9:      } 
 
10:      public static void main(String[] args) { 
11:        Movable c = new Circle(); 
12:        c.moveMe(); 
13:    } 
14: } 
Ваши ответы
Ошибка компиляции в строке 6
Ошибка компиляции в строке 7
Объяснение:

Все методы интерфейса неявно public abstract, переменные - final static. Указывать это явно необязательно. В строке 6 класс Circle пытается переопределить public метод с уменьшением области видимости. В строке 7 - назначить новое значение final переменной.

Каков результат выполнения следующего кода:
class A implements Cloneable{ 
   public int i=10; 
   @Override 
   public A clone() throws CloneNotSupportedException { 
       return (A) super.clone(); 
   } 
} 
 
class B extends A implements Cloneable{ 
   public int i=20; 
   @Override 
   public B clone() throws CloneNotSupportedException { 
       A cloneA = super.clone(); 
       B cloneB = (B) cloneA;                        
       System.out.print(cloneB.i+" "); 
       return cloneB; 
   } 
} 
 
public class MyClass { 
   public static void main(String[] args) throws CloneNotSupportedException { 
       B b = new B(); 
       A a = b.clone(); 
       System.out.println(a.clone().i); 
   } 
} 
Ваши ответы
20 20 10
Объяснение:

Правильный ответ: 20 20 10. Т.к. класс B переопределяет метод clone, то в обоих случаях будет вызван именно он. Однако, не смотря на то, что метод clone класса B возвращает в качестве результата экземпляр класса B, данный результат будет не явно преобразован к классу A, т.к. переменная a имеет тип A.

Какие фрагменты кода будут компилироваться?
interface Base { 
   boolean m1(); 
   byte m2(short s); 
} 
Ваши ответы
abstract class Class2 implements Base { 
   public boolean m1() { return (true); } 
} 
abstract class Class2 implements Base {} 
Объяснение:

Методы интерфейсов по умолчанию public, следовательно методы класса реализующие методы интерфейсов не должны сужать видимость. Абстрактные классы не обязаны реализовать методы интерфейса.

Дан следующий код:
class A {  
   void f1() {  System.out.print("A"); }  
}  
class B extends A { } 
class C extends A { 
   void f1() {  System.out.print("C!"); } 
}  
 
В чем ярче выражен полиморфизм:
Ваши ответы
A o = new C(); 
o.f1();
Какой результат будет получен после компиляции и выполнения данного кода:
class A { 
   String name = "a "; 
   String test() { 
       return "test A "; 
   } 
} 
 
class B extends A { 
   String name = "b "; 
   String test() { 
       return "test B "; 
   } 
} 
 
public class Main { 
   public static void main(String[] args) { 
       new Main().go(); 
   } 
 
   void go() { 
       A m = new B(); 
       System.out.println(m.name + m.test()); 
   } 
} 
Ваши ответы
a test B
Объяснение:

Полиморфизм распространяется только на методы

Что напечатает следующий код:
class SuperBase { 
   public int i = 3; 
   public void mm(Object o) { 
       System.out.println("Object  " + i); 
   } 
   public void mm(String o) { 
       System.out.println("String  " + i); 
   } 
} 
 
public class Base extends SuperBase { 
   public Base() { 
       i = 5; 
   } 
   public static void main(String[] args) { 
       SuperBase sb = new Base(); 
       Object o = ""; 
       sb.mm(o); 
       sb.mm(""); 
   } 
} 
Ваши ответы
Объяснение:

Конструктор Base (который вызывается ПОСЛЕ конструктора SuperBase) перезаписывает поля. Если вынести i = 5 из конструктора и поместить как поле в классе Base, то отобразится именно 3, а не 5.

Какой будет результат?
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.

Какие операции со ссылочными переменными в теле метода main() не приведут к ошибке компиляции?
class A {} 
class B extends A {} 
class C extends B {} 
public class MyClass { 
   public static void main (String args[]) { 
       A x1 = new A(); 
       B x2 = new B(); 
       C x3 = new C();} 
} 
Ваши ответы
x2 = x3;
x1 = x3;
x1 = x2;
Каким будет вывод после выполнения данной программы?
class A { } 
class B extends A { } 
abstract class C { 
   abstract void doAction(A a); 
   void start(A a){ 
       doAction(a); 
   } 
} 
class D extends C { 
   void doAction(A a) { 
       System.out.println("A action"); 
   } 
   void doAction(B b) { 
       System.out.println("B action"); 
   } 
} 
public class Test { 
   public static void main(String[] args) { 
       new D().start(new B()); 
   } 
} 
Ваши ответы
A action