2017-01-03 8 views
2

Я знаю, что переменные могут быть классифицированы по двум направлениям: -Все переменные экземпляра объявлены вне функций?

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

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

Мой инструктор говорит, что переменные экземпляра могут быть объявлены только вне функций. Почему это так? Могут ли локальные переменные не быть переменными экземпляра?

+0

'объявлено вне functions' ... нет функции в Java, только методов. –

+0

Нет, они не могут. Их объем ограничивается использованием внутри метода после того, как они были объявлены в одном. Они недоступны из других методов или объектов. – f1sh

+0

Если метод, вызываемый объектом, является экземпляром или статичным, то я предполагаю, что любые переменные, объявленные в рамках этого метода, будут соответствовать этому. Вид спорный, хотя, поскольку объем таких переменных будет только для этого вызова метода. – David

ответ

5

Если вы объявите переменную внутри метода, это локальная переменная, принадлежащая этому методу. Когда метод будет прекращен, он выйдет за рамки. Единственный способ иметь переменную принадлежит экземпляру - объявлять ее непосредственно под классом, то есть вне любого метода.

РЕДАКТИРОВАТЬ:

Вот пример, как это было предложено @Yeikel:

public class MyClass { 

    private static int iAmAStaticMember = 1; 

    private int iAmAnInstanceMember; 

    public void someMethod() { 
     int iAmALocalVariables = 4; 
    } 
} 
+3

Возможно, вы должны добавить образец кода, чтобы завершить этот ответ. – Yeikel

+0

Но не является локальной переменной частью объекта. – MrAP

+0

@MrAP: В зависимости от семантики того, как вы определяете «часть объекта», я полагаю. Метод является методом экземпляра, поэтому интуитивно область действия этого метода связана с экземпляром объекта. С другой стороны, если вы спрашиваете, находятся ли сами ценности в стеке или в куче, это совсем другая история. Действительно ли это имеет значение? Есть ли более глубокая цель в том, что здесь задают? – David

1

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

public class Something { 

    int j = 0; // j lives as long as the class exists 

    public doSomething() { 
     int i = 0; 
     // i is gone after method run 
    } 
} 
1

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

1

В Java есть экземпляр, статические и локальные переменные.

Статические переменные являются переменными уровня класса, которые принадлежат самому классу, и поэтому одна копия поддерживается и используется всеми классами/объектами. Они оживают, когда класс загружается загрузчиком классов и умирает, когда класс был выгружен.

Переменные экземпляра привязаны к экземпляру класса, то есть объекта. Таким образом, существует копия переменной для каждого созданного объекта. На основе модификатора доступа ограничение распространяется на его использование вне класса (обычно делается закрытым и доступным через геттеры и сеттеры). Они становятся живыми, когда экземпляр создается и умирает, когда сборщик мусора видит, что объект не имеет действительной/используемой ссылки, указывающей на него.

Локальные переменные являются переменными уровня метода, то есть они являются локальными для метода. Эти переменные создаются при вызове метода (либо статическим способом, либо посредством ссылки на объект), и умирают, когда выполнение метода завершено, или, другими словами, когда метод возвратил управление вызывающему.

class Demo { 

    // static variable - can be accessed by any class/object 
    public static int num1 = 1; 

    // instance variable - accessed by all objects of this class; if made private, can use accessor methods to access it 
    public int num2 = 2; 

    // num3 is a local variable (method arguments are also local variables) 
    public void getSum() { 
     int num3 = 3; 
     return num2 + num3; 
    } 

} 

Надеется, что это помогает :)