Почему операторы импорта подстановочных знаков используют класс jar пути к классам вместо классов jdk?

Первоначально у меня был класс java.io.File в банке в пути к классам, у которого не было свойства separatorChar. Итак, я столкнулся с проблемой, когда работает следующий блок кода:

import java.io.File;

public class HelloWorld {

    public static void main(String[] args) { 
        System.out.println("separatorChar= " + File.separatorChar); 
    } 
}

Но я изменил оператор импорта следующим образом:

import java.io.*;

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

Я считаю, что происходит то, что import java.io. * использует класс, который находится в банке в пути к классам, тогда как import java.io.File специально использует класс File, который поставляется с Java.

Вопрос в том, почему import java.io.File работает, а java.io.* — нет?


person mejdev    schedule 12.07.2012    source источник
comment
В текущем пакете должен быть еще один класс с именем File.   -  person user207421    schedule 13.07.2012
comment
@EJP, похоже, это была проблема. Однако должна быть небольшая разница в том, как JVM ищет класс, потому что при использовании import java.io.File используется правильный класс, тогда как import java.io.* используется другой класс.   -  person mejdev    schedule 13.07.2012
comment
Это правильно. Import java.io.* дает компилятору еще одно место для поиска классов, которых нет в текущем пакете. Import java.io.File сообщает компилятору, какой файл использовать. Мораль: не используйте повторно имена классов JDK.   -  person user207421    schedule 13.07.2012


Ответы (4)


В пустом проекте код по-прежнему компилируется с import java.io.*, поэтому кажется, что используется другой класс. Если вы используете Eclipse, вы можете проверить всплывающую подсказку File, чтобы увидеть, какой это класс.

В качестве альтернативы вы можете использовать

System.out.println(File.class.toString())

который распечатает класс во время выполнения.

person fefrei    schedule 12.07.2012
comment
Есть ли способ увидеть, какой класс используется в безголовой среде? - person mejdev; 12.07.2012
comment
Конечно есть: запись в файл. - person Marko Topolnik; 12.07.2012
comment
Спасибо @felix-freiberger, это подтвердило мое предположение о том, что должен был присутствовать другой класс. Я обновил свой вопрос, чтобы быть более конкретным и предоставить более подробную информацию. - person mejdev; 13.07.2012

Как EJP прокомментировал исходный вопрос,

Это правильно. Import java.io.* дает компилятору еще одно место для поиска классов, которых нет в текущем пакете. Import java.io.File сообщает компилятору, какой файл использовать. Мораль: не используйте повторно имена классов JDK.

person mejdev    schedule 16.07.2012

Вы, должно быть, где-то еще что-то напутали.

Когда я компилирую

import java.io.*;

public class HelloWorld {

    public static void main(String[] args) { 
        System.out.println("separatorChar= " + File.separatorChar); 
    } 
}

я получил

c:\files\j>javac HelloWorld.java

c:\files\j>java HelloWorld
separatorChar= \
person corsiKa    schedule 12.07.2012

когда вы используете java.io.*; все, что вы видите, это файл, поэтому вместо File.seperatorChar путь к separatorChar — io.file.separaterChar. Это касается того, где находится отправная точка. Это похоже на файловую систему... если вы находитесь в /users/matt и вводите /documents/mytext.txt, полный путь будет C:/users/matt/documents/mytext.txt Если я вернусь к пользователям файл, то та же самая команда (/documents/mytext.txt) будет искать C:/users/documents/mytext.txt, которого не существует. Надеюсь, это поможет.

person Matt Westlake    schedule 12.07.2012
comment
io.File.separatorChar не сработает. Ответ совершенно неверный. - person user207421; 13.07.2012
comment
Извините, это был не полный ответ, а скорее объяснение того, что происходит. вы никогда не сможете опуститься более чем на 1 уровень ниже того, где вы находитесь. - person Matt Westlake; 13.07.2012
comment
Но он не передал этого, и это не ответ, даже когда он передан. Проблема совсем в другом. * открывает другую область пакета для поиска: File +направляет+ компилятор к определенному классу в определенной области пакета. - person user207421; 15.07.2012