Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Дублирование имен классов, java.lang.Number vs Eckel's Number 
:(
    Опции темы
Bikutoru
Дата 27.7.2005, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: нет
Всего: 22



Здраствуйте. У меня возник один вопрос.
В 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 Как такое возможно?


--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
batigoal
Дата 27.7.2005, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



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


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
LSD
Дата 27.7.2005, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



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

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


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
jer1
Дата 27.7.2005, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 123
Регистрация: 24.1.2005
Где: Харьков Украина

Репутация: 4
Всего: 5



http://java.sun.com/docs/books/jls/third_e...ages.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.)

--------------------
:w!q
PM MAIL   Вверх
Bikutoru
Дата 30.7.2005, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: нет
Всего: 22



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


--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0997 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.