JavaRush/Java блог/Архив info.javarush/Подготовка к сертификации.
ttt
30 уровень

Подготовка к сертификации.

Статья из группы Архив info.javarush
участников
Ап буду в эту темку скидывать непонятные мне вопросы. 5. Что выведет public static void main(String[] args){ for1 : for(int i = 0; i< 10; i++){ for (int j = 0; j< 10; j++){ if ( i+ j > 10 ) break for1; } System.out.println( "hello"); } } 4. Какой будет вывод class A{ A() { print(); } void print() { System.out.println("A"); } } class B extends A{ int i = 4; public static void main(String[] args){ A a = new B(); a.print(); } void print() { System.out.println(i); } } 3.output? class A { public void m(Number n) { n = 5 / 3; System.out.println("class A, method m : " + n); } } class B extends A { public void m(Double d) { d = d / 3; System.out.println("class B, method m : " + d); } } public class MainClass { public static void main(String args[]) { A a = new B(); a.m(5.0); } } 2. Вывод? int []a = {5,5}; int b = 1; a[b] = b = 0; System.out.println(Arrays.toString(a)); 1. Что выведет class A { public void m(int k) { System.out.println("class A, method m : " + ++k); } } class B extends A { public int m(int k) { System.out.println("class B, method m : " + k++); return k; } } public class MainClass { public static void main(String args[]) { A a = new B(); a.m(34); } }
Комментарии (20)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
cepera
Уровень 20
10 июня 2016, 16:29
Други, прокомметриуйте вопрос 4 из шапки. Все никак не пойму вывод
blacky
Уровень 23
10 июня 2016, 20:18
#4 или 4-й по порядку?
cepera
Уровень 20
11 июня 2016, 11:27
Тот что номер 4 (2-й сверху)
blacky
Уровень 23
11 июня 2016, 17:20
4. Какой будет вывод
class A{
    A() {  print();   }
    void print() { System.out.println("A"); }
}
class B extends A{
    int i =   4;
    public static void main(String[] args){
        A a = new B();
        a.print();
    }
    void print() { System.out.println(i); }
}

Скопипастил код сюда. Оу, сам ошибся — не увидел принт в конструкторе A.
Факт #1: у нас получается 2 вывода на консоль — при конструировании объекта и при явном вызове метода.
Факт #2: класс B расширяет A, причем B переопределяет метод print(), т.е. имеет место полиморфное поведение методов
Факт #3: A a = new B() — это расширяющее (неявное) приведение, т.е. по ссылке a мы будем видеть только методы, которые видны из определения A, но не B
Факт #4: при явном вызове метода a.print() у нас имеет место быть полиморфизм методов (см. выше про позднее связывание или посмотри статью "Преобразование ссылочных типов, или спящий волк на клавиатуре")

Так, а вот насчет того, почему из конструктора A вызывается метод объекта B — есть сомнения. Предполагаю, что по той же причине, что конструирование объекта начинается с B и имеет место полиморфное поведение. Нужно узнать что это за особенность Java при конструированиии объектов. Здесь нужно мнение кого-либо ещё.
ttt
Уровень 30
6 июня 2016, 16:15
Совсем забыл, что оплачена сертификация была давно, и этот срок незаметно подкрался. Позвонили с утра и спросили собираюсь ли приходить на экзамен. Я выпал в осадок, совсем про него забыл.
Практически не готовился все это время и получил свой заслуженный результат)))
Your
Score: 51%
Passing
Score: 65%
Result: Fail
blacky
Уровень 23
6 июня 2016, 17:46
Печалька. Времени хватило ответить на все вопросы? Как ощущения после экзамена?)
ttt
Уровень 30
9 июня 2016, 11:18
Да времени было предостаточно. Всего 65 вопросов на 2 часа 25 минут.
Было много вопросов по классу Locale, jdbc, парочка по потокам. В общем если набить руку на моках пройти не проблема, на мой взгляд.
Ощущения, что по своей глупости потерял 150 у.е)))
ttt
Уровень 30
14 апреля 2016, 16:17
Никак не могу понять почему выводит 55
class Super{
    int x = 55;
    public int getNumber( int a){
        return x;
    }
}
public class B extends Super{
    int x = 1;
    public int getNumber( int a, char ch){
        return 4;
    }
    public static void main(String[] args){
        System.out.println( new B().getNumber(4) );
    }
}
cepera
Уровень 20
14 апреля 2016, 17:11
Попробую поподробнее ))
1) Переопределяются методы с одинаковой сигнатурой. Тоесть, если class B extends A, то B.getNumber(int a) есть переопределением для A.getNumber(int a). Но! B.getNumber(int a, char ch) совершенно другой, отличный от A.getNumber(int a) метод!
2) Тогда, учитывая, что B есть наследником от A, он содержит в себе 2 метода, B.getNumber(int a, char ch) и A.getNumber(int a)
3) Таким образом, в maine new B().getNumber(4) вызовет из класса метод A.getNumber(int a) (как метод с одинаковой сигнатурой). А метод A.getNumber(int a) вернет, в свою очередь, значение x=55!
blacky
Уровень 23
14 апреля 2016, 17:57
не, тут не про переопределение метода, а про область видимости x. Ссылка на дочерний объект, а икс берется у родителя.
cepera
Уровень 20
14 апреля 2016, 18:19
Не, именно переопределение метода, т.к. в данном случае дочерний объект содержит родительский, непереопределенный метод
blacky
Уровень 23
14 апреля 2016, 18:38
у них разные сигнатуры и никакого overriding'а нет. только overloading по имени метода
javaNub
Уровень 8
7 апреля 2016, 11:09
Спасибо, научили ))), а то я так наивно и полагал что икс будет два ))
mrserfr
Уровень 33
6 апреля 2016, 16:16
тоже в этом году 803 сдавать буду:)
ttt
Уровень 30
6 апреля 2016, 15:40
Первый вопрос, что выведет этот код и почему
class ClassA {
    int x = 1;

    public void printX() {
        System.out.println(getX());
    }

    public int getX() {
        return x;
    }
}

class ClassB extends ClassA {
    int x = 2;

    public int getX() {
        return x + 1;
    }
}

public class Test {
    public static void main(String[] args) {
        ClassA a = new ClassB();
        System.out.println(a.x);
    }
}
blacky
Уровень 23
6 апреля 2016, 22:17
Выведет единицу. a.x — это только доступ к свойству на основе типа ссылки. Полиморфизм работает только в отношении методов. В отношении переменных — перекрытие областью видимости.
Присоединение вызова метода к телу метода называется связыванием.
Раннее связывание производится перед запуском программы (компилятором и компоновщиком, если он есть).
Позднее связывание (динамическое связывание) производится во время выполнения программы, в зависимости от типа объекта. Т.е. при исполнении программы есть мета информация об объекте, которая позволяет реализовать механизм позднего связывания.
Связывание всех методов в Java осуществляется полиморфно, т.е. можно писать код для базового класса, не сомневаясь в том, что для производных классов он также будет работать верно.
ttt
Уровень 30
8 апреля 2016, 10:25
class A { 
    int i = 0; 
    public int increment() { 
        return ++i; 
    } 
} 
  
public class B extends A { 
    int i = 10; 
    public int increment() { 
        return ++i; 
    } 
  
    public static void main(String[] args) { 
        A obj = (A) new B();  
        System.out.println(obj.increment()); 
    } 
} 
blacky
Уровень 23
8 апреля 2016, 10:38
:thumbs up:
Joysi
Уровень 41
1 апреля 2016, 11:04
Напишите (если есть время) развернуто что хоть было на 1z-803? На какие темы вопросы были, сколько их, сложность английского при задании вопросов и т.п… Какие «засады».
Я сам, например, отношусь к само-сертификации положительно в плане того, что при подготовке к сертификации волей-неволей изучаешь материалы, которые ты не используешь в повседневности (человек — он таки раб привычек), но могут встретиться в вопросах, и таким образом хотя бы расширяешь кругозор.
ttt
Уровень 30
6 апреля 2016, 15:28
Привет! enthuware.com/index.php/mock-exams/oracle-certified-associate/java-programmer-certification-i
Вот тут экзамен один в один, только вопросы посложнее