2013-05-06 2 views
2

вопрос заголовка немного сложнее, так вот моя проблема:Java - ArrayList и создания объекта

1- Я создал объект у из в ArrayList и я назначил его в качестве исходной величины, до сих пор так хорошо.

ArrayList<String> y = new ArrayList<String>(); 

2- Здесь я добавил элемент в массив:

y.add("Hello"); y.add("GoodBye"); 

Теперь вот часть, которую я не понимаю, теперь, когда я создаю метод, который возвращает строку:

public String stringful(ArrayList<String> list) 

Теперь, когда я пытаюсь получить размер() массива, я использую list.size(), но почему? Не является ли исходный объект, и я должен использовать y.size(), хотя он не работает, поэтому я здесь. Благодаря

+0

Вы используете способ. Поэтому. Список заменяет то, что когда-либо передается вашему методу в данный момент. Быть «местным». – Tdorno

+0

Подсказка: что произойдет, если я напишу 'stringful (z)'? – SLaks

+0

Поскольку y - это переменная, которая является локальной, я предполагаю, что z будет передана в список, а java будет рассматривать ее как локальную переменную без необходимости объявлять ее так же, как мы сделали с y –

ответ

4

С помощью этого метода заголовка:

public String stringful(ArrayList<String> list) 

Вы объявляя, что этот метод будет использовать объект, типа ArrayList<String> называется list. Поскольку вы объявляете y локально, другой метод не знает, что даже существует. Ссылка на y из этого метода не будет компилироваться, предполагая, конечно, что это локальная переменная.

указатели в Java

При создании нового объекта, можно использовать указатель на этот объект. Например, когда вы заявляете:

ArrayList<String> y; 

Вы создаете указатель. Когда вы добавляете код:

ArrayList<String> y = new ArrayList<String>(); 

Это помещает указатель на новый ArrayList<String> объекта в переменную y. Поэтому, когда вы передаете y в качестве параметра в метод, вы передаете указатель на объект, который также указывает на объект y, а не на объект. Вот почему ваш код работает с list.size(). Все, что он делает, это получить значение size одного и того же объекта, просто с другим указателем.

Резюме

В сводке, на самом деле является тот же объект. Это просто разные указатели, глядя на этот объект.

+0

Ammended. Формулировка была неправильной. Благодарю @SotiriosDelimanolis – christopher

3

Вы передаете ссылку на ArrayList<String> y на метод stringful на list ссылочную переменную и, следовательно, будет использовать list.size(). y неизвестен этому методу, если y не является переменной экземпляра или класса, которая видна в этом методе. list - это локальная переменная здесь, которая используется для передачи ссылки y. Таким образом, вы можете передать ссылку на любой метод ArrayList<String> на этот метод и рассчитать его длину. Если вы использовали y.size() в этом методе (при условии, что в этом методе отображается y), то вы могли бы вычислить только длину ArrayList<String>, на которую ссылаются y.

2

y является местной переменной .
Он существует только внутри функции, в которой вы ее объявили.
y относится к экземпляру ArrayList.

Когда вы пишете stringful(y), вы проходите этот ArrayList экземпляр в качестве параметра к функции.
Внутри функции вы можете ссылаться на значение параметра с помощью переменной «list» (это фактически параметр, но он похож на переменную), который относится к тому же экземпляру, который вы передали при его вызове.

0

Взгляните на this tutorial. Он проходит через область видимости и кажется довольно ясным. Для примера:

public class Test{ 
    private List<String> globalY;//accessable to anything in the class 

    public Test(){ 
     globalY=new ArrayList<String>(); 
     globalY.add("global"); 
    } 

    //here, methodParam is only accessible inside this method 
    public void example(ArrayList<String> method){ 
     //this list is only available inside this method 
     List<String> local=new ArrayList<String>(); 
     local.add("local"); 

     System.out.println(globalY(0)); 
     System.out.println(method(0)); 
     System.out.println(local.get(0)); 
    } 

    public static void main(String[] args){ 
     Test test=new Test(); 
     List<String> localY=new ArrayList<String>(); 
     localY.add("method"); 

     test.example(localY); 
    } 
} 
Смежные вопросы