Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Конструкторы, их назначение и виды.



Конструктор гарантирует инициализацию. В Java разработчик класса может в обязательном порядке выполнить инициализацию каждого объекта при помощи специального метода, называемого конструктором. Если у класса имеется конструктор, Java автоматически вызывает его при создании объекта, перед тем как пользователи смогут обратиться к этому объекту. Таким образом, инициализация объекта гарантирована. Имя конструктора должно точно совпадать с именем класса. Подобно любому методу, у конструктора могут быть аргументы, для того чтобы позволить вам указать, как создать объект. В аргументах конструктора передаются параметры для инициализации объекта. Например, если у класса Tree (дерево) имеется конструктор, который получает в качестве аргумента целое число, обозначающее высоту дерева, то объекты Tree будут создаваться следующим образом: Tree t = new Tree(12), // 12-метровое дерево Если Tree(int) является единственным конструктором класса, то компилятор не позволит создавать объекты Tree каким-либо другим способом. Если конструктор не определён явно, то Java создаст конструктор, который будет использоваться по умолчанию. В этом случае он просто присвоит всем переменным нулевые значения. Если вы создали сами конструктор, то конструктор по умолчанию использоваться не будет. Конструктор — не совсем обычный метод, так как у него отсутствует возвращаемое значение.

// Демонстрация простого конструктора class Rock {

Rock() { // Это и есть конструктор

System.out print(" Rock " );

}

}

public class SimpleConstructor {

public static void mainCString[] args)

{ for(int i = 0; i < 10. i++)

new Rock();

}

}

Перегрузка конструкторов

Вернемся к классу Tree

Объект Tree (дерево) может быть создан или в форме ростка (без аргументов), или в виде «взрослого растения» с некоторой высотой. Для этого в классе определяются два конструктора; один используется по умолчанию, а другой получает аргумент с высотой дерева. Возможно, вы захотите вызывать метод info() несколькими способами. Например, вызов с аргументом-строкой info(String) используется при необходимости вывода дополнительной информации, а вызов без аргументов info() — когда дополнений к сообщению метода не требуется. Было бы странно давать два разных имени методам, когда их схожесть столь очевидна. К счастью, перегрузка методов позволяет использовать одно и то же имя для обоих методов. Каждый перегруженный метод должен иметь уникальный список типов аргументов. Даже разного порядка аргументов достаточно для того, чтобы методы считались разными.

 

Вызовы конструкторов.

Конструктор инициализирует объект непосредственно во время создания. Имя конструктора совпадает с именем класса, включая регистр, а по синтаксису конструктор похож на метод без возвращаемого значения. У нас есть следующий класс:

class Box {

int width; // ширина коробки

int height; // высота коробки

int depth; // глубина коробки

 

// Конструктор

Box() {

width = 10;

height = 10;

depth = 10;

}

 

// вычисляем объём коробки

int getVolume() {

return width * height * depth;

}

}

Теперь при записи Box b = new Box(); буден создан объект у которого ширина высота и глубина будут равны 10.
Вызов перегруженных конструкторов через this()

Имея дело с перегруженными конструкторами, удобно один конструктор вызывать из другого через ключевое слово this. Вызов конструктора this() должен быть первым оператором в конструкторе. Рассмотрим пример пусть есть класс с перегруженными конструкторами:

class Cat {

int age;

int birthday;

 

// Инициализируем переменные явно

Cat(int i, int j) {

age = i;

birthday = j;

}

 

// Инициализируем переменные одним и тем значением

Cat(int i) {

age = i;

birthday = i;

}

 

// Присвоим значения по умолчанию 0

Cat() {

age = 0;

birthday = 0;

}

}

Перепишем класс, используя конструктор this().

class Cat{

int age;

int birthday;

 

// Инициализируем переменные явно

Cat(int i, int j) {

age = i;

birthday = j;

}

 

// Инициализируем переменные одним и тем значением

Cat(int i) {

this(i, i); // вызывается Cat(i, i);

}

 

// Присвоим значения по умолчанию 0

Cat() {

this(0); // вызывается Cat(0);

}

}

У нас теперь только один конструктор, который присваивает значения полям - Cat(int, int). Что происходит при выполнении оператора:

 

Cat cat = new Cat(8);

 

Вызов конструктора Cat(8) приводит к выполнению конструктора this(8, 8), что равнозначно вызову конструктора Cat(8, 8).

Статические методы

