Чтение онлайн

на главную - закладки

Жанры

Программирование на Java

Вязовик Н.А.

Шрифт:

Human.totalCount=100;

В этом можно убедиться на следующем примере:

Human h = null;

h.totalCount+=10;

Значение ссылки равно null, но это не имеет значения в силу описанной конвертации. Данный код успешно скомпилируется и корректно исполнится. Таким образом, в следующем примере

Human h1 = new Human,

h2 = new Human;

Human.totalCount=5;

h1.totalCount++;

System.out.println(h2.totalCount);

все обращения

к переменной totalCount приводят к одному единственному полю, и результатом работы такой программы будет 6. Это поле будет существовать в единственном экземпляре независимо от того, сколько объектов было порождено от данного класса, и был ли вообще создан хоть один объект.

Аналогично объявляются статические методы.

class Human {

private static int totalCount;

public static int getTotalCount {

return totalCount;

}

}

Для вызова статического метода ссылки на объект не требуется.

Human.getTotalCount;

Хотя для удобства обращения через ссылку разрешены, но принимается во внимание только тип ссылки:

Human h=null;

h.getTotalCount;

// два эквивалентных

Human.getTotalCount;

// обращения к одному

// и тому же методу

Хотя приведенный пример технически корректен, все же использование ссылки на объект для обращения к статическим полям и методам не рекомендуется, поскольку это усложняет код.

Обращение к статическому полю является корректным независимо от того, были ли порождены объекты от этого класса и в каком количестве. Например, стартовый метод main запускается до того, как программа создаст хотя бы один объект.

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

class Human {

static {

System.out.println("Class loaded");

}

}

Если объявление статического поля совмещается с его инициализацией, то поле инициализируется также однократно при загрузке класса. На объявление и применение статических полей накладываются те же ограничения, что и для динамических,– нельзя использовать поле в инициализаторах других полей или в инициализаторах класса до того, как это поле объявлено:

class Test {

static int a;

static {

a=5;

// b=7;

// Нельзя использовать до

// объявления!

}

static int b=a;

}

Это правило распространяется только на обращения к полям по простому имени. Если использовать составное имя, то обращаться к полю можно будет раньше (выше в тексте программы), чем оно будет объявлено:

class Test {

static int b=Test.a;

static int a=3;

static {

System.out.println("a="+a+", b="+b);

}

}

Если класс будет загружен в

систему, на консоли появится текст:

a=3, b=0

Видно, что поле b при инициализации получило значение по умолчанию поля a, т.е. 0. Затем полю a было присвоено значение 3.

Статические поля также могут быть объявлены как final, это означает, что они должны быть проинициализированы строго один раз и затем уже больше не менять своего значения. Аналогично, статические методы могут быть объявлены как final, а это означает, что их нельзя перекрывать в классах-наследниках.

Для инициализации статических полей можно пользоваться статическими методами и нельзя обращаться к динамическим. Вводят специальные понятия – статический и динамический контексты. К статическому контексту относят статические методы, статические инициализаторы, инициализаторы статических полей. Все остальные части кода имеют динамический контекст.

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

Напротив, со статическим контекстом ассоциированных объектов нет. Например, как уже указывалось, стартовый метод main вызывается в тот момент, когда ни один объект еще не создан. При обращении к статическому методу, например, MyClass.staticMethod, также может не быть ни одного экземпляра MyClass. Обращаться к статическим методам класса Math можно, а создавать его экземпляры нельзя.

А раз нет ассоциированных объектов, то и пользоваться динамическими конструкциями нельзя. Можно только ссылаться на статические поля и вызывать статические методы. Либо обращаться к объектам через ссылки на них, полученные в результате вызова конструктора или в качестве аргумента метода и т.п.

class Test {

public void process {

}

public static void main(String s[]) {

// process;

– ошибка!

// у какого объекта его вызывать?

Test test = new Test;

test.process;

// так правильно

}

}

Ключевые слова this и super

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

Если выполнение кода происходит в динамическом контексте, то должен быть объект, ассоциированный с ним. В этом случае ключевое слово this возвращает ссылку на данный объект:

class Test {

public Object getThis {

return this;

// Проверим, куда указывает эта ссылка

}

public static void main(String s[]) {

Test t = new Test;

System.out.println(t.getThis==t);

// Сравнение

}

}

Результатом работы программы будет:

true

То есть внутри методов слово this возвращает ссылку на объект, у которого этот метод вызван. Оно необходимо, если нужно передать аргумент, равный ссылке на данный объект, в какой-нибудь метод.

Поделиться:
Популярные книги

Имаджика

Баркер Клайв
7. Книга-загадка, книга-мистика
Фантастика:
фэнтези
7.56
рейтинг книги
Имаджика

Рассвет русского царства

Грехов Тимофей
1. Новая Русь
Документальная литература:
историческая литература
5.00
рейтинг книги
Рассвет русского царства

Торнан-варвар и жезл Тиамат

Лещенко Владимир
Фантастика:
героическая фантастика
5.00
рейтинг книги
Торнан-варвар и жезл Тиамат

Народ, да!

Коллектив авторов
Старинная литература:
мифы. легенды. эпос
5.00
рейтинг книги
Народ, да!

Опыт предпринимателя

Довгань Владимир Викторович
Деловая литература:
управление, подбор персонала
5.00
рейтинг книги
Опыт предпринимателя

Серия "Афган. Чечня. Локальные войны". Компиляция. Книги 1-34

Бобров Глеб Леонидович
Антология военной литературы
Проза:
военная проза
5.00
рейтинг книги
Серия Афган. Чечня. Локальные войны. Компиляция. Книги 1-34

А ЕСТЬ А

Рэнд Айн
3. Атлант расправил плечи
Фантастика:
социально-философская фантастика
6.88
рейтинг книги
А ЕСТЬ А

Иномиры (сборник)

Казанцев Александр Петрович
Классическая библиотека приключений и научной фантастики
Фантастика:
научная фантастика
7.00
рейтинг книги
Иномиры (сборник)

Я князь. Книга XVIII

Дрейк Сириус
18. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я князь. Книга XVIII

Том 11. Рассказы. Очерки. Публицистика. 1894-1909

Твен Марк
Проза:
классическая проза
5.00
рейтинг книги
Том 11. Рассказы. Очерки. Публицистика. 1894-1909

Суть науки Каббала. Том 2

Лайтман Михаэль Семенович
Научно-образовательная:
прочая научная литература
религиоведение
5.00
рейтинг книги
Суть науки Каббала. Том 2

Кристалл Альвандера. Корабль Альвандера.Дилогия

Садов Сергей Александрович
Фантастика:
боевая фантастика
8.38
рейтинг книги
Кристалл Альвандера. Корабль Альвандера.Дилогия

Масоны

Писемский Алексей Феофилактович
Проза:
русская классическая проза
6.25
рейтинг книги
Масоны

Тевтонский крест

Мельников Руслан Викторович
1. Тевтонский крест
Фантастика:
альтернативная история
6.32
рейтинг книги
Тевтонский крест