Чтение онлайн

на главную - закладки

Жанры

Java: руководство для начинающих
Шрифт:

Помимо очереди, в программах часто используется структура данных, которая называется стеком. Обращение к стеку осуществляется по принципу “первым пришел — последним обслужен“. Стек можно сравнить со стопкой тарелок, стоящих на столе. Последней берется тарелка, поставленная на стол первой. Создайте класс Stack, реализующий стек для хранения символов. Используйте методы push и pop для манипулирования содержимым стека. Пользователь класса Stack должен иметь возможность задавать размер стека при его создании. Все члены класса Stack, кроме методов push и pop , должны быть объявлены как private. (Подсказка: в качестве заготовки можете воспользоваться классом Queue, изменив в нем лишь способ доступа к данным.) // Класс, реализующий стек для хранения символов, class Stack { private char stck[]; // Массив для хранения

элементов стека private int tos; // Вершина стека. // построить пустой стек заданного размера Stack(int size) { stck = new char[size]; // выделить память для стека tos = 0; } // построить один стек из другого стека Stack(Stack ob) { tos = ob.tos; stck = new char[ob.stck.length]; // скопировать элементы for(int i=0; i < tos; i++) stck[i] = ob.stck[i]; } // построить стек с исходными значениями Stack(char а[]) { stck = new char[a.length]; for(int i = 0; i < a.length; i++) { push(a[i]); } } // поместить символы в стек void push(char ch) { if(tos==stck.length) { System.out.println(" — Stack is full."); return; } stck[tos] = ch; tos++; } // извлечь символы из стека char pop { if(tos==0) { System.out.println(" — Stack is empty."); return (char) 0; } tos—; return stck[tos]; } } // продемонстрировать применение класса Stack class SDemo { public static void main(String args[]) { // создать пустой стек на 10 элементов Stack stkl = new Stack(lO); char name[] = {'T1, 'o', 'm'}; // построить стек из массива Stack stk2 = new Stack(name); char ch; int i; // поместить символы в стек stkl for(i=0; i < 10; i++) stkl.push((char) ('A' + i)); // построить один стек из другого стека Stack stk3 = new Stack(stkl); // отобразить стеки System.out.print("Contents of stkl: "); for(i=0; i < 10; i++) { ch = stkl.pop; System.out.print(ch); } System.out.println("\n"); System.out.print("Contents of stk2: "); for(i=0; i < 3; i++) { ch = stk2.pop; System.out.print(ch); } System.out.println("\n"); System.out.print("Contents of stk3: "); for(i=0; i < 10; i++) { ch = stk3.pop; System.out.print(ch); } } } Ниже приведен результат выполнения данной программы. Contents of stkl: JIHGFEDCBA Contents of stk2: moT Contents of stk3: JIHGFEDCBA

Допустим, имеется следующий класс: class Test { int a; Test(int i) { a = i; } } Напишите метод swap , реализующий обмен содержимым между двумя объектами типа Test, на которые ссылаются две переменные данного типа. void swap(Test obi, Test ob2) { int t; t = obi.a; obi.a = ob2.a; ob2.a = t; }

