русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Литералы class


Дата добавления: 2015-06-12; просмотров: 892; Нарушение авторских прав


В Java существует еще один способ получения ссылок на объект Class — посредством литерала class. В предыдущей программе получение ссылки выглядело бы так:

FancyToy.class:

Такой способ не только проще, но еще и безопасней, поскольку проверка осуществляется еще во время компиляции. К тому же он не требует вызова forName(), а значит, является более эффективным. Литералы class работают со всеми обычными классами, так же как и с интерфейсами, массивами и даже с примитивами. Вдобавок во всех классах-обертках для примитивных типов имеется поле с именем TYPE. Это поле содержит ссылку на объект Class для ассоциированного с ним простейшего типа, как показано в табл. 13.1. Таблица 13.1. Альтернативное обозначение объекта Class с помощью литералов Литерал Ссылка на объект Class

boolean.class Boolean.TYPE

char.class Character.TYPE

byte.class Byte.TYPE

short.class Short.TYPE

int.class Integer.TYPE

long.class Long.TYPE

float.class Float.TYPE

double.class Double.TYPE

void.class Void.TYPE

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

Интересно заметить, что создание ссылки на объект Class с использованием записи .class не приводит к автоматической инициализации объекта Class. Подготовка класса к использованию состоит из трех этапов:

 

· Загрузка — выполняется загрузчиком классов. Последний находит байт- код и создает на его основе объект Class.

· Компоновка — в фазе компоновки проверяется байт-код класса, выделяется память для статических полей, и при необходимости разрешаются все ссылки на классы, созданные этим классом.

· Инициализация — если у класса имеется суперкласс, происходит его инициализация, выполняются статические инициализаторы и блоки статической инициализации.



Инициализация откладывается до первой ссылки на статический метод (конструкторы являются статическими методами) или на неконстантное статическое поле:

//: typeinfo/ClassInitialization.java

import java.util.*;

 

class Initable {

static final int staticFinal = 47;

static final int staticFinal2 =

ClassInitialization.rand.nextInt(1000);

static {

System.out.println("Initializing Initable");

}

}

 

class Initable2 {

static int staticNonFinal = 147;

static {

System.out.println("Initializing Initable2");

}

}

 

class Initable3 {

static int staticNonFinal = 74;

static {

System.out.println("Initializing Initable3");

}

}

 

public class ClassInitialization {

public static Random rand = new Random(47);

public static void main(String[] args) throws Exception {

Class initable = Initable.class;

System.out.println("After creating Initable ref");

// Does not trigger initialization:

System.out.println(Initable.staticFinal);

// Does trigger initialization:

System.out.println(Initable.staticFinal2);

// Does trigger initialization:

System.out.println(Initable2.staticNonFinal);

Class initable3 = Class.forName("Initable3");

System.out.println("After creating Initable3 ref");

System.out.println(Initable3.staticNonFinal);

}

}

<spoiler text="Output:">

After creating Initable ref

Initializing Initable

Initializing Initable2

Initializing Initable3

After creating Initable3 ref

</spoiler> По сути, инициализация откладывается настолько, насколько это возможно. Из результатов видно, что простое использование синтаксиса .class для получения ссылки на класс не приводит к выполнению инициализации. С другой стороны, вызов Class.forNames()немедленно инициализирует класс для получения ссылки на Class, как мы видим на примере initable3.



<== предыдущая лекция | следующая лекция ==>
Объект Class | Проверка перед приведением типов


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.192 сек.