Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Дублирование имен классов


Автор: Bikutoru 27.7.2005, 09:23
Здраствуйте. У меня возник один вопрос.
В 3ей главе Эккеля приведён следующий пример:
Код

class Number
{
    int i;
}

public class Assignment
{
    public static void main(String[] pars)
    {
        Number n1 = new Number();
        Number n2 = new Number();
        
        n1.i = 9;
        n2.i = 47;        
        System.out.println("1: n1.i=" + n1.i + " n2.i=" + n2.i);
        
        n1 = n2;
        System.out.println("2: n1.i=" + n1.i + " n2.i=" + n2.i);
        
        n1.i = 27;
        System.out.println("3: n1.i=" + n1.i + " n2.i=" + n2.i);                
    }
}

В то же время в каждую программу неявно импортируется java.lang, в состав которого тоже входит класс Number. При этом никакой ошибки не происходит, хотя по логике у нас есть два различных класса с одинаковым названием...
Если я явно импортирую java.lang.*, то опять же нет никакой ошибки, она возникает, только если я явно импортирую java.lang.Number.
А теперь, собственно, мой вопрос smile Как такое возможно?

Автор: batigoal 27.7.2005, 09:45
Скорее всего, класс из этого же пакета "перекрывает" класс из других пакетов.
Можно поэкспериментировать - сделать свой пакет, перенести в него свой Number и попробовать импортировать.
Добавлено @ 09:51
А может, это особенность пакета java.lang?..

Автор: LSD 27.7.2005, 09:53
Явный импорт класса перекрывает импорт пакета:
Код
import java.util.Date;
import java.sql.*;

Будет использован java.util.Date. А вообще это все проблемы времени компиляции, внутри байткода все имена классов хранятся полностью (с именем пакета).

Автор: jer1 27.7.2005, 13:35
http://java.sun.com/docs/books/jls/third_edition/html/packages.html#7.5.2
или по-русски
http://www.uni-vologda.ac.ru/java/jls/7-doc.htm

как я понял при одиночном импорте (7.5.1 Single-Type-Import Declaration) мы сразу связываем тип и имя в соответствующем модуле компиляции (в дальнейшем в этом модуле компиляции другой тип с таким же именем мы не сможем объявить из-за конфликта имён)

Цитата

7.5.1 Single-Type-Import Declaration
A single-type-import declaration imports a single type by giving its canonical name, making it available under a simple name in the class and interface declarations of the compilation unit in which the single-type import declaration appears.


импорт по шаблону (7.5.2 Type-Import-on-Demand Declaration) даёт возможность получать доступ к типам находящимся в заданом пакете
Цитата

A type-import-on-demand declaration allows all accessible (§6.6) types declared in the type or package named by a canonical name to be imported as needed.

TypeImportOnDemandDeclaration:
        import PackageOrTypeName . * ;


Причём в дальнейшем объясняется как разрешаются спорные ситуации
в отношении имен типов: опять же как я понял, имя типа получаемое из конструкции вида PackageOrTypeName . * используется только если нет более частного случая: одиночного импорта импортирующего тип с тем же именем, наличие класса или интерфейса с тем же именем в текущем модуле компиляции

Цитата

The example:

import java.util.*;

causes the simple names of all public types declared in the package java.util to be available within the class and interface declarations of the compilation unit. Thus, the simple name Vector refers to the type Vector in the package java.util in all places in the compilation unit where that type declaration is not shadowed (§6.3.1) or obscured (§6.3.2). The declaration might be shadowed by a single-type-import declaration of a type whose simple name is Vector; by a type named Vector and declared in the package to which the compilation unit belongs; or any nested classes or interfaces. The declaration might be obscured by a declaration of a field, parameter, or local variable named Vector (It would be unusual for any of these conditions to occur.)

Автор: Bikutoru 30.7.2005, 10:23
Всем спасибо за ответы. Почитал их, спецификацию, поэкспериментировал, вроде бы с этим разобрался (плюю через левое плечо, чтобы не сглазить)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)