- •Основы классов
- •Общая форма класса
- •Простой класс
- •Объявление объектов
- •Операция new
- •Представление методов
- •Добавление метода к классу Box
- •Возврат значений
- •Добавление метода с параметрами
- •Конструкторы
- •Параметризованные конструкторы
- •Ключевое слово this
- •Скрытие переменной экземпляра
- •Сборка "мусора"
- •Метод finalize()
- •Класс Stack
- •Перегрузка конструкторов
- •Использование объектов в качестве параметров
- •Передача аргументов
- •Возврат объектов
- •Рекурсия
- •Управление доступом
- •Статические элементы
- •Спецификатор final
- •Ревизия массивов
- •Вложенные и внутренние классы
- •Класс String
- •Использование аргументов командной строки
- •Наследование
- •Основы наследования
- •11 Тело класса }
- •Доступ к элементам и наследование
- •Практический пример
- •Переменная суперкласса может ссылаться на объект подкласса
- •Использование ключевого слова super
- •Вызов конструктора суперкласса с помощью первой формы super
- •Создание многоуровневой иерархии
- •II построить клон объекта
- •Когда вызываются конструкторы
- •Переопределение методов
- •Динамическая диспетчеризация методов
- •Зачем нужны переопределенные методы?
- •Применение переопределения методов
- •Использование абстрактных классов
- •Void meth() { // ошибка! Нельзя переопределять.
- •Класс Object
Простой класс
Начнем простым примером. Предположим, имеется класс с именем Box, который определяет три переменных экземпляра: width, height и depth. Пока что класс Box не содержит никаких методов.
class Box {
double width;
double height;
double depth;
}
Как было сказано выше, класс определяет новый тип данных. В этом случае – Box. Это имя в дальнейшем используется для объявления объектов типа Box. Важно помнить, что объявление класса создает только шаблон, а не фактический объект. Таким образом, предшествующий код не приводит к появлению каких-либо объектов типа Box. Чтобы фактически создать Box-объект, можно воспользоваться следующим утверждением:
Box mybox = new Вох(); // создать Box-объект с именем mybox.
После выполнения этого утверждения переменная mybox станет экземпляром класса Box, Всякий раз, когда создается экземпляр класса, образуется объект, который содержит свою собственную копию каждой экземплярной переменной, определенной в классе. Таким образом, каждый Box -объект будет содержать свою собственную копию переменных width, height и depth. Для доступа к этим переменным необходимо использовать операцию "точка" (.) Она связывает имя объекта с именем переменной экземпляра. Например, чтобы назначить переменной width объекта mybox значение 100, нужно использовать следующий оператор:
mybox. width = 100;
Этот оператор просит компилятор назначать копии переменной width, которая содержится в объекте mybox, значение 100. В общем случае, чтобы обращаться как к переменным экземпляра, так и к методам объекта, следует указывать операцию "точка". Далее приводится законченная программа, которая использует Box-класс.
/* Программа, которая использует Box-класс.
Назовите этот файл BoxDemo. Java */
class Box {
double width;
double height;
double depth;
}
// Этот класс объявляет объект типа Box.
class BoxDemo {
public static void main (String args[]){
Box mybox = new Box();
double vol;
// присвоить значения экземплярным переменным объекта mybox
mybox.width = 10;
mybox.height = 20;
mybox.depth = 15;
// вычислить объем блока
vol = mybox.width * mybox.height * mybox.depth;
System.out.рrintln ("Объем равен " + vol);
}
}
Этот файл, должен быть назван BoxDemo.java, потому что метод main() находится в классе с именем BoxDemo, а не в классе с именем box. После компиляции программы можно увидеть, что были созданы два файла с расширением .class – один для Box-класса и один для BoxDemo-класса. Java-компилятор автоматически помещает каждый класс в его собственный class-файл. В общем случае нет необходимости в том, чтобы классы Вox и BoxDemo находились в одном исходном файле. Можно было поместить каждый класс в свой собственный файл с именами Box.java и BoxDemo.java, соответственно.
Чтобы выполнить программу, нужно выполнить BoxDemo.class, что обеспечит следующий вывод:
Объем равен 3000.0
Как указано ранее, каждый объект имеет свои собственные копии переменных экземпляра. Это означает, что, если вы имеете два Box-объекта, каждый из -них обладает своей собственной копией depth* width и height. Важно понять, что изменения экземплярных переменных одного объекта не имеют никакого влияния на экземплярные переменные другого. Например, следующая программа объявляет два Box-объекта:
// Эта программа объявляет два Box-объекта.
class Box {
double width;
double height;
double depth;
}
class BoxDemo2 {
public static void main (String args[J) {
Box mybox1 = new Box ( ) ;
Box mybox2 = new Box ( ) ;
double vol;
// присвоить значения экземплярным переменным объекта Mybox1
Mybox1.width = 10;
Mybox1. height = 20;
Mybox1. depth = 15;
// присвоить другие значения экземплярным переменным объекта mybox2
mybox2.width = 3;
mybox2.height = 6;
mybox2.depth = 9 ;
// вычислить объем первого блока
vol = mybox1.width * mybox1 .height * mybox1. depth;
System.out.рrintln ("Объем равен " + vol) ;
// вычислить объем второго блока
vol = mybox2 . width * mybox2 .height * mybox2 . depth;
System, out. println ("Объем равен " + vol) ;
}
}
Вывод, выполненный этой программой:
Объем равен 3000.0
Объем равен 162.0
При этом можно заметить, что данные mybox1 объекта полностью отделены от данных, содержащихся в mybox2.
