Добавление классов в пакеты




Мы уже говорили, что для того, чтобы поместить класс в пакет, достаточно в начале файла указать имя пакета. Если директива package в исходном файле не указана, то классы, описанные в этом файле, помещаются в пакет по умолчанию. Пакет по умолчанию не имеет имени.

Пакеты следует помещать в подкаталог, путь к которому соответствует полностью самому имени пакета. Например, все файлы классов в пакете com.kozhura.javacourse должны находиться в подкаталоге com/kozhura/javacourse (в системе Windows слэши следует повернуть в другую сторону). Компиллятор помещает файлы классов в ту же структуру каталогов.

Таким образом, если у меня в пакете по умолчанию есть класс Default, а в пакете com.kozhura.javacourse есть класс MyClass, то структура каталогов должна выглядеть следующим образом:

. (базовый каталог)

!-- Default.java

!-- Default.class

!-- com/

!-- kozhura/

!-- javacourse/

!-- MyClass.java

!-- MyClass.class

Программу в Java следует запускать из базового каталога, причем как в случае, если точка входа в программу находится в классе Default, так и в случае, если она расположена более глубоко – в нашем случае в классе MyClass.

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

javac Default.java

java. Default

 

во втором случае – так:

javac com/kozhura/javacourse/MyClass.java

java com.kozhura.javacourse.MyClass

 

Заметьте, что компилятор (javac) работает с файлами (т. е. при указании файла задается путь и расширение файла), а интерпретатор (java) — с классами (для класса указывается именно пакет). Точка обозначает пакет по умолчанию (в этом случае после точки надо поставить обязательный пробел).

 

Инициализация базового класса

 

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

 

class Grandfather {

Grandfather(){

System.out.println("Конструктор класса Grandfather");

}

}

class Father extends Grandfather {

Father(String s) {

System.out.println("Конструктор класса " + s);

}

}

class Son extends Father {

Son() {

super("Father");

System.out.println("Конструктор класса Son");

}

public static void main(String[] args) {

new Son();

}

}

 

Порядок инициализации

 

Внимание!!! Хотя ключевое слово static и не используется явно, конструктор в действительности является статическим методом.

 

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

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

Сначала инициализируются static-члены, если они еще не были проинициализированы, и только затем нестатические объекты.

 

Итак, порядок создания объекта класса следующий:

· При создании первого объекта класса или при первом вызове статического метода-обращения к статическому полю класса Dog, интерпретатор Java должен найти класс Dog.class. Поиск осуществляется в стандартных каталогах, перечисленных в переменной окружения СLASSPATH.

· После загрузки файла <имя класса>.class (с созданием особого объекта Class, о котором узнаем позже) производится инициализация статических элементов. Таким образом, инициализация статических членов проводится только один раз, при первой загрузке объекта Class.

· При создании нового объекта конструкцией new Dog() для начала выделяется блок памяти, достаточный для хранения объекта Dog в куче.

· Выделенная память заполняется нулями, при этом все примитивные поля объекта Dog автоматически инициализируются значениями по умолчанию (ноль для чисел, его эквиваленты для типов boolean и char, null для ссылок).

· Выполняются все действия по инициализации, происходящие в точке определения полей класса.

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

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: