Учебно-методические материалы для студентов кафедры АСОИУ

Самостоятельная работа студентов

Самостоятельная работа студентов – способ активного, целенаправленного приобретения студентом новых для него знаний и умений без непосредственного участия в этом процессе преподавателей.

Организационные мероприятия, обеспечивающие нормальное функционирование самостоятельной работы студента, должны основываться на следующих предпосылках:

Результаты самостоятельной подготовки проявляются в активности студента на занятиях и качественном уровне сделанных домашних заданий и курсовых проектов, а также в результатах текущего контроля.

В большинстве случаев поощряется коллективная работа студентов с целью выработки навыков неформальной дисциплины и взаимного общения, не мешающего работе других. Если ты не понял – сначала спроси товарища, а уже затем обращайтесь к преподавателю. Если товарищ понял быстрее, ему будет полезно объяснить тебе, если он только думал, что понимает, он выявит свою дыру и вместе учащиеся смогут задать более глубокий и точный вопрос.

Самостоятельна работа с веб-ресурсами

Языка Java является на сегодняшний день одним из самых распространенных. В глобальной сети Интернет можно найти почти все аспекты его возможного использования. Существуют целые веб-порталы с разборами конструкций языка и примерами кода, статьями, как по самому языку, так и по отдельным технологиям, базирующимся на языке Java и популярным средствам разработки.

Основными ресурсами для начального изучения могут стать:

Ниже приведён список Java-пакетов, в которых студент должен свободно ориентироваться. Знакомиться с ними рекомендуется как по JSDK-документации, так и с помощью www.exampledepot.com. Все пакеты выстроены в рекомендуемом порядке для изучения:

Для расширения кругозора также рекомендуются следующие ресурсы:

Язык Java не заканчивается знаниями лишь о возможностях JSDK. Чтобы чувствовать себя комфортно необходимо знать еще десятка два сторонних библиотек, используемых Java программистами повсеместно:

Средства разработки

Существенную роль в освоении дисциплины играют и применяемые средства разработки. В общем случае исходный код на Java можно писать и в простом текстовом редакторе, а потом выполнять компиляцию из командной строки. Но все же удобнее использовать какую-нибудь профессиональную среду разработки, например из числа этих:

Разбор тестовых заданий

В данном разделе приводятся тестовые вопросы с подробным разбором правильных ответов по дисциплине «Объектно-ориентированное программирование на Java». Рекомендуется в сложных вопросах при их разборе обращаться к дополнительной литературе (см. книги по Java), а также к JSDK-документации.

Вопрос 1. Каков будет результат выполнения программы

1. public class Test {
2. public Test() {
3. }
4.
5. public static void main(String[] args) {
6. Test test = new Test();
7. int i = 5;
8. while(i = 5){
9. System.out.println(i++);
10. }
11. }
12. }

Варианты ответов

  1. а) Компилятор выдаст сообщение об ошибке в строке 8
  2. б) На консоль будут последовательно выведены значения 01234
  3. в) На консоль будут последовательно выведены значения 43210
  4. г) Программа откомпилируется, но на консоль ничего выведено не будет

Правильный ответ а). В операторе while может быть использовано только булево значение. В данном случае используется оператор присваивания, а не сравнения, таким образом, компилятор выдаст ошибку.

Вопрос 2. Приведенная ниже программа должна вывести на консоль Hello World! Выберите строки, которые нужно модифицировать в программе, что бы получить правильный результат.

1. public class Test {
2. public Test() {
3. }
4. public static void main(String[] args) {
5. Test test = new Test();
6. String [] arr = {"H","e","l","l","o","
","w","o","r","l","d","!"};
7. String result = "";
8. int i= 0;
9. for(;;;){
10. result += arr[i++];
11. }
12. System.out.println(result);
13. }
14. }

Варианты ответов

  1. а) Заменить строку 9 на for ( i = 0; i < arr. length ;){
  2. б) Заменить строку 9 на for(int int i = 0; i < arr.length;){
  3. в) Заменить строку 9 на for(i = 0; i < arr.length;i++){
  4. г) Заменить строку 9 на for(i = 1; i <= arr.length;i++){

Правильный ответ а). Ответ б) неверен, так как переменная i уже определена в методе main. Область видимости переменной (если она объявлена в цикле for) будет ограничиваться лишь телом цикла. Однако в данном случае переменная с таким именем уже объявлена в теле метода и соответственно находится в той же области видимости. Если переменная была бы объявлена, как переменная класса, то этот код откомпилировался бы вполне успешно. Ответ в) не является верным так как, увеличение значения i в теле цикла будет произведено дважды, т.о. на печать будут выведены лишь четные элементы массива. Ответ г) не является верным по двум причинам. Первая – элементы массива нумеруются с 0, соответственно первым будет выбран второй элемент массива, вторая – когда выполнится условие окончания цикла, будет нарушена граница массива и будет вызвано исключение IndexOfBoundException.

Вопрос 3. Какая строка будет выдана на консоль после выполнения фрагмента кода приведенного ниже.

1. public class Test {
2. public Test () {
3. }
4. public static void main ( String [] args ) {
5. int i, j ;
6. lab : for ( i = 0; i < 6; i++){ 7. for (j = 3; j > 1; j--){
8. if(i == j){
9. System.out.println(" " + j);
10. break lab;
11. }
12. }
13. }
14. }
15. }

Варианты ответов

  1. а) 2345
  2. б) 234
  3. в) 3
  4. г) 2

Правильный ответ б). Условие if в данном примере будет выполнено, когда переменные i и j будут равны 2. После чего на консоль будет выведено 2 и выполнится оператор break. Т.к. break содержит ссылку на метку, то будет прерван не текущий цикл (внутренний, по переменной j), а цикл по переменной i (внешний), т.о. выполнение программы будет прекращено.

Вопрос 4. Какой результат следует ожидать при компиляции и запуске приведенного кода:

String str=new String("Java");
int i=1;
char j=3;
System.out.println(str.substring(i,j)); 

Варианты ответов

  1. а) Выведено: Ja
  2. б) Выведено: av
  3. в) Выведено: ava
  4. г) Ошибка: не существует метода substring(int,char).

Правильный ответ б). Числовые расширения используются для того, чтобы приводить операнды числовой операции к общему типу так, чтобы действие могло выполняться. В некоторых операциях, которые дают значения числового типа, одноместное числовое расширение применяется к отдельному операнду: если операнд имеет тип byte, short или char, одноместное числовое расширение расширяет его до значения типа int расширяющим преобразованием. Иначе, одноместный числовой операнд остается как есть и не преобразовывается.

Вопрос 5. Какой метод следует использовать, чтобы обнаружить позицию буквы v в строке str= "Java"?

Варианты ответов

  1. а) mid (2, str )
  2. б) str.charAt (2)
  3. в) str.indexOf ('v')
  4. г) indexOf (str,'v')

Правильный ответ в). Для решения этой или подобной задачи советую смотреть документацию по Java: http://java.sun.com/javase/6/docs/api/.

Вопрос 6. Что будет выведено в результате компиляции и запуска следующего кода:

 String str =" ava ";
char ch ='J';
ch += str ;
System. out. println ( ch ); 

Варианты ответов

  1. а) Java
  2. б) ava
  3. в) avaJ
  4. г) J
  5. д) Ошибка во время компиляции.

Правильный ответ д). Не определена операция += для char String. И String не может привести к int и char к String.

Вопрос 7. Что будет результатом компиляции и выполнения следующего кода?

StringBuffer s= new StringBuffer("You Java");
s.insert(2, "like ");
System.out.print(s);

Варианты ответов

  1. а) Yolike u Java
  2. б) You like Java
  3. в) Ylike ou Java
  4. г) You Java like
  5. д) Ошибка компиляции: метод insert() не объявлен для класса String-Buffer

Правильный ответ а). Класс StringBuffer является близнецом класса String, но, в отличие от последнего, содержимое и размеры объектов класса StringBuffer можно изменять. Метод insert в нём определён, индексирование для Java стандартное, т.е. с нуля.

Вопрос 8. Что будет выведено при попытке компиляции и запуска этой программы:

public class Quest6 {
public static void main(String[] args){
int a[] = new int[]{1,2,3,};
System.out.print(a[1]);
} }

Варианты ответов

  1. а) Ошибка компиляции: не определен размер массива
  2. б) Ошибка времени выполнения
  3. в) Выведено 1
  4. г) Выведено 2
  5. д) Ошибка компиляции: неправильная инициализация

Правильный ответ г). Если ошибка синтаксиса должно было бы быть 1, если во времени выполнение непозволительные аргументы или с неопределённой ссылкой -2, в данном случае ошибок нет.

Вопрос 9. Что будет выведено при попытке компиляции и запуска программы?

public class Quest8{
static int j=2;
public static void result(int i){
i *= 10;
j += 2;
}
public static void main(String[] args){
char i = ’1’;
result(i);
System.out.println(i+" "+j);
} }

Варианты ответов

  1. а) 1 2
  2. б) 10 2
  3. в) Ошибка: параметр метода result() не сочетается с передаваемой переменной
  4. г) 10 4
  5. д) 1 4

Правильный ответ д). Ответ в) неверен, т.к. char приводится к int (в этом его особенность и уникальность). Символ «1» переводится к числу «1», к j прибавляется функции result ещё 2 (итого 2 + 2 = 4). Переменная j объявлена как static, но это означает лишь то, что она, как любая другая static переменная, является единственной для всех объектов данного класса, но изменять её значение можно.

Вопрос 10. Что будет выведено при компиляции и запуске кода?

public class Quest {
{System.out.print("1");}
static{System.out.print("2");}
Quest(){System.out.print("3");}
public static void main(String[] args) {
System.out.print("4");
} }

Варианты ответов

  1. а) 34
  2. б) 24
  3. в) 14
  4. г) 4
  5. д) 1234
  6. е) 234

Правильный ответ б). При запуске приложения выполняются только статические логические блоки класса приложения и тело метода main().

Вопрос 11. Какие из следующих утверждений истинные?

Варианты ответов

  1. а) Частные методы не могут быть перегружены
  2. б) Переопределенный метод не может включать исключения не обрабатываемые в базовом классе
  3. в) Методы, объявленные как final, не могут быть переопределены
  4. г) Статические методы не могут быть переопределены

Правильный ответ в).

Вопрос 12. Что произойдет в результате компиляции и запуска кода?

class Base {}
class A extends Base {}
public class Quest{
public static void main(String[] args){
Base b = new Base();
A ob = (A) b;
} } 

Варианты ответов

  1. а) Ошибка во время выполнения
  2. б) Ничего: компиляция и выполнение без ошибок
  3. в) Ошибка во время компиляции

Правильный ответ в). Во время выполнения при попытке преобразования с сужением типа будет сгенерировано исключение ClassCastException.

Вопрос 13. Что произойдет в результате компиляции и запуска кода?

abstract class QuestBase {
abstract void show();
static int i;
}
public class Quest2 extends QuestBase {
public static void main(String[] args){
boolean[] a = new boolean[3];
for(i = 0; i < a.length; i++)
System.out.print(“ ” + a[i]); } }

Варианты ответов

  1. а) Ошибка времени компиляции: Quest2 должен быть объявлен как abstract
  2. б) Ошибка времени выполнения: IndexOutOfBounds
  3. в) будет выведено: true true true
  4. г) будет выведено: false false false
  5. д) Ошибка: массив a использован прежде, чем проинициализирован

Правильный ответ а). Код не будет откомпилирован, так как подкласс наследует абстрактный класс и при этом не реализует его абстрактный метод м сам не объявлен как абстрактный.

Вопрос 14. Какие из объявлений корректны, если:

 class Outer {
class Inner {
} }

Варианты ответов

  1. а) new Outer.Inner ()
  2. б) Outer.new Inner ()
  3. в) new Outer.new Inner ()
  4. г) new Outer().new Inner()
  5. д) Outer.Inner()
  6. е) Outer().Inner()
  7. ж) Ни одно из приведенных.

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

