Java: руководство для начинающих
Шрифт:
Помимо очереди, в программах часто используется структура данных, которая называется стеком. Обращение к стеку осуществляется по принципу “первым пришел — последним обслужен“. Стек можно сравнить со стопкой тарелок, стоящих на столе. Последней берется тарелка, поставленная на стол первой. Создайте класс Stack, реализующий стек для хранения символов. Используйте методы push и pop для манипулирования содержимым стека. Пользователь класса Stack должен иметь возможность задавать размер стека при его создании. Все члены класса Stack, кроме методов push и pop , должны быть объявлены как private. (Подсказка: в качестве заготовки можете воспользоваться классом Queue, изменив в нем лишь способ доступа к данным.) // Класс, реализующий стек для хранения символов, class Stack { private char stck[]; // Массив для хранения
Допустим, имеется следующий класс: 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. Метод должен возвращать результат суммирования. Продемонстрируйте его в действии. Существует
Можно ли перегружать метод с аргументами переменной длины? Да, можно.
Приведите пример неоднозначного вызова перегружаемого метода с переменным числом аргументов. Ниже приведен один из вариантов перегружаемого метода с переменным числом аргументов, при вызове которого проявляется неоднозначность. 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.
Объясните, каким образом механизмы наследования, переопределения методов и абстрактные классы используются для поддержки полиморфизма. Наследование, переопределение методов и абстрактные классы поддерживают полиморфизм и позволяют создать обобщенную структуру, реализуемую различными классами. Так, абстрактный класс определяет согласованный интерфейс, общий для всех реализующих его классов. Такой подход соответствует принципу “один интерфейс — множество методов”.