2013-10-07 4 views
3

Я читал мою AP CS книгу и говорил о трех типах переменных:Область параметра vs локальная переменная scope?

• Переменные экземпляра

• Локальные переменные

• Параметры

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

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

ответ

0

Локальные переменные инициализируются в методе, а параметры передаются в метод.

+0

я сказал, несмотря на их использование, но хорошо –

+0

Это не вовлекают их использования. Если вы передаете параметр, вы его не инициализируете, то это другой тип переменной. – Troubleshoot

2

Java Language Specification identifies 7 types of variables. Их описание

переменной класса представляет собой поле, объявленные с помощью ключевого слова статического в пределах объявления класса в (§8.3.1.1), или с или без ключевого слова статического в объявлении интерфейса (§9.3) ,

Переменная класса создается, когда ее класс или интерфейс подготовлен (§12.3.2) и инициализируется значением по умолчанию (§4.12.5). Переменная класса эффективно прекращает свое существование, когда ее класс или интерфейс выгружен (§12.7).

переменная экземпляра - это поле, объявленное в объявлении класса без использования ключевого слова static (§8.3.1.1).

Если класс Т имеет поле а именно переменную экземпляра, то новый экземпляр переменная а создается и инициализируется на значение по умолчанию (§4.12.5) как часть каждого вновь созданного объекта класса T или любого класса , который является подклассом T (§8.1.4). Переменная экземпляра фактически прекращает свое существование, когда объект, полем которого он является полем , больше не ссылается, после того, как была завершена любая необходимая доработка объекта (§12.6).

компоненты массива являются безымянные переменные, которые создаются и инициализируются значения по умолчанию (§4.12.5) всякий раз, когда новый объект, который создается массив (§10, §15.10). Элементы массива эффективно перестают существовать, когда массив больше не ссылается.

Параметры метода (§8.4.1) значения аргументов имени, переданные методу.

Для каждого параметра, объявленного в объявлении метода, при каждом вызове метода создается новый параметр . (§15.12). Новая переменная инициализируется значением соответствующего аргумента из вызова метода .Параметр метода эффективно прекращает свое существование , когда выполнение тела метода завершено.

Параметры конструктора (§8.8.1) значения аргументов имени, переданные в конструктор .

Для каждого параметра, объявленного в объявлении конструктора, новый переменная параметра создаются каждый раз, когда создание экземпляра класса выражения (§15.9) или явный вызов конструктора (§8.8.7) вызывает этот конструктор. Новая переменная инициализируется значением соответствующего аргумента из выражения создания или вызовом конструктора . Параметр конструктора эффективно прекращает существование , когда выполняется выполнение тела конструктора .

Параметр исключения создается каждый раз, когда исключение попадает на предложение catch инструкции try (§14.20).

Новая переменная инициализируется фактическим объектом, связанным с исключением (§11.3, §14.18). Параметр исключения эффективно прекращает свое существование, когда выполнение блока, связанного с уловом , завершено.

Локальные переменные объявлены локальными заявлениями о декларации переменных (§14.4).

Всякий раз, когда поток управления переходит в блок (§14.2) или для постановки (§14.14), новая переменная создается для каждой локальной переменной объявленной в локальной переменной оператора объявления сразу, содержащейся в , которые блокируют или для заявление.

Вы также должны прочитать около variable scope, в котором описывается, где какой-либо именованный объект может использоваться в вашем приложении.

Поэтому мой вопрос, почему они будут классифицировать параметры и локальные переменные, как различные категории переменных, если они содержат одинаковый объем

Как видно из приведенных выше описаний, они не содержат той же сферы и, следовательно, необходимо дифференцировать.

3

Потому что они не обязательно имеют одинаковый охват.

Возьмите этот случай:

// this is garbage code 
public void doSomething(int foo) { 
    int meh = 0; 
    while (true) { 
     // can access foo and meh 
     int blah = meh++; 
     if (blah == foo) { 
      break; 
     } 
    } 
    // won't compile, can't access blah anymore 
    System.out.println(blah); 
    // will compile 
    System.out.println(foo); 
    // will compile as well 
    System.out.println(meh); 
} 
+0

Почему он не компилируется? –

+1

@someone, потому что он ссылается на переменную, которая находится в цикле 'while', после завершения цикла, где она больше не доступна. Это хороший пример (на мой взгляд) различия между параметрами и локальными переменными в зависимости от области видимости. ** Редактировать **, конечно, это пример. Локальные переменные могут также ** быть в той же области, что и аргументы - 'meh' разделяет область с' foo'. – Mena

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