2016-05-18 2 views
4

это может быть тупая вопрос когда-нибудь задавали переполнение стека, но это беспокоит меня много ...прохождение INT литерала метод, который принимает целое число в Java

public class shorte 
{ 
    public static void main(String []args) 
    { 
     short e = 56; // no need for explicit cast 
     System.out.println(e); 
     start(56); // why does int literal here needs explicit cast ... 
    } 
    static void start(short e) 
    { 
     System.out.println(e); 
    } 
} 

при создании нормальной короткой переменной из INT буквальным в функции не запрашивается какой-либо явный приведение, но почему передача переменной int literal в короткую переменную (передача параметров) требует явного литья ...... ??

и снова

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

** объем «для» переменной счетчика * *

public class forloop 
{ 
    public static void main(String []args) 
    { 
     int a =12; 
     for(int a =12;a<14;++a) // no showdowing of variable ,give compile-time error 
     { 
      System.out.println(a); 
     } 
    } 
} 

так я попробовал его с нормальными блоками

a=12 
{ 
a=13; even this doesn't compile 
} 

это означает, что блоки не имеют свои собственные рамки ...

+0

у них есть собственная область видимости, но это не означает, что они игнорируют все, что было определено ранее. Перед циклом было определено просто 'a', и вы переопределяете переменную с тем же именем, которая приведет к ошибке времени компиляции. – SomeJavaGuy

+0

Никто не может ответить сразу на два ответа. Пожалуйста, отделите свои вопросы, или они будут закрыты. – Riduidel

+0

https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html искать целые литералы. –

ответ

3

A short Литерал может быть автоматически построен из литерала int в Java. Это относится к

short e=50; 

Но вызов функции и параметры прохождения различны. Из-за возможности перегрузки вызов функции должен точно соответствовать прототипу функции. Представьте себе перегруженную функцию с параметром int для одной версии и параметром short для другого.

Что касается второго вопроса, на большинстве языков вы обычно не можете скрыть идентификатор, объявленный во внешней области, тем же идентификатором во внутренней области. У меня есть два исключения в моей голове:

1- Глобальная переменная может быть скрыта локальной переменной (например, в C++, поскольку Java не имеет глобальных переменных).

2- Элемент данных класса может быть скрыт локальной переменной.

В обоих случаях язык предлагает оператор разрешения (:: для 1- и this для 2-).

+0

да !!!, имеет смысл сделать теневое релевантный должен предоставить оператору разрешения выбор между теневым и теневым переменным ...... изящное объяснение, почему затенение не может вступить в игру здесь @Wabbi – viru

+0

@viru Рад, что было ясно. Есть ли у кого-нибудь другие примеры возможного сходного затенения? – AhmadWabbi

+0

, но в том, что касается первого вопроса, не должен компилятор хотя бы пытаться сопоставить объявленные методы, чтобы найти наилучший вариант .... который в этом случае является стартом (короткий e) .... @ Wabbi – viru

1

Вопрос 2:

int a =12; 
     for(int a =12;a<14;++a) // no showdowing of variable ,give compile-time error 
     { 
      System.out.println(a); 
     } 

Я считаю, что суть заключается в том, что большую часть времени, это не намеренно, это программирование или логический недостаток.

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

Вопрос 1:

В ИНТ версии, компилятор знает, что все данные числа могут быть сохранены в короткий. Информация не теряется. Это не всегда верно для буквенных значений.

1

Просто с технической точки зрения (не спекулировать о причинах ;-)): Это в the specification

а)

5.2 Назначение преобразования
[...]
Кроме того, если выражение является постоянным выражением ( §15.28 ) типа байт , короткой , символ или INT:
• сужению примитивные преобразования может быть использован, если тип переменной байт , короткой или символ , а значение константы выражения представима в типа переменной.

б)

6,4 Затенение и Сокрытие
[...]
Это ошибка во время компиляции, если имя локальной переменной v будет повторно объявлен как локальная переменная непосредственно метод размещения, конструктор или блок инициализатора в пределах сфера применения v ; или в качестве параметра исключения из улова оговорки в попытка заявления из непосредственно охватывающего метода, конструктора или инициализатор блока в пределах от об ; или как ресурс в попробуйте -соотношение ресурсов непосредственно заключенного метода , конструктора или инициализатора в пределах v .
Смежные вопросы