Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП.docx
Скачиваний:
2
Добавлен:
06.08.2019
Размер:
36.71 Кб
Скачать

5) Конструктор — это особенный метод класса, который вызывается автоматически в момент создания объектов этого класса. Имя конструктора совпадает с именем класса.

Например, в классе Dog может быть конструктор с двумя параметрами, который при создании новой собаки позволяет сразу задать ее кличку и возраст.

public Dog(String n, int a) {

name = n;

age = a;

}

Конструктор вызывается после ключевого слова new в момент создания объекта. Теперь, когда у нас есть такой конструктор, мы можем им воспользоваться:

Dog dog1 = new Dog("Тузик", 2);

В результате переменная dog1 будет указывать на «собаку» по кличке Тузик, имеющую возраст 2 года. Кстати, этот возраст можно узнать, заставив собаку лаять командой

dog1.voice();

  • Конструктор по умолчанию. Если в классе не описан ни один конструктор, для него автоматически создается конструктор по умолчанию. Этот конструктор не имеет параметров, все что он делает — это вызывает конструктор без параметров класса-предка.

  • Ключевое слово super означает суперкласс (в нашем случае это класс Dog). В примере мы вызываем с его помощью конструктор суперкласса. При этом мы передаем два параметра — строку и число, — так что из всех конструкторов будет выбран именно тот, который нас интересует.

BigDog (String n, int a) {

super(n, a);

}

6) Модификаторы видимости

  • Слово private. Оно означает, что к этому члену класса нельзя будет обратиться из методов других классов.

  • Ключевое слово public может употребляться в тех же случаях, но имеет противоположный смысл. Оно означает, что данный член класса является доступным. Если это поле, его можно использовать в выражениях или изменять при помощи присваивания, а если метод, его можно вызывать.

  • Ключевое слово protected означает, что доступ к полю или методу имеет сам класс и все его потомки.

  • Модификатор static. Любой член класса можно объявить статическим, указав перед его объявлением ключевое слово static. Статический член класса «разделяется» между всеми его объектами. Метод, объявленный с модификатором static, "дает обещание" не изменять никаких полей класса, кроме статических.

  • Любое поле класса можно объявить неизменяемым, указав перед его объявлением ключевое слово final. Неизменяемому полю можно присвоить значение только один раз (обычно это делается сразу при объявлении).

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

class Dog {

private int age;// возраст

private String name; // кличка

public Dog(String n, int a) {

name = n; age = a;

}

public void voice() {

for(int i = 1; i <= age; i++) {

System.out.println("гав-гав");

}

}

}

Поля age и name окажутся скрытыми. Это значит, что мы не можем изменять их (или считывать их значение) где-либо за пределами класса*. Мы не сможем в методе main() создать объект класса Dog, а затем присвоить его полю age или name новое значение, как в следующем примере:

Возможность скрывать поля и методы класса используется для того, чтобы уберечь программиста от возможных ошибок, сделать классы понятнее и проще в использовании. При этом реализуется принцип инкапсуляции.

7)

  • Интерфейсы-коллекции. Некоторые коллекции в пакете java.utils не представлены самостоятельными классами. Например, очередь и список. Но для этих полезных структур данных определены соответствующие интерфейсы, то есть можно пользоваться любым классом, реализующим такой интерфейс. Интерфейс может использоваться в качестве типа данных так же, как и класс. Разница лишь в том, что объекты интерфейсного типа нельзя создать напрямую — необходимо выбрать класс, поддерживающий этот интерфейс и вызвать его конструктор. Пусть, к примеру, нужен список, одна из наиболее удобных и часто употребляемых структур данных. Список — это упорядоченная последовательность элементов, каждый из которых можно получить по его позиции. Кроме того можно добавлять элементы в требуемые позиции списка и удалять их, при этом (и это главное удобство в отличие от массива) остальные элементы автоматически «раздвигаются» или «сдвигаются» так, что непрерывная связность списка сохраняется.

  • Классы-коллекции в библиотеке java.util представлены набором классов и интерфейсов. Каждый класс реализует некоторую коллекцию со специфичным для нее набором операций доступа к элементам. Чтобы использовать коллекцию в своей программе, нужно создать объект соответствующего класса. Элементы большинства коллекций имеют тип Object. Это значит, что (в отличие от обычного массива) вы не должны заранее указывать тип элементов, которые будете помещать в коллекцию. Вы можете добавлять в нее объекты любого класса, поскольку все классы являются наследниками класса Object, более того — в одной коллекции могут храниться объекты совершенно разных классов.

