2013-12-19 5 views
0

Например, скажем, я хотел создать 5 переменных, как так:Почему нельзя использовать имена переменных в Java?

int a1 = 1; 
int a2 = 2; 
int a3 = 3; 
int a4 = 4; 
int a5 = 5; 

Почему это не возможно сделать это с помощью цикла:

for(int i=0;i<5;i++) 
    int "a"+i = i; // syntax is just an example 

Или даже:

int a1, a2, a3, a4, a5; 
for(int i=0;i<5;i++) 
    "a"+i = i; // syntax is just an example 

Я предполагаю, что это невозможно, учитывая, что я никогда не видел этого. Но почему нет? Это просто синтаксически невозможно? Или это потому, что его реализация приведет к гораздо большему количеству проблем, чем преимуществ?

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

+0

Поскольку авторы Java решили не поддерживать эту функцию. Очень немногие другие языки поддерживают его. –

+0

Помимо всего прочего, это побуждает писать такой код - а не более элегантный подход 'int [] a = new int [5]' ... –

+0

Проверьте [это] (http://arshajii.com/ coding-faqs/dynamic-vars.html). – arshajii

ответ

1

То, что вы пытаетесь сделать, не может быть выполнено с использованием динамического имени переменной в Java, что просто не будет синтаксически корректным. Есть лучшие способы сделать это, как с помощью массива:

int[] a = new int[5]; 
a[0] = 1; 
a[1] = 2; 
a[2] = 3; 
a[3] = 4; 
a[4] = 5; 

for(int i=0; i<5 ;i++) { 
    a[i] = i;  
} 
0

Или это потому, что его реализация будет ввести гораздо больше проблем, чем преимуществ?

Да, вы в основном правы с этим утверждением. Локальные переменные во многом влияют на максимальную эффективность, и любой механизм, который позволяет им отражаться во время выполнения, будет несовместим с производительностью реальной системы, где имя локальной переменной используется только для «объединения точек» в уровень машинного кода и переменная, скорее всего, являются регистром процессора или жестко закодированным смещением стека.

Возможность ссылаться на локальные переменные также могла бы вызвать концептуальные проблемы: это сделало бы локальные вары первоклассными, поэтому такую ​​ссылку можно было бы вернуть из метода. Ясно, что возврат локального var из метода является неопределенной концепцией.

2

Поскольку Java является строго типизированным языком.
Согласно java docs

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

+0

Java также имеет отражение, которое строго типизировано только в письме. Поэтому этот аргумент не исключает отражения локальных переменных: вы можете сделать рефлексивную ссылку на локальный var, который имеет тип 'LocalVar' и оставить остальную часть среды выполнения. –

0

Что вы пытаетесь достичь, это немного сложнее ...

Map<String, Integer> arrayLikeMap = new HashMap<>(); 
for(int i = 1; i <= 5; i++) { 
    arrayLikeMap.put("a"+i, i); 
} 

И вы можете получить значение как arrayLikeMap.get("a"+1);

+0

Хотя использование массива делает его более легким. –

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