Вопрос 15. Что будет выведено в результате компиляции и выполнения следующего кода:

 abstract class Abstract {
abstract Abstract meth ();
}
class Owner {
Abstract meth () {
class Inner extends Abstract {
Abstract meth() { System.out.print("Inner ");
return new Inner();
}	}
return new Inner();
} }
public abstract class Quest4 {
public static void main(String a[]) {
Owner ob = new Owner();
Abstract abs = ob.meth();
abs.meth();
} }

Варианты ответов

  1. а) Inner
  2. б) Inner Inner
  3. в) Inner Inner Inner
  4. г) Compile time error
  5. д) Runtime error
  6. е) Ошибка компиляции из-за двойного объявления meth() в классе Owner

Правильный ответ а). В результате выполнения кода Owner ob = new Owner(); будет создан объект Owner. Его метод meth() создаст объкт типа Inner в результате выполнения кода Abstract abs = ob.meth(); При его выполнении на консоль ничего выведено не будет, так как метод meth() класса Inner, выводящий на консоль строку inner, будет вызван только один раз командой abs.meth().

Вопрос 16. Что будет выведено в результате компиляции и выполнения этого кода?

import java.awt.*;
public class Quest2 extends Frame{ Quest2(){
Button yes = new Button("YES");
Button no = new Button("NO");
add(yes);
add(no);
setSize(100, 100);
setVisible(true);
}
public static void main(String[] args){
Quest2 q = new Quest();
} } 

Варианты ответов

  1. а) Две кнопки рядом, занимающие весь фрейм, YES слева и NO справа
  2. б) Одна кнопка YES, занимающая целый фрейм
  3. в) Одна кнопка NO, занимающая целый фрейм
  4. г) Две кнопки наверху фрейма, YES и NO

Правильный ответ в). По умолчанию у Frame менеджер компоновки BorderLayout, а у BorderLayout, если не указан второй аргумент, то элемент является BorderLayout.CENTER.

Вопрос 17. Какой менеджер компоновок размещает компоненты в таблице с ячейками равного размера?

Варианты ответов

  1. а) FlowLayout
  2. б) GridLayout
  3. в) BorderLayout
  4. г) CardLayout

Правильный ответ б). FlowLayout – менеджер поточной компоновки. CardLayout создает вкладки, содержимое которых отображается при выполнении щелчка на заголовке. BorderLayout позволяет позиционировать элементы в областях фиксированного размера, граничащих со сторонами фрейма, которые обозначаются параметрами: NORTH, SOUTH, EAST, WEST. Остальное пространство обозначается как CENTER. GridLayout разделяет фрейм на заданное количество рядов и колонок.

Вопрос 18. Какое выравнивание устанавливается по умолчанию для менеджера размещений FlowLayout?

Варианты ответов

  1. а) Указывается явно
  2. б) FlowLayout.RIGHT
  3. в) FlowLayout.LEFT
  4. г) FlowLayout.CENTER
  5. д) FlowLayout. LEADING

Правильный ответ в).

Вопрос 19. Сколько кнопок будет выведено в апплет:

 import java.applet.*; import java.awt.*;
public class Quest4 extends Applet{
Button b = new Button("Yes");
public void init(){
add(b);
add(b);
add(b);
add(new Button("No"));
add(new Button("No"));
add(new Button("No"));
}}

Варианты ответов

  1. а) 1 кнопка с надписью ''Yes'' и 1 кнопка с надписью ''No''
  2. б) 1 кнопка с надписью ''Yes'' и 3 кнопки с надписью ''No''
  3. в) 3 кнопки с надписью ''Yes'' и 1 кнопка с надписью ''No''
  4. г) 3 кнопки с надписью ''Yes'' и 3 кнопки с надписью ''No''

Правильный ответ б). Команда add(b), вызванная во второй раз, пытается добавить на аплет уже существующий там объект. Команда add(new Button("No")) каждый раз добавляет новый объект.

Вопрос 20. Объект JСheckBox объявлен следующим образом:

 JCheckBox ob = new JCheckBox();

Какая из следующих команд зарегистрирует его в блоке прослушивания событий?