8) Пакет — это группа взаимосвязанных классов. Взаимосвязь может быть любого типа: тесно взаимодействующие друг с другом классы, классы, выполняющие одни и те же функции или классы одного разработчика. Каждый пакет имеет имя. Имя представляет собой обычный идентификатор Java. Особенность заключается в том, что это имя одновременно является названием папки, в которой хранятся файлы классов, входящие в пакет. А точка в имени преобразуется в разделитель имен файловой системы. То есть пакет с именем java.util будет представлен папкой util, находящейся внутри папки java. В папке хранятся файлы с расширением .java, содержащие описания классов, входящих в пакет. В начале такого файла должен стоять оператор package, после которого записывается имя пакета.

  • Область видимости класса — это участок программы, в котором можно объявлять переменные и создавать объекты этого класса. Обычный класс всегда виден в пределах своего пакета. Если класс является открытым, он виден также из других пакетов (в этом случае к нему надо обращаться, используя полное имя или, если предварительно импортировать пакет, сокращенное). Вложенные классы, объявленные без модификатора public, видны только в методах содержащего их класса. Классы, описанные в методах, видны только в пределах этих методов. Анонимные классы видны лишь в пределах команды, которой они создаются.

  • Области видимости членов класса. Члены класса (методы и атрибуты), объявленные как public, видны везде, где виден сам класс. Члены класса, объявленные как protected видны в самом классе и его потомках. Члены класса, объявленные как private, видны только в пределах класса. Если к члену класса не применяется ни один из модификаторов public, private, protected, он виден в пределах текущего пакета. "Видимость" поля означает, что его можно использовать в выражениях, передавать в качестве аргумента в методы, изменять его значение с помощью присваивания. "Видимость" метода означает возможность его вызова. Для обращения к полям и методам класса используется полное имя, состоящее из имени объекта соответствующего класса и собственно имени атрибута или метода. В теле метода того же класса имя объекта можно опускать (если подразумевается this — объект, для которого вызван данный метод).

  • Переменные, объявленные в теле метода, видны от места объявления до конца блока, в котором это объявление находится. Границы блока задаются фигурными скобками {}.

9) Массив — это совокупность переменных одного типа, имеющих общее имя. Каждая такая переменная называется элементом массива. С каждым элементом связано целое число — индекс, который используется (вместе с именем массива) для обращения к нему.

В Java есть как одномерные, так и многомерные массивы. Но реализация массивов в Java имеет свои особенности. Во-первых массив в Java это объект. Этот объект состоит из размера массива (поле length) и собственно массива.

Рассмотрим сначала простейшие одномерные массивы базовых типов.

int intAry[]; или int[] intAry;

Это описание переменной (или поля) intAry — ссылки на массив. Соответственно, в этом описании размер массива не указывается и сам массив не создается. Как и любой другой объект массив должен быть создан операцией new .

intAry = new int[10];

Создает массив из 10 целых и адрес этого массива заносит в intAry. Как обычно в Java допустимо объединять описание и инициализацию.

int[] intAry = new int[10];

Для массивов допустима инициализация списком значений.

int intAry[] = {1, 2, 3, 4};

Здесь описан массив из 4-х элементов и сразу определены их начальные значения.

10) Инкапсуля́ция — свойство языка программирования, позволяющее пользователю не задумываться о сложности реализации используемого программного компонента (то, что у него внутри), а взаимодействовать с ним посредством предоставляемого интерфейса (публичных методов и членов), а также объединить и защитить жизненно важные для компонента данные. При этом пользователю предоставляется только спецификация (интерфейс) объекта.

class A

{

private int a;

private int b;

private void DoSomething() //скрытый метод

{

//actions

}

public void ReturnSomething() //открытый интерфейс

{

return a;

}

}

11) Насле́дование — механизм объектно-ориентированного программирования (наряду с инкапсуляцией, полиморфизмом и абстракцией), позволяющий описать новый класс на основе уже существующего (родительского), при этом свойства и функциональность родительского класса заимствуются новым классом. Другими словами, класс-наследник реализует спецификацию уже существующего класса (базовый класс). Это позволяет обращаться с объектами класса-наследника точно так же, как с объектами базового класса.

class Dog

{

int age;

string name;

public voidvoice()

{

for (int i=1; i<=age; i++){

system.out.println(“Гав-гав”);

}

}

class Dolmatin extends Dog

{

int color;

int kol-vo_pyaten;

}

Dolmatin d1 = new Dolmatin();

d1.age = 5;

d1.name = "тузик";

d1.color = 5;

d1.kol-vo_pyaten = 20;

d1.voice();

12) Полиморфизм — это возможность класса выступать в программе в роли любого из своих предков, несмотря на то, что в нем может быть изменена реализация любого из методов.

Изменить работу любого из методов, унаследованных от класса-предка, класс-потомок может, описав новый метод с точно таким же именем и параметрами. Это называется переопределением.

Пусть, к примеру, мы хотим расширить наш класс Dog классом BigDog, для того, чтобы наша программа особым образом моделировала поведение больших злых собак.

В частности, большие собаки лают по-другому. Во-первых, громче, а во-вторых, они не умеют считать. Поэтому мы переопределим метод voice():

class BigDog extends Dog {

public void voice() {

for (int i = 1; i <= 30; i++) {

System.out.print("ГАВ-");

}

}

}

Теперь создадим в методе main() двух разных собак: обычную и большую и заставим их лаять.

Dog dog = new Dog("Тузик", 2);

dog.voice();

BigDog bigdog = new BigDog();

bigdog.voice();

Объект подкласса всегда будет одновременно являться объектом любого из своих суперклассов. Поэтому в том же примере мы могли бы обойтись и одной переменной:

Dog dog = new Dog("Тузик", 2);

dog.voice();

dog = new BigDog();

dog.voice();