У класса могут быть статические методы, объявленные с модификатором static. К ним можно обращаться не создавая объект. Мы уже встречали такой метод — он называется main. Такие методы не используют информацию о свойствах конкретных объектов класса - они обрабатывают общую для класса информацию, хранящуюся в его статических полях. Например, в классе Person может быть статический метод, обрабатывающий данные из статического поля message. Другим частым случаем применения статических методов является ситуация, когда класс предоставляет свои сервисы объектам других классов. Таковым является класс Math, который не имеет собственных полей - все его статические методы работают с объектами арифметических классов. Для обращения к статическим свойствам Вы указываете имя класса, точку и имя переменной. Для вызова статического метода надо будет сделать нечто подобное. Важным отличием статического метода от обычного является то, что там не существует переменной this, т.е. обратиться к свойству класса, которое не является статическим, невозможно.

Пример статического метода

public static boolean isPrime(int n) {
for(int i = 2; i < = Math.sqrt(n); i++) {
if(n%i == 0) {
return false;
}
}
return true;
}

Статические свойства

 

Статические методы/свойства классов это такие методы/свойства, к которым можно обратиться не создавая объект данного класса. Например, мы создаем описание стола. В этом случае, только когда мы создадим реальный стол, мы сможем говорить о его высоте и ширине (с учетом погрешностей при производстве). Но вот материал скорее всего будет один на всех. Также один на всех будет чертеж, название и прочие атрибуты. Т.е. очевидно, что некоторые свойства присущи не конкретному объекту, а классу целиком. Для обращения к статическим свойствам Вы указываете имя класса, точку и имя переменной. Если мы объявляем статическую переменную, это значит, что она одна на всех. Причем существует она даже тогда, когда нет ни одного экземпляра данного класса.

Пример класса со статическим свойствами

public class TestClass

{

private static Integer staticValue = 99;

 

public static void main(String[] arg) {

System.out.println(TestClass.staticValue);

}

}

Понятие интерфейса

Интерфейсы в Java во многом напоминают классы, но могут содержать только константы, сигнатуры методов и вложенные типы. В интерфейсах нет описания методов. Нельзя создать объект типа интерфейса — интерфейсы могут только реализовываться некоторым классом или наследоваться другим интерфейсом. Объявление интерфейса очень похоже на объявление класса. Сигнатуры методов объявляются без фигурных скобок и заканчиваются точкой с запятой. Для использования интерфейса вы должны написать класс, который будет реализовывать ваш интерфейс. Класс который реализует интерфейс, должен описывать все методы, объявленные в интерфейсе.

Интерфейсы играют важную роль в языке программировния Java. Java не разрешает множественного наследования, но интерфейсы предоставляют альтернативу. В Java класс может наследовать только один класс, но может реализовывать много интерфейсов. При создании объектов класса в качестве типа может указываться имя реализованного в классе интерфейса.

Объявление интерфейса содержит ключевое слово interface, имя интерфейса, список родительских интерфейсов через запятую (если есть) и тело интерфейса. Например:

public interface GroupedInterface extends Interface1, Interface2, Interface3 {

// число e double E = 2.718282;

// сигнатуры методов void doSomething (int i, double x);

int doSomethingElse(String s);

}

Интерфейс может наследовать другие интерфейсы, как классы могут наследовать другой

класс. В отличие от классов, интерфейсы могут наследовать любое количество других интерфейсов.

Для объявления класса, реализующего интерфейс, вы должны использовать ключевое слово implements после которого перечисляются интерфейсы. Класс может реализовывать много интерфейсов. Объявление реализуемых интерфейсов идет после объявления наследуемого (extends) класса (если есть).

 


Поделиться:



Популярное:

  1. Административно-правовые нормы: понятие, структура, виды. Дискуссионность по понятию структуры правовой нормы.
  2. АДМИНИСТРАТИВНО-ЮРИСДИКЦИОННОЕ ПРОИЗВОДСТВО: ПОНЯТИЕ, ЧЕРТЫ, ВИДЫ.
  3. Акты применения права:понятие,признаки,виды.Н,П,А.и акты примен.права:сходство,различия.
  4. Акцентуации характера, критерий и виды. Классификации акцентуированных характеров по К. Леонгарду и А.Е. Личко.
  5. Бюджетный дефицит, его причины, виды. Финансирование бюджетного дефицита. Государственный долг: причины, виды, последствия.
  6. Внимание как объект психологического исследования. Функции. Виды. Свойства.
  7. Внимание как ограничение поля восприятия, его функции и виды.
  8. Вопрос 35. Понятие правовой культуры: структура, уровни и виды. Формирование правовой культуры.
  9. ВОПРОС: Основные производственные фонды (ОПФ) – понятие, характеристика, виды. Формы воспроизводства и совершенствования ОПФ. Показатели использования ОПФ. Износ, амортизация, виды оценки ОПФ.
  10. Гражданские правоотношения, их структура и виды.
  11. Кравткая характеристика ионизирующих излучений, деление на виды.


Последнее изменение этой страницы: 2017-03-03; Просмотров: 457; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.03 с.)
Главная | Случайная страница | Обратная связь