Варианты ответов

  1. а) addItemListener(this)
  2. б) addItemListener()
  3. в) ни одна из приведенных
  4. г) ob. addItemListener ()
  5. д) ob. addItemListener ( this )

Правильный ответ д). Метод всегда вызывается объектом, который необходимо зарегистрировать. В качестве параметра должен передаваться объект приложения или апплета, в котором размещается данный компонент, если он реализует соответствующий интерфейс.

Вопрос 21. Что будет выведено в результате компиляции и выполнения следующего кода?

import java.awt.*;
class Quest5 extends Thread implements Runnable{
public static void main(String[] args) {
Component btn = new Button(" Кнопка 1"); System.out.println(((Button) btn).getLabel());
} }

Варианты ответов

  1. а) Кнопка 1
  2. б) Ошибка компиляции: Quest5 должен наследоваться от Applet
  3. в) Ошибка компиляции: не определен метод run() интерфейса
  4. г) Ошибка компиляции: ссылка на Component не может быть инициализирована объектом Button
  5. д) Ошибка времени выполнения
  6. е) Ничего не будет выведено

Правильный ответ а). Объекты из пакета AWT могут объявляться и вызывать свои методы из любых приложений.

Вопрос 22. Какой код читает параметр count в переменную i в этом фрагменте кода?

 < applet code=MyApplet.class width=200 height=200> < param name=count value=5> < /applet> 

Варианты ответов

  1. а) int i = getIntParameter(''count'')
  2. б) int i = getParameter(''count'')
  3. в) int i = new Integer(getIntParameter(''count'')).intValue()
  4. г) int i = new Integer(getParameter(''count''))
  5. д) int i = new Integer(getParameter(''count'')).intValue()

Правильный ответ д).

Вопрос 23. В пользовательском методе show() был изменен цвет фона (background) апплета. Какой метод должен быть вызван, чтобы это было визуализировано?

Варианты ответов

  1. а) draw ()
  2. б) start ()
  3. в) repaint()
  4. г) setColor()
  5. д) setbgcolor()

Правильный ответ в). Для того чтобы изменения цвета фона стали видны пользователю, требуется перерисовка всего атлета вызовом метода paint(). Это действие можно выполнить, вызвав методы repaint() или update().

Вопрос 24. Выбрать необходимое условие принадлежности класса к апплетам?

Варианты ответов

  1. а) Наследник класса Applet и у него должен отсутствовать метод main()
  2. б) Наследник класса Applet или его подкласса
  3. в) Наследник класса Applet и в нем необходимо переопределить унаследованный от класса Applet метод paint()
  4. г) Наследник класса Applet и в нем необходимо переопределить унаследованный от класса Applet метод init()
  5. д) Наследник класса Applet и все его методы должны быть объявлены со спецификатором public

Правильный ответ б).

Вопрос 25. Что будет выведено в результате компиляции и запуска такого кода:

import java.awt.*;
import java.awt.event.*;
public class Quest3 extends Frame implements WindowListener{
public Quest3(){
setSize(300,300);
setVisible(true);
}
public void windowClosing(WindowEvent e){
System.exit(0);
}
public static void main(String args[]){
Quest3 q = new Quest3 ();
} }

Варианты ответов

  1. а) Ошибка компиляции
  2. б) Компиляция и запуск с выводом пустого фрейма
  3. в) Компиляция без запуска
  4. г) Ошибка времени выполнения

Правильный ответ a) Попытка компилировать данный код приведёт к ошибке вследствие того, что часть методов интерфейса WindowListener не реализована в классе Quest3.

Вопрос 26. Что будет выведено в результате компиляции и запуска приведенного кода?

class Quest implements Runnable{
int i=0;
public int run(){
System.out.println("i="+ ++i);
return i;
}}
public class Quest1 {
public static void main(String[] args) {
Quest ob = new Quest();
ob.run();
}}

Варианты ответов

  1. а) Ошибка компиляции: неправильно определен метод run()
  2. б) Ошибка времени выполнения: поток запускается методом start()
  3. в) Ошибка компиляции: Объект ob нужно создавать, используя конструктор класса Thread
  4. г) i=1
  5. д) i=0

