Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Классы и интерфейсы



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 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.012 с)...