34. Свойства классов
Класс состоит из данных и методов, работающих с данными.
Объект является конкретным экземпляром класса.
Доступ к членам объекта (переменным и методам) осуществляется с помощью оператора <<точка>>, размещаемого между именем объекта и именем переменной.
Копия переменных экземпляра (не статических) содержится в каждом объекте (экземпляре) класса.
Статические переменные класса связаны с классом. Всегда существует ровно одна копия переменной класса независимо от числа экземпляров класса.
Статическим методам класса не передается аргумент this, и, следовательно, они не владеют текущим экземпляром класса, который можно использовать для неявной ссылки на переменные экземпляра или для неявного вызова методов экземпляра.
Объекты создаются при помощи ключевого слова new, которое вызывает конструктор класса с соответствующим списком аргументов..
Если конструктор в классе не определен, то автоматически создается конструктор по умолчанию.
Класс может наследовать переменные и методы другого класса, не объявленные как private, становясь его подклассом, т.е. путем объявления другого класса в блоке extends.
Класс java.lang.Object -- суперкласс любого класса по умолчанию. Это корневой класс иерархии классов в языке Java, не имеющий суперкласса. Все классы наследуют методы класса Object.
Можно явно ссылаться на скрытые переменные с помощью ключевого слова super.
Данные и методы могут быть скрыты и инкапсулированы внутри класса благодаря модификаторам видимости private и protected. Переменные класса, объявленные как public, видимы везде. Переменные класса без модификаторов видимости видны только внутри пакета.
Абстрактный класс содержит абстрактные методы. Методы должны быть реализованы в подклассе прежде, чем будут созданы экземпляры этого подкласса.
Интерфейс в языке Java -- это набор абстрактных методов и констант (переменных, объявленных как finalstatic). Объявление интерфейса создает новый тип данных.
Класс реализует интерфейс, объявляя его в блоке implements и создавая тело метода для каждого из абстрактных методов интерфейса.
35.
Модификаторы доступа – это зарезервированные слова, которые определяют область видимости/доступа полей или же методов класса. Заметьте, что классу не свойственно определение модификаторов доступа, понятно почему.
Итак, перечислим модификаторы доступа:
private – метод или поле класса, помеченные этим модификатором, доступны только в пределах данного класса;
package – поле/метод доступно в пределах всего пакета; это значение по умолчанию для всех полей или методов объявленных без модификаторов доступа;
protected – здесь доступ разграничивается для всех “родных” (т.е. производных или родительских) классов данного класса;
public – доступ открыт отовсюду и для всех;
После этого можно перейти к списку модификаторов у полей.
И первое из них – это static. Статические поля – это поля, которые едины для всех объектов данного класса. Т.е. ссылка этого поля у любого экземпляра класса будет ссылаться на одно и то же значение. Например:
class box
{
public static int iNum;
}
public MyBox
{
public static void main(String argv[])
{
box a = new box();
box b = new box();
a.iNum = 123;
System.out.println(“box b.iNum = ”+b.iNum);
}
}
Результатом выполнения данной программы будет:
box b.iNum = 123
final – это модификатор, позволяющий объявлять константные поля в классе. Если у вас есть некоторое свойство, проектируемого вами объекта, значение которого не будет меняться, то вы может воспользоваться этим модификатором. Любая попытка переопределить значение поля с модификатором final приводит к выбросу исключения.
public final String boxCompanyName = “BlackBox”;
Далее я просто перечислю два специфических и очень важных модификатора:
transient – решает проблему сериализации (представления объекта в виде последовательности байтов данных);
volatile – необходим в процессе синхронизации потоков вычислений и управления памятью;
И последнее что нам осталось рассмотреть – это использование модификаторов при объявлении методов.
class box
{
private static int iNum;
public static void ChangeiNum(int x)
{
iNum = x;
}
}
public class MyBox
{
public static void main(String argv[])
{
box a = new box();
a.ChangeiNum(5); // здесь мы изменили private значение поля iNum объекта a, класса box
}
}
36.
Основы наследования
Чтобы наследовать класс, достаточно просто вставить определение одного класса в другой с использованием ключевorо слова extends. В качестве иллюстрации рассмотрим короткий пример. Следующая программа создает суперкласс А и подкласс В. Обратите внимание на использование ключевого слова extends для создания подкласса класса А.
Общая форма объявления класса, который наследует от суперкласса, следующая:
class имя_подкласса extends имя_суперкласса
{
// тело класса
}
// суперкласс Nokia
class Nokia
{
// высота, ширина и площадь дисплея
int dh, dw, ds;
// метод, вычисляющий площадь дисплея
int Area()
{
return dw * dh;
}
}
// подкласс NokiaE93
class Nokia310 extends Nokia
{
// высота, ширина и площадь всего телефона
int th, dw, ds;
// метод, вычисляющий площадь телефона
int tArea()
{
return tw * th;
}
}
// входная точка приложения
class RunNokia
{
public static void main (String args[])
{
// при создании объекта используется конструктор по умолчанию
NokiaE93 nokiaE93 = new NokiaE93();
// задаем значения для переменных
nokiaE93.dh = 320;
nokiaE93.dw = 240;
nokiaE93.th = 118;
nokiaE93.tw = 55;
// вычисляем площадь дисплея
ds = nokia.dArea();
// вычисляем площадь телефона
dt = nokia.tArea();
}
}
Создав подкласс NokiaE93, вы получите доступ ко всем членам суперкласса Nokia, определенные как public. Используя оператор «.» (точка), вы открываете доступ к переменным и методам суперкласса. При создании объекта суперкласса, например Nokia nokiasuper = new Nokia(), объект созданного класса может пользоваться своими членами класса, но уже члены подкласса ему не доступны.
Иначе говоря, подкласс расширяет свой суперкласс, добавляя новые члены в подкласс, тем самым, подстраивая под себя новые, необходимые только подклассу, члены класса, оставляя за собой возможность использования членов суперкласса.
Суперкласс вправе иметь сколько угодно подклассов, например, в рассмотренном примере можно создать еще десяток-другой подклассов: NokiaE95, NokiaN80, NokiaN-Gage и так далее. Но каждый из подклассов может иметь только один суперкласс. Множественные наследования в языке Java не предусмотрены. Но каждый из подклассов может иметь свой подкласс, и такая цепочка наследования может длиться до разумной бесконечности.
37.
Естьлидеструкторы в Java 2
Деструкторов в Java нет, но есть функция finalize. Она автоматически вызывается системой, когда обнаруживается, что объект больше не используется. Память, занятая объектом, помечается как свободная. Неизвестно когда будет, если вообще будет вызван метод finalize. Поэтому не стоит на него полагаться, но можно его использовать как средство оптимизации.
Деструкторам свойственны многие черты обычных функций-членов класса, но существуют и свои особенности.
Деструкторы не могут описываться как функции, возвращающие значение (даже типа void).
Деструктор не имеет параметров.
Имя деструктора – имя класса, которому предшествует символ ~.
Нельзя получить адрес деструктора.
Если они явно не описаны, то деструкторы автоматически создаются компилятором.
Деструктор может быть вызван как обычная функция с указанием полного имени.
Ints(100), *ps = new Int(50);
s.~Int(); // явное разрушение s
ps->~Int(); // явное разрушение
Компилятор автоматически вставляет вызовы деструктора при уничтожении объекта.
Деструктор автоматически вызывается компилятором:
при выходе из области видимости;
при создании временных объектов для преобразования в выражениях или для передачи функциям аргументов;
когда возвращенные функцией значения более не нужны;
при выполнении операции delete для объектов, размещенных в динамической памяти.
Объект в свободной памяти: уничтожается с помощью операции delete в С++ и механизма "сборки мусора" в Java.
38.
Чтотакоесборщикмусора ?
Сборка мусора - процесс посредством чего освобождается память, распределенная между объектам, которые больше не находятся в использовании. В другом объектно-ориентированном языке подобно С ++, это была обязанность программиста освобождать память, которая больше не требуется. В случае, если программист забывает освободить память, это может закончиться множеством проблем. Java обеспечивает уникальный подход, автоматизируя процесс сборки мусора. Это устраняет ручную сборку мусора программистом. Объект становится приемлемым на сборку мусора, если на него нет никаких ссылок или если ему было назначено нулевое значение. Хотя мы можем вызвать сборщик мусора, вызывая метод дс () из класса или системы или во время выполнения, мы не можем предсказать или гарантировать, что сборка мусора будет иметь место. Мы можем выключить сборку мусора в приложении, Java -noasyncgc ..... Обратим внимание: Если мы выключаем сборку мусора, программа, как правило, будет терпеть неудачу из-за нехватки памяти в какой-то момент. Это мы можем использовать только для экспериментов.
