Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SCJP exam (java 5.0), помогите разобраться, пожалуйста! 
V
    Опции темы
Pawl
Дата 19.11.2008, 11:56 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 649
Регистрация: 22.4.2008
Где: Витебск

Репутация: 7
Всего: 28



Уважаемые!
Я вот уже год изучаю яву, перехожу на нее с делфи, паскаля, бэйсика (старинного). Хочу ей заниматься профессионально, для чего поставил себе цель для начала получить SCJP-сертификат. Скачал себе Sun.Testkiller.310-055.224q, тренеруюсь помаленьку. Вопросы, в принципе, несложные, разобраться можно, но есть с десяток, ставящих меня в тупик. Если Вы найдете время посмотреть их и обьяснить что к чему, буду Вам очень благодарен!
Вот эти вопросы:

11. static void test() throws Error {
12.     if (true) throw new AssertionError();
13.        System.out.print(“test “);
14. }
15. public static void main(String[] args) {
16.    try { test(); }
17.    catch (Exception ex) { System.out.print(“exception “); }
18.    System.out.print(“end “);
19. }
What is the result?
Ответ - A Throwable is thrown by main. Непонятно, почему? Был также вариант An Exception is thrown by main. Чем плох он? Когда я запускал этот пример, у меня выводилось именно Exception in thread "main" java.lang.AssertionError!
-------------------------------------------------------------------------------------------------------------------
11. public String makinStrings() {
12.    String s = «Fred»;
13.    s = s + «47»;
14.    s = s.substring(2, 5);
15.    s = s.toUpperCase();
16.    return s.toString();
17. }
How many String objects will be created when this method is invoked?
Ответ – 3. Правильно ли я понял, что методы toUpperCase() и toString() класса String не создают новые объекты? И если да, то какие еще не создают?
----------------------------------------------------------------------------------------------------------------------
Assuming that the serializeBanana2() and the deserializeBanana2() methods will correctly use Java serialization and given:
13. import java.io.*;
14. class Food {Food() { System.out.print(«1»); } }
15. class Fruit extends Food implements Serializable {
16.    Fruit() { System.out.print(«2»); } }
17. public class Banana2 extends Fruit { int size = 42;
18.    public static void main(String [] args) {
19.        Banana2 b = new Banana2();
20.        b.serializeBanana2(b); // assume correct serialization
21.        b = b.deserializeBanana2(b); // assume correct
22.        System.out.println(“ restored “+ b.size + “ “); }
23.        // more Banana2 methods
24. }
What is the result?
Ответ – 121 restored 42 именно так и получается, но почему? (в смысле, почему не 12 restored 42 )? Сознаюсь, не очень хорошо знаком с сериализацией!
----------------------------------------------------------------------------------------------------------------------
1. public class Threads1 {
2.    int x=0;
3.    public class Runner implements Runnable {
4.        public void run() {
5.            int current = 0;
6.            for(int i=0;i<4;i++){
7.                current = x;
8.                System.out.print(current + «, «);
9.                x = current + 2;
10.            }
11.        }
12.    }
13.
14.    public static void main(String[] args) {
15.        new Threads1().go();
16.    }
17.
18.    public void go() {
19.        Runnable r1 = new Runner();
20.        new Thread(r1).start();
21.        new Thread(r1 ).start();
22.    }
23. }
Which two are possible results? (Choose two.)
А 0, 2, 4, 4, 6, 8, 10, 6,
В 0, 2, 4, 6, 8, 10, 2, 4,
С 0, 2, 4, 6, 8, 10, 12, 14,
D 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14,
Е 0, 2, 4, 6, 8, 10, 12, 14, 0, 2, 4, 6, 8, 10, 12, 14,
Верные ответы А и С, но непонятно, почему не может быть верен также ответ В? Кстати, при запуске этого примера у меня постоянно получалось 0, 0, 2, 2, 4, 4, 6, 6,
--------------------------------------------------------------------------------------------------------------------
1. import java.util.*;
2.
3. public class NameList {
4.    private List names = new ArrayList();
5.    public synchronized void add(String name) { names.add(name); }
6.    public synchronized void printAll() {
7.        for (int i = 0; i <names.size(); i++) {
8.            System.out.print(names.get(i) +» «);
9.        }
10.    }
11.    public static void main(String[] args) {
12.        final NameList sl = new NameList();
13.        for(int i=0;i<2;i++) {
14.            new Thread() {
15.                public void ruin() {
16.                    sl.add(«A»);
17.                    sl.add(«B»);
18.                    sl.add(«C»);
19.                    sl.printAll();
20.                }
21.            }.start();
22.        }
23.    }
24. }
Which two statements are true if this class is compiled and run? (Choose two.)
A An exception may be thrown at runtime.
B The code may run with no output, without exiting.
C The code may run with no output, exiting normally.
D The code may rum with output “A B A B C C “, then exit.
E The code may rum with output «A B C A B C A B C «, then exit.
F The code may ruin with output “A A A B C A B C C “, then exit.
G The code may ruin with output “A B C A A B C A B C “, then exit.
Интересно, сколько я ни запускал этот пример, на экран ничего не выводилось. Авторы этого вопроса утверждают, что правильные ответы Е и G, но, если на то пошло, почему не может быть верен также ответ F?
---------------------------------------------------------------------------------------------------------------------
public class Transfers {    
    public static void main(String[] args) throws Exception {
        Record r1 = new Record();
        Record r2 = new Record();
        doTransfer(r1, r2, 5);
        doTransfer(r2, r1, 2);
        doTransfer(r1, r2, 1);     
        System.out.println("rl=" + r1.get() + ", r2=" + r2.get());
    }
    
