Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
5.3.1 Классы. Создание класса
Класс – это тип, описывающий устройство объектов путем указания всех членов класса, которые могут быть не только данными, но и методами. По технологии Java описания переменных и констант, характеризующих объект, называются полями класса (class fields). Процедуры, описывающие поведение объекта, называются методами класса (class methods). Внутри класса можно описать и вложенные классы (nested classes) и вложенные интерфейсы. Поля, методы и вложенные классы первого уровня являются членами класса (class members). Класс подобен чертежу или шаблону, по которому можно создать бесконечное множество объектов, обладающих сходными свойствами.
Например:
class Light {
boolean isLit;
public void on() {
isLit = true;
}
public void off(){
isLit = false;
}
}
Представленный выше класс описывает лампочку. В классе есть два метода: on – для включения и off – для выключения. Переменная типа boolean isLit показывает true, если лампочка горит и false, если она выключена.
Если мы создадим объект этого класса:
Light lamp = new Light();
поле isLit примет значение false, т.к. ранее boolean значение не было определено. Напишем конструктор для класса Light. Конструктор – специальный метод, который Java вызывает автоматически при создании объекта. Таким образом гарантируется инициализация объекта. Имя конструктора должно совпадать с именем класса.
class Light {
boolean isLit;
Light(boolean isLit){
this.isLit = isLit;
}
public void on() {
isLit = true;
}
public void off(){
isLit = false;
}
}
Мы создали конструктор для класса Light. Теперь при создании объекта пользователь обязательно должен указать булевское значение, соответствующее состоянию лампочки.
Light lamp = new Light(true);
Пример 1. Создание класса Light и работа с объектом класса Light
class Light {
boolean isLit;
Light(boolean isLit){
this.isLit = isLit;
}
public void on() {
isLit = true;
}
public void off(){
isLit = false;
}
}
public class TestClass {
public static void main(String[] args) {
Light lamp = new Light(true);
System.out.println(lamp.isLit);
lamp.off();
System.out.println(lamp.isLit);
}
}
5.3.2.Перегрузка методов
Имя конструктора совпадает с именем класса, но зачастую объекты класса необходимо создавать разными способами. Например, создавать класс стандартно либо на основании некоторого файла. Необходимо использовать два конструктора: один конструктор без аргументов (конструктор по умолчанию), а второй получает в качестве аргумента строку с именем файла. Но они должны называться одинаково – именем класса. Здесь необходимо использовать перегрузку методов для того, чтобы можно было вызывать методы с одинаковыми именами, но с разными аргументами. Применять перегрузку можно как к конструкторам, так и к обычным методам.
В рассмотренном примере добавим к классу конструктор без аргументов:
class Light {
boolean isLit;
Light (){
this.isLit = false;
}
Light(boolean isLit){
this.isLit = isLit;
}
public void on() {
isLit = true;
}
public void off(){
isLit = false;
}
}
Теперь для создания объекта типа Light можно использовать два конструктора. Один – по умолчанию, переменная isLit при этом будет принимать значение false, другой – с аргументом типа Boolean, с помощью которого можно задать значение isLit вручную.
Пример 2. Перегрузка конструктора.
class Light {
boolean isLit;
Light (){
this.isLit = false;
}
Light(boolean isLit){
this.isLit = isLit;
}
public void on() {
isLit = true;
}
public void off(){
isLit = false;
}
}
public class TestClass {
public static void main(String[] args) {
Light lamp = new Light();
System.out.println(lamp.isLit);
lamp.on();
System.out.println(lamp.isLit);
Light lamp1 = new Light(true);
System.out.println(lamp1.isLit);
lamp1.off();
System.out.println(lamp1.isLit);
}
}
5.3.3.Композиция и наследование
Иногда вместо создания класса с нуля имеет смысл воспользоваться ранее созданным классом. При этом можно выделить два механизма.
Композиция – это механизм построения нового класса из объектов уже существующих классов. В этом случае используется функциональность готового кода, но не его структура.
При использовании наследования новый класс создаётся как специализация уже существующего класса. Взяв за основу уже существующий класс, к нему добавляется новый код без изменения существующего класса.
Для указания, что класс наследует от другого класса, используется ключевое слово extends, а затем имя базового класса. Тем самым автоматически создается доступ ко всем полям и методам базового класса.
Пример 3. Использование композиции с базовым классом Light.
class Dimmer extends Light{
int brightness;
public void setBright(int bright){
brightness = bright;
}
}
Создан класс Dimmer из базового класса Light, к нему добавлены поле brightness и метод setBright().
Пример 4. Наследование от базового класса Light.
class Light {
boolean isLit;
Light (){
this.isLit = false;
}
Light(boolean isLit){
this.isLit = isLit;
}
public void on() {
isLit = true;
}
public void off(){
isLit = false;
}
}
class Dimmer extends Light{
int brightness;
public void setBright(int bright){
brightness = bright;
}
}
public class TestClass {
public static void main(String[] args) {
Dimmer lamp = new Dimmer();
System.out.println(lamp.isLit);
lamp.on();
System.out.println(lamp.isLit);
lamp.setBright(15);
System.out.println(lamp.brightness);
}
}
Как видно из примера, класс-наследник имеет все методы и поля базового класса. Также можно переопределить метод базового класса. Например:
class Dimmer extends Light{
int brightness;
@Override
public void on(){
isLit = true;
brightness = 15;
}
public void setBright(int bright){
brightness = bright;
}
}
Был переопределен метод on(). Теперь он не просто включает лампу, но и выставляет яркость равную 15. Запись @Override перед переопределяемым методом не является ключевым словом и используется для того, чтобы предупредить компилятор о том, что производится переопределение метода. Если по ошибке будет выполнена перегрузка метода, то компилятор выдаст ошибку.
5.3.3.Спецификаторы доступа.
В Java есть три спецификатора доступа public, private и protected.
Используя public, вы фактически объявляете, что следующее за ним объявление члена класса доступно для всех, в том числе для клиентских программистов, использующих библиотеку.
Ключевое слово private означает, что доступ к члену класса не предоставляется никому, кроме методов этого класса. Другие классы того же пакета также не имеют к ним доступа.
Ключевое слово protected означает, что член класса является закрытым (private) для пользователя класса, но для всех, кто наследует от класса, и для соседей по пакету он доступен.
Обычно все поля класса помечаются как private, а все методы – public.
Дата публикования: 2015-07-22; Прочитано: 318 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!