class StaticClass {
static int a = 42;
static int b = 99;
static void callme() {
System.out.println("a =” + a);
}
}
class StaticByName {
public static void main(String args[]) {
StaticClass.callme();
System.out.println("b =” + StaticClass.b);
}
}
А вот и результат запуска этой программы:
а = 42
b = 99
7.16. Абстрактные классы
Бывают ситуации, когда нужно определить класс, в котором задана структура какой-либо абстракции, но полная реализация всех методов отсутствует. В таких случаях вы можете с помощью модификатора типа abstractобъявить, что некоторые из методов обязательно должны быть замещены в подклассах. Любой класс, содержащий методы abstract, также должен быть объявлен как abstract.Поскольку у таких классов отсутствует полная реализация, их представителей нельзя создавать с помощью оператора new.Кроме того, нельзя объявлять абстрактными конструкторы и статические методы. Любой подкласс абстрактного класса либо обязан предоставить реализацию всех абстрактных методов своего суперкласса, либо сам должен быть объявлен абстрактным,
abstract class А
{
abstract void callme();
void metoo() {
System.out.println("Вызван metoo метод класса A");
}
}
class В extends A {
void callme() {
System.out.println("Вызван callme метод класса В");
}
}
class Abstract {
public static void main(String args[]) {
A a = new B();
a.callme();
a.metoo();
}
}
В нашем примере для вызова реализованного в подклассе класса Аметода callme и реализованного в классе Аметода metoo используется динамическое назначение методов, которое мы обсуждали раньше,
Вызван callme метод класса В
Вызван metoo метод класса А
Пакет ( package) — это некий контейнер, который используется для того, чтобы изолировать имена классов. Например, вы можете создать класс List, заключить его в пакет и не думать после этого о возможных конфликтах, которые могли бы возникнуть, если бы кто-нибудь еще создал класс с именем List.
Интерфейс— это явно указанная спецификация набора методов, которые должны быть представлены в классе, который реализует эту спецификацию. Реализация же этих методов в интерфейсе отсутствует. Подобно абстрактным классам интерфейсы обладают замечательным дополнительным свойством — их можно многократно наследовать. Конкретный класс может быть наследником лишь одного суперкласса, но зато в нем может быть реализовано неограниченное число интерфейсов.
8.1. Пакеты
Все идентификаторы, которые мы до сих пор использовали в наших примерах, располагались в одном и том же пространстве имен (name space). Это означает, что нам во избежание конфликтных ситуаций приходилось заботиться о том, чтобы у каждого класса было свое уникальное имя. Пакеты — это механизм, который служит как для работы с пространством имен, так и для ограничения видимости. У каждого файла java есть 4 внутренних части, из которых мы до сих пор в наших примерах использовали только одну. Ниже приведена общая форма исходного файла Java.
* одиночный оператор package (необязателен)
* любое количество операторов import (необязательны)
* одиночное объявление открытого (public) класса
* любое количество закрытых (private) классов пакета (необязательны)
8.1.1. Оператор package
Первое, что может появиться в исходном файле Java — это оператор package,который сообщает транслятору, в каком пакете должны определяться содержащиеся в данном файле классы. Пакеты задают набор раздельных пространств имен, в которых хранятся имена классов. Если оператор packageне указан, классы попадают в безымянное пространство имен, используемое по умолчанию. Если вы объявляете класс как принадлежащий определенному пакету, например, package java.awt.image;то и исходный код этого класса должен храниться в каталоге java/awt/image.
При попытке поместить класс в пакет вы сразу натолкнетесь на жесткое требование точного совпадения иерархии каталогов с иерархией пакетов. Вы не можете переименовать пакет, не переименовав каталог, в котором хранятся его классы. Эта трудность видна сразу, но есть и менее очевидная проблема. Представьте себе, что вы написали класс с именем PackTest в пакете test. Вы создаете каталог test, помещаете в этот каталог файл PackTest.java и транслируете. Пока — все в порядке. Однако при попытке запустить его вы получаете от интерпретатора сообщение «can't find class PackTest» («Не могу найти класс PackTest»). Ваш новый класс теперь хранится в пакете с именем test, так что теперь надо указывать всю иерархию пакетов, разделяя их имена точками - test.PackTest. Кроме того, Вам надо либо подняться на уровень выше в иерархии каталогов и снова набрать «java test.PackTest», либо внести в переменную CLASSPATH каталог, который является вершиной иерархии разрабатываемых вами классов.
Читать дальше