Показаны сообщения с ярлыком загадки. Показать все сообщения
Показаны сообщения с ярлыком загадки. Показать все сообщения

вторник, 4 июня 2013 г.

Перегрузка методов

Всё ли в порядке с классом?

public class B {
    public int test(int i){return 1;};
    public int test(float i){return 2;};
    public int test(Integer i){return 3;};
    
    public static void main(String[] args) {
        B b = new B();
        System.out.printf("%d %d %d", b.test(1), b.test(1.0f), 
            b.test(Integer.valueOf(1)));
    }
}

Ответ

Output: 1 2 3 Класс скомпилируется и будет работать, т.к. значения считаются разными и попадут в нужные методы

Где начинаются проблемы?


Object[] o = new Integer[2];//1
o[0] = "fff"; //2
System.out.println(o[0]); //3

Ответ

Строка 1 отработает без проблем. 2 строка скомпилируется, массивы ковариантны. 3 строку компилятор тоже пропустит. А вот при запуске на 3-й строке выскочит ArrayStoreExceptions

Кто первый?

Что выведет программа?

class Tree {
    static int i[];
    public static void main(String... args)
    {
        int eye[] = new int[0];
        try {
            try {
                System.out.println(i.length);
            } finally{
                i = eye;
            }
        } catch (RuntimeException e) {
            e.printStackTrace();
            System.err.println(i.length);
        }
    }
}

Ответ

Output: 0
Cначала выполнится блок finally, затем программа попадет в блок с исключением.

Объявления массивов и коллекций

Можно ли выполнять следующие объявления?

Object[] array = new String[5]; //1
Object [] object = new String[5][5][5]; //2
List<Integer> list = new ArrayList<Number>(); //3
List<? extends Number> list = new ArrayList<Number>(); //4
List<Number> list2 = new ArrayList<Integer>(); //5
List<? super Integer> list3 = new ArrayList<Number>(); //6

Ответ

1. Можно. Массив String является подтипом массиват Object
2. Можно
3. Нельзя, т.к. колленция не является подтипом коллекции
4. Можно. Тут мы говорим, что коллекция может соржать любой тип, наследующий от Number. Считается, что Number наследует от Number
5. Нельзя, т.к. колленция не является подтипом коллекции
6. Можно. Коллекция может содержать объект любого типа, от которого наследует Integer

среда, 30 января 2013 г.

Что выведет программа?

int i = 0;
if (i == 1) if (i == 0) i = 10; else i = 20;
System.out.println(i);

Ответ

0
"Else" принадлежит к ближайшему "if" слева. В связи с возможностью неоднозначного понимания, рекомендуется расставлять скобки.

int i = 0;
if (i == 1) {
    if (i == 0) {
        i = 10;
    } else {
        i = 20;
    }
}
System.out.println(i);

среда, 15 августа 2012 г.

Вызываем метод

Всё ли в порядке в коде?

public void go()
{
    ripper(10,11,15,-1);
}

public void ripper(short... args)
{
    System.out.print(args.length);
} 

Ответ

Не скомпилируется
В метод ripper мы передаем int, ожидается short

Объявление массива

Скомпилируется ли?

Object hobject = new Short[4];

Ответ

Да
Каждый массив - это объект

Конструкторы

Что выведет программа?

class Test {
    public static void main(String[] args) {
        Devil dev = new Boast(1);
    }
}

class Boast extends Devil 
{
    public Boast(){System.out.print("boast ");}
    public Boast(int i)
    {}
}

class Devil
{
    public Devil(){System.out.print("devil ");}
    public Devil(int i)
    {}  
}

Ответ

devil
При создании объекта, всегда вызываются конструкторы по умолчанию у родителей, начиная с самого старшего.
Если в конструкторе вызывается конструктор родителя, то конструктор по умолчанию родителя не вызывается

вторник, 14 августа 2012 г.

Статические поля

Что выведет программа?

class T1 extends T {}

class T2 extends T {}

class T {
    public static int i;
}

public class Test {
    public static void main(String[] args) {
        T1.i = 5;
        T2.i = 3;
        System.out.format("%d = %d", T1.i, T2.i);
    }
}

Ответ

3 = 3
Статические поля родительских классов являются общими для наследников

Integer

Что выведет программа?

Integer i1 = Integer.valueOf(11);
Integer i2 = Integer.valueOf(11);
System.out.println(i1 == i2);
        
Integer i3 = Integer.valueOf(10000);
Integer i4 = Integer.valueOf(10000);
System.out.println(i3 == i4);

Ответ

true
false

Класс Integer содержит пул предопределенных объектов (-128...127)

Вызов методов из конструктора

Что выведет программа?

public class Parent {
    Parent() {
        test();
    }
    
    public static void main(String[] args) {
        new Child();
    }
 
    protected void test() {
     System.out.println("Hello from Parent");
    }
}

class Child extends Parent {
    private final String someString;
    Child() {
        someString = "some Text";
    }
    protected void test() {
        System.out.println("Hello from Child");
        System.out.println(someString);
    }
}

Ответ

Hello from Child
null

Если в конструкторе базового класса вызвать метод, который переопределен в дочернем, то при создании дочернего класса в конструкторе базового будет вызван метод дочернего класса, хотя очередь инициализации этого класса еще не настала. Это может привести к ошибкам. Например, вызванный метод может использовать переменные, которые еще не были инициализированы. Надо стараться избегать вызова методов в конструкторах. Можно смело вызывать только методы, помеченные в текущем классе как final или private, т.к. они не переопределяются.

Значение переменных внутри метода

Что выведет программа?

class Test {
    public static void main(String[] args) {
        String s = "old";
        print(s, s = "new");
    }
    
    static void print(String s1, String s2) {
        System.out.println(s1 + " " + s2);
    }
}

Ответ

old new
Внутри вызова метода значения присваиваются разным переменным

Finally

Какое значение вернет метод?

private static int foo() {
    int a = 1;
    int b = 2;
    try  {
        return a + b;
    } finally {
        a = 10;
        b = 20;
        return a + b;
    }
}

Ответ

30
Блок finally должен выполняться всегда, даже если в try есть return. Return внутри finally перебивает предыдущий return.

суббота, 11 августа 2012 г.

Операции с числами

Что выведет программа?

int x = 4;
System.out.println("value is " + ((x > 4) ? 99.99 : 9));

Ответ

value is 9.0
При выполнении сравнения между разными типами, типы приводятся к одному, если это возвожно

Сколько объектов в коллекции?

Что выведет программа?

public class Animal {
    private final String type;
    Animal(String type) {
       this.type = type; 
    }
    
    public boolean equals(Animal animal) {
        return type.equals(animal.type);
    }
    
    public int hashCode() {
        return type.hashCode();
    }

    
    public static void main(String[] args) {
        Set set = new HashSet();
        set.add(new Animal("Dog"));
        set.add(new Animal("Cat"));
        set.add(new Animal("Cat"));
        System.out.println(set.size());
    }
}

Ответ

3
Метод equals должен принимать объекты типа Object, а у нас - Animal. Из-за этого не произошло перезаписи метода и использовался метод equals класса Object. Что бы такого не просходило, надо всегда использовать аннотацию @Override в тех местах, где мы хотим переопределить метод.

пятница, 10 августа 2012 г.

Конкатенация

Что выведет программа?
System.out.println(1 + 2 + 3 + "" + 4 + 5 + 6);

Ответ

6456
Т.к. операции выполняются слева направо, то сначала выполнится сложение, затем конкатенация