Правильный ответ а). Объект потока создаётся только после вызова конструктора класса Thread или его подкласса, но к ошибке компиляции создание такого объекта, как в примере, не приведёт. Поток всегда запускается вызовом метода start(). Результатом же вызова метода run() будет выполнение кода метода run, никак не связанное с потоком. В данной ситуации ошибка компиляции произойдёт из-за того, что сигнатура метода run() в интерфейсе Runnable не совпадает с его реализацией в классе Quest, т.е. метод не реализован и класс Quest должен быть объявлен как abstract.

Вопрос 27. Что будет выведено в результате компиляции и запуска приведенного кода?

 class Quest5 extends Thread { Quest5 () { }
Quest5 (Runnable r) { super(r); } public void run() {
System.out.print("YES "); }
public static void main(String[] args) {
Runnable r = new Quest5(); //1
Quest5 t = new Quest5(r); //2
t.run(); } }

Варианты ответов

  1. а) YES YES
  2. б) Ошибка компиляции в строке //1
  3. в) Ошибка компиляции в строке //2
  4. г) YES

Правильный ответ г). При запуске приложения будет создано два потока r и t, но стартует только второй. Поток t инициирован с использованием ссылки на первый поток. Это обстоятельство в данном контексте не оказывает влияния на выполнение второго потока. В итоге метод run() будет вызван только один раз.

Вопрос 28. Что произойдет при попытке компиляции и запуска программы?

import java.util.*;
class Quest4 {
public static void main (String args[]) {
Object ob = new HashSet();
System.out.print((ob instanceof Set)+",");
System.out.print(ob instanceof SortedSet);
}}

Варианты ответов

  1. а) true, false
  2. б) true, true
  3. в) false, true
  4. г) false, false
  5. д) ничего из вышеперечисленного

Правильный ответ а).

Вопрос 29. Корректен ли следующий код? Если нет, то какие исправления можно предложить?

byte b[]={1, 2, 3};
Object o=b;
o=new String[]{“”, “a”, “b”};
String s[]=o;

Правильный ответ нет. В четвертой строке делается попытка неявного сужения типов от Object к String[]. Такое действие нужно делать явно: String s[]=(String[])o.

Вопрос 30. Корректно ли следующее обращение к переменной x?

public class Test {
static void perform() {
...
}
private Test x;
public static void main(String s[]) {
x.perform(); // корректно ли это выражение?
}
}

Правильный ответ «нет». Хотя при обращении к статическим элементам через имя переменной, используется лишь ее тип, а не значение, в данном примере производится попытка обратиться к динамической переменной из статического метода, чего делать нельзя, несмотря на то, что для вычисления выражения требуется лишь тип переменной.

Вопрос 31. Можно ли при переопределении некоторого абстрактного метода perform() использовать выражение super.perform()?

Правильный ответ нет. Выражение super.perform() означает полноценный вызов родительского метода, что невозможно, если у него отсутствует тело, что верно для абстрактных методов.

Вопрос 32. Как реализованы в классе Object методы equals(), toString(), hashCode() ?

Правильный ответ: в классе Object методы equals(), toString() и hashCode() имеют следующие реализации:

Вопрос 33. Какие действия необходимо предпринять для установления TCP-соединения между двумя Java-приложениями?

Правильный ответ: во-первых, на стороне сервера надо создать экземпляр класса Server Socket с указанием порта, и затем вызвать у этого объекта метод accept(). При входе в этот метод поток исполнения приостанавливает свою работу в ожидании подключения клиента. Клиенту необходимо создать экземпляр класса Socket с указанием IP-адреса и порта сервера. После успешного выполнения конструктора на стороне сервера метод accept() вернет экземпляр класса Socket для взаимодействия двух приложений.

Вопрос 34. Какие объекты могут быть клонированы?

Правильный ответ: если клонирование производится встроенным методом Object.clone(), то такие классы необходимо специальным образом помечать, указывая, что они реализуют интерфейс Cloneable. Кроме этого, класс может переопределить метод clone() собственным образом, и обойтись без этого интерфейса.

CC-BY-CA Юдин Е.Б., 05.02.2013