Правильно ли написан следующий фрагмент кода? class X { int meth(int a, int b) { ... } String meth(int a, int b) { ... } Нет, неправильно. Перегружаемые методы могут возвращать значения разного типа, но это не играет никакой роли для определения подобных методов во время их перегрузки. Перегружаемые методы должны иметь в своих списках разнотипные параметры.

Напишите рекурсивный метод, отображающий строку задом наперед. // Отображение строки задом наперед с помощью рекурсии, class Backwards { String str; Backwards(String s) { str = s; } void backward(int idx) { if(idx != str.length-1) backward(idx+1); System.out.print(str.charAt(idx) ) ; } } class BWDemo { public static void main(String args[]) { Backwards s = new Backwards("This is a test"); s.backward(0); } }

Допустим, что все объекты класса должны совместно пользоваться одной и той же переменной. Как объявить такую переменную? Переменная, предназначенная для совместного использования, должна быть объявлена как static.

Для чего может понадобиться статический блок? Статический блок служит для выполнения любых инициализирующих действий в классе до создания конкретных объектов.

Что такое внутренний класс? Внутренний класс — это нестатический вложенный класс.

Допустим, требуется член класса, к которому могут обращаться только другие члены этого же класса. Какой модификатор доступа следует использовать в его объявлении? Модификатор доступа private.

Имя метода и список его параметров вместе составляют метода. сигнатуру

Если методу передается значение типа int, то в этом случае используется передача параметра по . значению

Создайте метод sum с аргументами переменной длины для суммирования передаваемых ему значений типа int. Метод должен возвращать результат суммирования. Продемонстрируйте его в действии. Существует

много вариантов решения данной задачи. Ниже представлен один из них. Приложение А. Ответы на вопросы для самопроверки 571 class Sumlt { int sum(int ... n) { int result = 0; for(int i = 0; i < n.length; i++) result += n[i]; return result; } } class SumDemo { public static Void main(String args[]) { Sumlt siObj = new Sumlt; int total = siObj.sum(l, 2, 3); System.out .println (1,Sum is " + total); total = siObj.sum(l, 2, 3, 4, 5); System.out.println("Sum is " + total); } }

Можно ли перегружать метод с аргументами переменной длины? Да, можно.

Приведите пример неоднозначного вызова перегружаемого метода с переменным числом аргументов. Ниже приведен один из вариантов перегружаемого метода с переменным числом аргументов, при вызове которого проявляется неоднозначность. double myMeth(double ... v ) { // ... double myMeth(double d, double ... v) { // ... Если попытаться вызвать метод myMeth с одним аргументом следующим образом: myMeth(1.1); то компилятор не сможет определить, какой именно метод вызывается. Глава 7. Наследование

Имеет ли суперкласс доступ к членам подкласса? Имеет ли подкласс доступ к членам суперкласса? Нет, не имеет. Суперклассу ничего не известно о существовании подклассов. Подклассы действительно могут обращаться ко всем членам суперкласса, кроме тех, которые объявлены как закрытые (private).

Создайте подкласс Circle, производный от класса TwoDShape. В нем должен быть определен метод area , вычисляющий площадь круга, а также конструктор с ключевым словом super для инициализации членов, унаследованных от класса TwoDShape. // Подкласс, производный от класса TwoDShape для формы круга, class Circle extends TwoDShape { // Конструктор по умолчанию Circle { super; } // Конструктор класса Circle Circle(double х) { super(x, "circle"); // вызвать конструктор суперкласса } // создать новый объект из имеющегося объекта Circle(Circle ob) { super(ob); // передать объект конструктору класса ?PwoDShape } double area { return (getWidth /2) (getWidth / 2) 3.1416; } }

Как предотвратить обращение к членам суперкласса из подкласса? Для того чтобы предотвратить доступ к членам суперкласса из подкласса, эти члены следует объявить как закрытые (private).

Опишите назначение и два варианта использования ключевого слова super. Ключевое слово super используется в двух случаях. Во-первых, с его помощью вызывается конструктор суперкласса. В этом случае общая форма вызова имеет следующий вид: super (списокпараметров) ; И во-вторых, это ключевое слово обеспечивает доступ к членам суперкласса. Ниже приведена общая форма такого доступа. super.членкласса

Допустим, имеется следующая иерархия классов: class Alpha { ... class Beta extends Alpha { ... Class Gamma extends Beta { ... В каком порядке вызываются конструкторы этих классов при создании объекта класса Gamma? Конструкторы всегда вызываются в порядке наследования. Таким образом, при создании экземпляра класса Gamma будет сначала вызван конструктор Alpha, затем Beta и, наконец, Gamma.

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

Что такое абстрактный класс? Приложение А. Ответы на вопросы для самопроверки 573 Абстрактным называется такой класс, который содержит хотя бы один абстрактный метод.

Как предотвратить переопределение метода? И как предотвратить наследование класса? Для того чтобы метод нельзя было переопределить, его нужно объявить как final. А для того чтобы предотвратить наследование от класса, его следует объявить как final.

Объясните, каким образом механизмы наследования, переопределения методов и абстрактные классы используются для поддержки полиморфизма. Наследование, переопределение методов и абстрактные классы поддерживают полиморфизм и позволяют создать обобщенную структуру, реализуемую различными классами. Так, абстрактный класс определяет согласованный интерфейс, общий для всех реализующих его классов. Такой подход соответствует принципу “один интерфейс — множество методов”.

Поделиться:
Популярные книги

Мастер...

Чащин Валерий
1. Мастер
Фантастика:
героическая фантастика
попаданцы
аниме
6.50
рейтинг книги
Мастер...

Жених из гроба

Сотис Майя
1. Гробокопательница
Фантастика:
юмористическое фэнтези
сказочная фантастика
фэнтези
5.00
рейтинг книги
Жених из гроба

Ищу жену с прицепом

Рам Янка
2. Спасатели
Любовные романы:
современные любовные романы
6.25
рейтинг книги
Ищу жену с прицепом

Гримуар тёмного лорда I

Грехов Тимофей
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Гримуар тёмного лорда I

Заклятие предков

Прозоров Александр Дмитриевич
3. Ведун
Фантастика:
фэнтези
альтернативная история
8.49
рейтинг книги
Заклятие предков

Крепость над бездной

Лисина Александра
4. Гибрид
Фантастика:
боевая фантастика
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Крепость над бездной

Рота Его Величества

Дроздов Анатолий Федорович
Новые герои
Фантастика:
боевая фантастика
8.55
рейтинг книги
Рота Его Величества

Экспансия: Сотрудничество. Том 5

Белов Артем
5. Планетарный десант
Фантастика:
боевая фантастика
аниме
5.00
рейтинг книги
Экспансия: Сотрудничество. Том 5

Отверженный III: Вызов

Опсокополос Алексис
3. Отверженный
Фантастика:
фэнтези
альтернативная история
7.73
рейтинг книги
Отверженный III: Вызов

Князь Серединного мира

Земляной Андрей Борисович
4. Страж
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Князь Серединного мира

Возвышение Меркурия. Книга 8

Кронос Александр
8. Меркурий
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 8

Эволюционер из трущоб. Том 5

Панарин Антон
5. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб. Том 5

Локки 7. Потомок бога

Решетов Евгений Валерьевич
7. Локки
Фантастика:
аниме
эпическая фантастика
фэнтези
5.00
рейтинг книги
Локки 7. Потомок бога

Черный Маг Императора 4

Герда Александр
4. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 4