2015-11-26 2 views
0

У меня есть следующий код:Почему Java разрешает имя класса быть таким же, как имя класса, который он импортирует?

class Exception 
{ 
    public static void main(String args[]) 
    { 

     int x = 10; 
     int y = 0; 

     int result; 

     try{ 
      result = x/y; 
     } 
     catch(ArithmeticException e){ 
      System.out.println("Throwing the exception"); 
      throw new ArithmeticException(); 
     } 
    } 
} 

Имя класса является «Exception». Это то же самое, что и java.lang.Exception, которое по умолчанию импортируется в программу. Тогда почему эта программа компилируется с двумя классами, имеющими одинаковое имя?

+0

Это компилируется на моей системе –

ответ

3

Why does this program compile with two classes having effectively the same name?

Они имеют тот же простое имя. Однако их имена (полностью квалифицированные имена, включающие объявления пакетов) различны.

Как вы его определили, ваш код не компилируется, если только ваш класс не находится в пакете по умолчанию для проекта. Ваш тип (Exception) скрывает один, определенные в java.lang упаковке и с момента вашего типа не подтип Throwable, компилятор выдает ошибку:

No exception of type Exception can be thrown; an exception type must be a subclass of Throwable

Если вы хотите, чтобы указать, что java.lang.Exception должны быть пойманы, то вы должны использовать полное имя, так как есть именованные конфликты в противном случае:

class Exception { 
    public static void main(String args[]) { 

     int x = 10; 
     int y = 0; 

     int result; 

     try { 
      result = x/y; 
     } catch (ArithmeticException e) { 
      System.out.println("Throwing the exception"); 
      throw new ArithmeticException(); 
     } catch (java.lang.Exception ae) { 
      System.out.println("Caught the rethrown exception"); 
     } 
    } 
} 
0

Java допускает одно и то же имя класса в другой упаковке.

В вашем примере:

Exception класс находится в пакете приложения по умолчанию.

java.lang.Exception есть в java.lang упаковка.

Вот почему ваш код скомпилирован, если вы попытаетесь сделать такое же имя класса в том же классе, а затем компилятор покажет вам ошибку.

0

Компилятор Java только жалуется, если вы использовали ключевое слово как «идентификатор».

В java Тот же класс имени, который вы можете повторно объявить, но только ограничивать, он должен быть в разных пакетах.

Здесь, в вашем случае,

you class name Exception allowed by compiler because it reside into different package rather then java.lang.

Так, во время компиляции,

compiler just checks whether same class into same package or not. If found then compiler complain like, already exist otherwise won't.

Смежные вопросы