package samples.on; // отображает прямо в папку, где находится файл класса
public class Packaging {
int x;
public class Internal {
// находится автоматически в том же пакете
}
public static void main(String args[]) {
}
}
class Internal {
// находится автоматически в том же пакете
}
Примеры
того, как этот код может выполняться, приведены ниже. Это, конечно, предполагает, что файл класса был сделан доступным для JRE:
□ Из командной строки:
java samples.on.Packaging
□ Как непосредственная ссылка в коде:
// Referencer.java
public class Referencer {
samples.on.Packaging pack = new samples.on.two.three.Packaging;
□ Используя директиву
import
, можно опустить полностью квалифицированные имена пакетов, поэтому
Referencer
запишется как:
// Referencer.java
import samples.on.*;
public class Referencer{
Packaging pack = new Packaging;
}
Помещение класса в пространство имен достигается в C# с помощью ключевого слова
namespace
с идентификатором и заключением целевого класса в скобки. Вот пример:
// namespace_samples.cs
namespace Samples.On {
using System;
public class Example {
public Example {
}
}
}
Преимущество использования скобок для явного ограничения пространства имен состоит в том, что это задает определенный пользователем тип в реальном классе, определенном в файле, а не в самом файле. В Java файлы и папки косвенно представляют структуры языка, так как они аналогичны классам и пакетам, содержащим эти классы. В C# файлы не связаны принудительно с чем-либо, поэтому они становятся местом, где располагается определение класса, а не частью какой-либо структуры языка. Пространства имен также не связаны с папками. Следовательно, в одном файле можно ввести несколько пространств имен без всяких ограничений. Можно, например, добавить определение нового класса и поместить его в новое пространство имен в том же файле и по-прежнему оставаться в границах языка:
// namespace_samples.cs
namespace Samples.On {
using System;
public class Example {
public Example {
}
}
}
namespace Com.Cslib {
using System;
using System.Collections;
public class AddLib {
public AddLib {
}
public int operationAdd(int a, int b) {
return a + b;
}
}
}
Пространства имен вводятся с помощью директивы
using <namespace name>
,
где
<namespace name>
является именем пространства имен. В C# не требуется использовать
*
, так как директива
using
неявно импортирует все элементы указанного пространства имен. Другим преимуществом является то, что пространства имен могут быть добавлены исключительно в конкретный класс. Хотя классы
Example
и
AddLib
выше определены в файле
namespace_samples.cs
.
Example
не имеет доступа к пространству имен
System.Collections
, несмотря на то, что
AddLib
его имеет. Однако инструкция
import
из Java не является специфической для класса. Она импортирует указанные элементы в файл. Вновь обратимся к
х.java
.
// х.java
public class x {
}
class у {
}
class z {
}
Если добавить инструкцию импорта, такую как
import java.util.Hashtable
, все классы, определенные внутри этого файла, будут иметь доступ к классу
Hashtable
. Код ниже будет компилироваться:
// x.java
package samples;
import java.util.Hashtable;
public class x {
Hashtable hash = new Hashtable;
}
class у {
Hashtable hash = new Hashtable;
}
class z {
Hashtable hash = new Hashtable;
}
Пространства имен можно также определять внутри другого пространства имен. Этот тип гибкости недоступен в Java без создания подкаталогов. Приведенное выше пространство
Com.Cslib
можно расширить следующим образом:
namespace Com.Cslib {
using System;
public class AddLib {
public AddLib {
}
public int operationAdd(int a, int b) {
return a + b;
}
}
namespace Ext {
public class AddLib {
public AddLib {
}
public int operationAdd(int a, int b) {
return a + b;
}
}
}
}
Пакет Java
com.javalib
можно расширить, чтобы отобразить приведенный выше код, создав новую папку