    private static void doTransfer(final Record a, final Record b, final int amount) {
        Thread t = new Thread() {
            public void run() {
                new Clerk().transfer(a, b, amount);
            }
        };
        t.start();
    }
}

class Clerk {    
    public synchronized void transfer(Record a, Record b, int amount){
        synchronized (a) {
            synchronized (b) {
                a.add(-amount);
                b.add(amount);
            }
        }
    }
}

class Record {
    int num = 10;
    public int get() { return num; }
    public void add(int n) { num = num + n; }
}
If Transfers.main() is run, which three are true? (Choose three.)
Cколько я ни запускал этот пример, выводилось rl=10, r2=10. А ответы помечены следующие: А) The output may be “r1 = 6, r2 = 14”, В) The output may be “r1 = 5, r2 = 15” и Е) The code may deadlock (without completing) with no output.
---------------------------------------------------------------------------------------------------------------------
import java.util.TreeSet;
class Drink implements Comparable {
     public String name;
     public int compareTo(Object o) {
        return 0;
     }
 }
public class MinMax {
    public static void main(String[] args) {
        Drink one = new Drink();
        Drink two = new Drink();
        one.name = "Coffee";
        two.name = "Tea";
        TreeSet<Drink> set = new TreeSet<Drink>();
        set.add(one);
        set.add(two);
        for (Drink d: set)
            System.out.print(d.name);
    }
}
What is the result?
В результате выходит Coffee, однако, если в методе public int compareTo(Object o) поставить в return’e не 0 а 1, выходит CoffeeTea объясните, пожалуйста, почему?
-----------------------------------------------------------------------------------------------------------------
Given:
ArrayList a = new ArrayList();
containing the values {«1», «2», «3», «4», «5», «6», «7», «8»}
Which code will return 2?
Ответ - Comparator c = Collections.reverseOrder(); Collections.sort(a, c); int result = Collections.binarySearch(a, «6»,c); честно – не совсем понимаю, как работает метод binarySearch(List<? extends T> list, T key, Comparator<? super T> c) объясните, пожалуйста!
Given classes defined in two different files:
1. package packageA;
2. public class Message {
3. String getText() { return «text»; }
4. }
and:
1. package packageB;
2. public class XMLMessage extends packageA.Message {
3. String getText() { return “<msg>text</msg>”; }
4. public static void main(String[] args) {
5. System.out.println(new XMLMessage().getText());
6. }
7. }
What is the result of executing XMLMessage.main?
Ответ - Compilation fails because of an error in line 3 of XMLMessage. Однако, когда я запускал этот пример, получал <msg>text</msg>! Что это, ошибка разработчиков теста? Ведь для того, чтобы этот ответ был верен, надо чтобы class Message не был public?
--------------------------------------------------------------------------------------------------------------------
A UNIX user named Bob wants to replace his chess program with a new one, but he is hot sure where the old one is installed. Bob is currently able to run a Java chess program starting from his home directory /home/bob using the command: java -classpath /test:/home/bob/downloads/* .jar games.Chess Bob’s CLASSPATH is set (at login time) to: /usr/lib:/home/bob/classes:/opt/java/lib:/opt/java/lib/* .jar 
What is a possible location for the Chess.class file?
Ответ - /test/games/Chess.class В UNIX я не силён, объясните, пожалуйста!

[email protected]


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
Andy_L20066
Дата 19.11.2008, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 10.3.2008

Репутация: нет
Всего: 1



Привет, 
тут на счет первого вопроса с Exception.... все просто... правильный ответ: Throwable,  поскольку AssertionError extends Throwable, а  не Exception. Тут просто надо помнить иерархию иксепшинов... Очень просто ошибиться с этим вопросом...

Другие вопросы пока еще не смотрел...
PM MAIL ICQ   Вверх
rygel
Дата 19.11.2008, 13:22 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 21.9.2007
Где: Харьков

Репутация: 6
Всего: 7



11. static void test() throws Error {
12.     if (true) throw new AssertionError();
13.        System.out.print(“test “);
14. }
15. public static void main(String[] args) {
16.    try { test(); }
17.    catch (Exception ex) { System.out.print(“exception “); }
18.    System.out.print(“end “);
19. }


Точнее AssertionError экстендит Error, а Error  extends Throwable.

потому перехват эксепшенов типа Exception пропустит эксепшены типа Error.

Error и Exception это две разные ветки в иерархии исключений.

Добавлено через 5 минут и 16 секунд
11. public String makinStrings() {
12.    String s = «Fred»;
13.    s = s + «47»;
14.    s = s.substring(2, 5);
15.    s = s.toUpperCase();
16.    return s.toString();
17. }

String s = «Fred»; - в данном случае объект не создается, потому как при такой инициализации компилятор создает пул констант строковых.

String - немодифицируемый, то есть любые модифицирующие действия примененные к его объектам будет возвращать новый объект. А по сему:

 s = s + «47»;             - создаст новый объект
 s = s.substring(2, 5);  - создаст новый объект
 s = s.toUpperCase();  - создаст новый объект
 return s.toString();   - возвращает ссылку на этот же объект.

Итого 3 объекта
PM MAIL   Вверх
rygel
Дата 19.11.2008, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 21.9.2007
Где: Харьков

Репутация: 6
Всего: 7



3. public class NameList {
4.    private List names = new ArrayList();
......

Если нет опечаток то правильный ответ С.

Наследуясь от Thread можно переопределить метод public void run() внутри которого будет выполняться работа нашего потока.

В данном случае метод объявлен иной public void ruin() . Значит когда вызывется метод start - выполнится метод run() класса Thread, и так как он у нас не переопределен поток сразу и завершится.

PM MAIL   Вверх
w1nd
Дата 19.11.2008, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 20
Всего: 54



Цитата(Pawl @  19.11.2008,  11:56 Найти цитируемый пост)
Ответ - /test/games/Chess.class В UNIX я не силён, объясните, пожалуйста!

UNIX тут не причём. Опция -classpath замещает путь, определённый в переменной окружения CLASSPATH, и масок в класс-пути пускач тоже ни разу не понимает. Поэтому всё это развесистое описание можно заменить на следующее: "Боб запускает игру с помощью команды 'java -classpath /test games.Chess'. Где находится файл Chess.class?"


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
rygel
Дата 19.11.2008, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 21.9.2007
Где: Харьков

Репутация: 6
Всего: 7



import java.util.TreeSet;
class Drink implements Comparable {
................

потому что при TreeSet использует comapareTo вместо equals для проверки на равенство объектов + set не содержит одинаковые элементы + TreeSet это упорядоченно множество, а посему если compareTo возвращает 0 - это значит что объекты равны, и второй объект не добавляется в множество, если -1 или 1 то элемент добавляется, но это влияет на порядок элементов.

PM MAIL   Вверх
rygel
Дата 19.11.2008, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 21.9.2007
Где: Харьков

Репутация: 6
Всего: 7



serializeBanana2() :

http://www.rsdn.ru/article/java/scjp_article.xml

"при десериализации объекта класса, реализующего Serializable, его конструктор не выполняется, а поля не инициализируются значениями по умолчанию. Однако если создать сериализуемый (через Serializable) класс, который наследует несериализуемый класс, при десериализации его объекта происходит инициализация по умолчанию полей суперкласса и вызов его конструктора"

Добавлено через 12 минут и 56 секунд
ArrayList a = new ArrayList();
containing the values {«1», «2», «3», «4», «5», «6», «7», «8»}
.................................

http://en.wikipedia.org/wiki/Binary_search_algorithm

в принципе для бинарного поиска важно чтобы коллекция была упорядочена, в данном случае коллекция содержит после сортировки элементы в обратном порядке 8,7,6, - потому 6 занимает позицию 2.
PM MAIL   Вверх
rygel
Дата 19.11.2008, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 21.9.2007
Где: Харьков

Репутация: 6
Всего: 7



package packageB;
public class XMLMessage extends packageA.Message {
................


странно конечно. тут все верно. Метод в классе Message недоступен для наследника, у него доступ package. и объекты классов других package, в том числе и наследники из других package его не увидят. И вызывается в данном коде метод класса XMLMessage.
PM MAIL   Вверх
ivg
Дата 19.11.2008, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 33
Всего: 81



Цитата(Pawl @  19.11.2008,  14:56 Найти цитируемый пост)

Код

public class Threads1 {
   int x=0;
   public class Runner implements Runnable {
      public void run() {
          int current = 0;
          for(int i=0;i<4;i++){
              current = x;
              System.out.print(current + ", ");
              x = current + 2;
           }
       }
   }

   public static void main(String[] args) {
       new Threads1().go();
   }

   public void go() {
       Runnable r1 = new Runner();
       new Thread(r1).start();
       new Thread(r1 ).start();
   }
}

Which two are possible results? (Choose two.)
А 0, 2, 4, 4, 6, 8, 10, 6,
В 0, 2, 4, 6, 8, 10, 2, 4,
С 0, 2, 4, 6, 8, 10, 12, 14,
D 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14,
Е 0, 2, 4, 6, 8, 10, 12, 14, 0, 2, 4, 6, 8, 10, 12, 14,
Верные ответы А и С, но непонятно, почему не может быть верен также ответ В? Кстати, при запуске этого примера у меня постоянно получалось 0, 0, 2, 2, 4, 4, 6, 6,

Два потока, 4 итерации - 8 чисел выводится -> варианты D, E отпадают.
Вариант B: Числа 2 и 4 выводятся по 2 раза, можно показать, что при таком порядке вывода это означает, что они выведены разными потоками. Числа же 6, 8, 10 напротив выведены в одном потоке, это следует из того, что если бы это было не так, то последние два числа должны быть не менее 4. Получаем, что в одном из потоков были выведены 5 чисел, что конечно же быть не может, поскольку итераций всего 4.

Добавлено через 8 минут и 3 секунды
Цитата(Pawl @  19.11.2008,  14:56 Найти цитируемый пост)

Код

public class Transfers {    
    public static void main(String[] args) throws Exception {
        Record r1 = new Record();
        Record r2 = new Record();
        doTransfer(r1, r2, 5);
        doTransfer(r2, r1, 2);
        doTransfer(r1, r2, 1);     
        System.out.println("rl=" + r1.get() + ", r2=" + r2.get());
    }
    
    private static void doTransfer(final Record a, final Record b, final int amount) {
        Thread t = new Thread() {
            public void run() {
                new Clerk().transfer(a, b, amount);
            }
        };
        t.start();
    }
}

class Clerk {    
    public synchronized void transfer(Record a, Record b, int amount){
        synchronized (a) {
            synchronized (b) {
                a.add(-amount);
                b.add(amount);
            }
        }
    }
}

class Record {
    int num = 10;
    public int get() { return num; }
    public void add(int n) { num = num + n; }
}

If Transfers.main() is run, which three are true? (Choose three.)
Cколько я ни запускал этот пример, выводилось rl=10, r2=10. А ответы помечены следующие: А) The output may be “r1 = 6, r2 = 14”, В) The output may be “r1 = 5, r2 = 15” и Е) The code may deadlock (without completing) with no output.

Интересно было бы посмотреть на неправильные ответы. Те что приведены вполне подходят, только вариант E не совсем точен. Deadlock возможен, однако output будет, поскольку выполняется в main потоке.
PM MAIL   Вверх
Kangaroo
Дата 22.11.2008, 03:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 21
Всего: 104



1. Java уже 6.0 надо сдавать smile
2. В следующий раз постарайся нормально оформить пост - разграничь задачи пустыми строками, для оформления кода используй кнопку "Код".

Оставшиеся задачки:
Цитата

1. import java.util.*;
2.
3. public class NameList {
4.    private List names = new ArrayList();
5.    public synchronized void add(String name) { names.add(name); }
6.    public synchronized void printAll() {
7.        for (int i = 0; i <names.size(); i++) {
8.            System.out.print(names.get(i) +» «);
9.        }
10.    }
11.    public static void main(String[] args) {
12.        final NameList sl = new NameList();
13.        for(int i=0;i<2;i++) {
14.            new Thread() {
15.                public void ruin() {
16.                    sl.add(«A»);
17.                    sl.add(«B»);
18.                    sl.add(«C»);
19.                    sl.printAll();
20.                }
21.            }.start();
22.        }
23.    }
24. }
Which two statements are true if this class is compiled and run? (Choose two.)
A An exception may be thrown at runtime.
B The code may run with no output, without exiting.
C The code may run with no output, exiting normally.
D The code may rum with output “A B A B C C “, then exit.
E The code may rum with output «A B C A B C A B C «, then exit.
F The code may ruin with output “A A A B C A B C C “, then exit.
G The code may ruin with output “A B C A A B C A B C “, then exit.
Интересно, сколько я ни запускал этот пример, на экран ничего не выводилось. 

Не выводилось ничего, потому что опечатка - правильный метод run(), а не ruin()
Цитата

Авторы этого вопроса утверждают, что правильные ответы Е и G, но, если на то пошло, почему не может быть верен также ответ F?

Потому что два потока не могут добавить три буквы А подряд.

Цитата

If Transfers.main() is run, which three are true? (Choose three.)
Cколько я ни запускал этот пример, выводилось rl=10, r2=10. А ответы помечены следующие: А) The output may be “r1 = 6, r2 = 14”, В) The output may be “r1 = 5, r2 = 15” и Е) The code may deadlock (without completing) with no output.

Правильных вариантов много.  А вот дедлока тут вроде не должно получиться.




--------------------
Lost....
PM MAIL MSN   Вверх
ivg
Дата 22.11.2008, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 33
Всего: 81



Цитата(Kangaroo @  22.11.2008,  06:00 Найти цитируемый пост)
А вот дедлока тут вроде не должно получиться

Первый поток входит в монитор на r1, второй в монитор на r2 и вуаля... smile

Это сообщение отредактировал(а) ivg - 22.11.2008, 09:58
PM MAIL   Вверх
Kangaroo
Дата 22.11.2008, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 21
Всего: 104



Цитата(ivg @  22.11.2008,  09:58 Найти цитируемый пост)
Первый поток входит в монитор на r1, второй в монитор на r2 и вуаля...

Они вложены:
Код

synchronized (a) {
            synchronized (b) {
                    ...
           }
}

Если кто-то займет "а", то второй "б" не сможет..




--------------------
Lost....
PM MAIL MSN   Вверх
ivg
Дата 22.11.2008, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 33
Всего: 81



Цитата(Kangaroo @  22.11.2008,  15:49 Найти цитируемый пост)
Если кто-то займет "а", то второй "б" не сможет..

порядок аргументов другой для второго потока:
Цитата(Pawl @  19.11.2008,  14:56 Найти цитируемый пост)
Код

        doTransfer(r1, r2, 5);
        doTransfer(r2, r1, 2);

Вообще получение нескольких эксклюзивных блокировок на разных объектах в стеке вызовов одного потока - есть потенциальный кандидат на deadlock.
PM MAIL   Вверх
Kangaroo
Дата 23.11.2008, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 21
Всего: 104



Цитата

порядок аргументов другой для второго потока:

Ааа, точно. Проглядел  smile 


--------------------
Lost....
PM MAIL MSN   Вверх
Pawl
Дата 24.11.2008, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 649
Регистрация: 22.4.2008
Где: Витебск

Репутация: 7
Всего: 28



Спасибо огромное!
Извините, что некоррекно оформил код - первый раз на форуме. Что касается Java 1-6,  то и до нее доберусь помаленьку: скачаю литературу, примеры тестов...
А пока еще 3 вопроса по Sun.Testkiller.310-055.224q, последние! С остальными разобрался, с Вашей помощьюsmile

Given:

Код

7. void waitForSignal() {
8.     Object obj = new Object();
9.     synchronized (Thread.currentThread()) {
10.       obj.wait();
11.       obj.notify();;
12.   }
13.}

Which is true?
Ответ – This code may throw an IllegalStateException. Почему? Мне кажется, что This code may throw an InterruptedException, ведь оно тут никак не обрабатывается, а должно (его может выбросить метод wait())! И вообще, в документации сказано, что методы wait() и notify() выбрасывают IllegalMonitorStateException, а не IllegalStateException!
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
Код

public class Starter extends Thread {
    private int x = 2;
    public static void main(String[] args) throws Exception { new Starter().makeItSo(); }
    public Starter() { x = 5; start(); }
    public void makeItSo() throws Exception { join(); x = x - 1; System.out.println(x); }
    public void run() { x *= 2 }
}

What is the output if the main() method is rum?
Ответ – 9. Я тут не понял, для какого потока вызывается метод join() и как он тут работает (без него получается 4)
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
Given:
Код

11. public void addStrings(List list) {
12.     list.add(”foo”);
13.     list.add(”bar”);
14. }

What must you change in this method to compile without warnings? 
Ответ - change the method signature on line 11 to:public void addStrings(List<? super String> list). Он верен, но я не понимаю, почему? Ведь разве super тут не показывает, что параметр типа в списке имеет нижнюю границу типа String, причем не включая ее? (т.е., в частности, List в таком случае можно инициализировать объектами типа Object ?)




--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
ivg
Дата 25.11.2008, 00:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 33
Всего: 81



Цитата(Pawl @  24.11.2008,  20:13 Найти цитируемый пост)
Which is true?
Ответ – This code may throw an IllegalStateException. Почему?

А х.з. По мне, дак ответом будет: This code throws an IllegalMonitorStateException.
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
Цитата(Pawl @  24.11.2008,  20:13 Найти цитируемый пост)
What is the output if the main() method is rum?
Ответ – 9. Я тут не понял, для какого потока вызывается метод join() и как он тут работает (без него получается 4)

join() приостанавливает работу текущего потока (потока, в котором этот метод вызывается, в данном случае основного потока, выполняющего метод main()), до тех пор пока не завершиться другой поток, на объекте которого вызван метод join() (в данном случае на экземпляре класса Starter, который создан в методе main())
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
Цитата(Pawl @  24.11.2008,  20:13 Найти цитируемый пост)
What must you change in this method to compile without warnings? 
Ответ - change the method signature on line 11 to:public void addStrings(List<? super String> list). Он верен, но я не понимаю, почему? Ведь разве super тут не показывает, что параметр типа в списке имеет нижнюю границу типа String, причем не включая ее? (т.е., в частности, List в таком случае можно инициализировать объектами типа Object ?)

Тут идеология немного другая - множество типов параметра, задаваемое с помощью конструкции <? super String> предназначено для проверки типа параметра в вызывающем коде, т. е., например, следующие вызовы метода addStrings() не должны привести к ошибке компиляции:
Код

    this.addStrings(new ArrayList<String>());
    this.addStrings(new ArrayList<Serializable>());
    this.addStrings(new ArrayList<Comparable<String>>());
    this.addStrings(new ArrayList<CharSequence>());
    this.addStrings(new ArrayList<Object>());
 А теперь поработаем вместо компилятора, и попробуем понять - а для всех ли случаев, с точки зрения вызывающего кода, будет правомерно добавление в лист объекта, ну например, класса Object:
Код

public void addStrings(List<? super String> list) {
    ...
    list.add(new Object());
}

Ответ, конечно же, - нет, поскольку в вызывающем коде, неявное безопасное приведение типов будет обеспечено только для new ArrayList<Object>(), но компилятор заранее не знает какой тип параметра будет в вызывающем коде. А знает он только, что этот тип является супертипом String, следовательно безопасно можно добавить в лист объект класса String или его сабклассов, если бы они были (таковых конечно нет, поскольку String final)
PM MAIL   Вверх
Pawl
Дата 27.11.2008, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 649
Регистрация: 22.4.2008
Где: Витебск

Репутация: 7
Всего: 28



Спасибо всем огромное, разобрался и закрываю тему. Кстати, если кому надо, есть ссылка на образ диска с базой данных вопросов, эмулятором теста и электронной книжкой по SCJP Java-1.6:

http://itbookz.ru/prog/lang/java/5358-scjp...va-6-study.html

Незнаю, правда, сколько она еще будет действовать (сам я качал с нее вчера).


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
Kangaroo
Дата 27.11.2008, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 21
Всего: 104



Цитата(Pawl @  27.11.2008,  12:19 Найти цитируемый пост)
ссылка на образ диска с базой данных вопросов, эмулятором теста и электронной книжкой по SCJP Java-1.6

Там только книжка.. А где бд и эмулятор? smile


--------------------
Lost....
PM MAIL MSN   Вверх
agR
Дата 28.11.2008, 18:54 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 19.7.2006
Где: Киев

Репутация: 2
Всего: 2



Вот. Скачал с рапиды.
PM MAIL ICQ   Вверх
Kangaroo
Дата 30.11.2008, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 21
Всего: 104



agR, спасибо  smile  

Держи плюса  smile 


--------------------
Lost....
PM MAIL MSN   Вверх
Pawl
Дата 1.12.2008, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 649
Регистрация: 22.4.2008
Где: Витебск

Репутация: 7
Всего: 28





--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
Kangaroo
Дата 1.12.2008, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 21
Всего: 104



Pawl, это тоже самое? Или новое что-то?

Добавлено через 56 секунд
Вроде тоже самое... Другим будет полезно.


--------------------
Lost....
PM MAIL MSN   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1580 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.