среда, 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
Т.к. операции выполняются слева направо, то сначала выполнится сложение, затем конкатенация