7. Java - Типы переменных: локальные переменные, переменные экземпляра, статические переменные



Переменная предоставляется нам именем хранения, чтобы нашей программой можно было манипулировать. Каждая переменная в Java имеет конкретный тип, который определяет размер и размещение её в памяти; диапазон значений, которые могут храниться в памяти; и набор операций, которые могут быть применены к переменной.

Необходимо объявить все переменные, прежде чем их использовать. Ниже показана основная форма объявления:

data type variable [ = value][, variable [= value] ...] ;

Здесь data type является одним из типов данных в Java, а «variable» - это имя переменной, «value» - значение. Чтобы объявить более чем одну переменную указанного типа, можно использовать список с запятыми в качестве разделителей.

Ниже приведены примеры объявления переменной и инициализации в Java:

int a, b, c;         // Объявляет три целых a, b, и c.
int a = 10, b = 10;  // Пример инициализации.
byte b = 22;         // Инициализация переменной b типа byte.
double pi = 3.14159; // Объявление и присвоение величины pi.
char a = 'a';        // Переменная char a присваивает значением 'a'. 

В этом разделе рассмотрим различные типы переменных, доступных в языке Java. Существует три типа переменных:

  • локальные переменные;
  • переменные экземпляра;
  • статические переменные или переменные класса.

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

  • Локальные переменные объявляются в методах, конструкторах или блоках.
  • Локальные переменные создаются, когда метод, конструктор или блок запускается и уничтожаются после того, как завершиться метод, конструктор или блок.
  • Модификаторы доступа нельзя использовать для локальных переменных.
  • Они являются видимыми только в пределах объявленного метода, конструктора или блока.
  • Локальные переменные реализуются на уровне стека внутри.
  • В Java не существует для локальных переменных значения по умолчанию, так что они должны быть объявлены и начальное значение должны быть присвоено перед первым использованием.

Пример использования локальной переменной

Здесь «age» – это локальная переменная. Это определяется внутри метода «pupAge()» и области её действия ограничивается только этим методом.

public class Test{ 
   public void pupAge(){
      int age = 0;
      age = age + 7;
      System.out.println("Возраст щенка: " + age);
   }
   
   public static void main(String args[]){
      Test test = new Test();
      test.pupAge();
   }
}

Будет получен следующий результат:

Возраст щенка: 7

Пример без инициализации

Пример использования «age» без инициализации. Программа выдаст ошибку во время компиляции.

public class Test{ 
   public void pupAge(){
      int age;
      age = age + 7;
      System.out.println("Возраст щенка: " + age);
   }
   
   public static void main(String args[]){
      Test test = new Test();
      test.pupAge();
   }
}

Это приведёт к следующему сообщению об ошибке во время компиляции:

Test.java:4:variable number might not have been initialized
age = age + 7;
         ^
1 error

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

  • Переменные экземпляра объявляются в классе, но за пределами метода, конструктора или какого-либо блока.
  • Когда для объекта в стеке выделяется пространство, создается слот для каждого значения переменной экземпляра.
  • В Java переменные экземпляра создаются тогда, когда объект создан с помощью ключевого слова «new» и разрушаются тогда, когда объект уничтожается.
  • Переменные содержат значения, которые должны ссылаться более чем на один метод, конструктор или блок, или на основные части состояния объекта, которые должны присутствовать на протяжении всего класса.
  • Переменные экземпляра могут быть объявлен на уровне класса, до или после использования.
  • Модификаторы доступа могут быть предоставлены для переменных экземпляра.
  • Переменные экземпляра в Java являются видимыми для всех методов, конструкторов и блоков в классе. Как правило рекомендуется сделать их private (уровень доступа). Однако можно сделать их видимыми для подклассов этих переменных с помощью модификаторов доступа.
  • Переменные экземпляра имеют значения по умолчанию. Для чисел по умолчанию равно 0, для логических – false, для ссылок на объект - null. Значения могут быть присвоены при объявлении или в конструкторе.
  • Переменные экземпляра в Java могут быть доступны непосредственно путем вызова имени переменной внутри класса. Однако в статических методах и различных класса (когда к переменным экземпляра дана доступность) должны быть вызваны используя полное имя – ObjectReference.VariableName.

Пример использования

import java.io.*;
 
public class Employee{
   // Переменная экземпляра открыта для любого дочернего класса.
   public String name;
   
   // Переменная salary видна только в Employee.
   private double salary;
   
   // Имя переменной присваивается в конструкторе. 
   public Employee (String empName){
      name = empName;
   }
 
   // Переменной salary присваивается значение.
   public void setSalary(double empSal){
      salary = empSal;
   }
   
   // Этот метод выводит на экран данные сотрудников.
   public void printEmp(){
      System.out.println("имя: " + name );
      System.out.println("зарплата:" + salary);
   }
 
   public static void main(String args[]){
      Employee empOne = new Employee("Олег");
      empOne.setSalary(1000);
      empOne.printEmp();
   }
}

Программа будет будет производить следующий результат:

имя: Олег
зарплата: 1000.0

Переменные класса или статические переменные в Java

  • Переменные класса, также известные в Java как статические переменные, которые объявляются со статическим ключевым слово в классе, но за пределами метода, конструктора или блока.
  • Там будет только одна копия каждой статической переменной в классе, независимо от того, сколько объектов создано из него.
  • Статические переменные или переменные класса в Java используются редко, кроме когда объявляются как константы. Константы - переменные, которые объявлены как public/private, final и static. Константы никогда не меняются от первоначального значения.
  • В Java статические переменные создаются при запуске программы и уничтожаются, когда выполнение программы остановится.
  • Видимость похожа на переменную экземпляра. Однако большинство статических переменных объявляются как public, поскольку они должны быть доступны для пользователей класса.
  • Значения по умолчанию такое же, как и у переменных экземпляра. Для чисел по умолчанию равно 0, для данных типа Boolean - false; и для ссылок на объект - null. Значения могут быть присвоены при объявлении или в конструкторе. Кроме того, они могут быть присвоены в специальных блоках статического инициализатора.
  • Статические переменные могут быть доступны посредством вызова с именем класса ClassName.VariableName.
  • При объявлении переменных класса как public, static, final, имена находятся в верхнем регистре. Если статические переменные такими не являются, синтаксис такой же, как у переменных экземпляра и локальных.

Пример статических переменных или переменных класса

import java.io.*;
 
public class Employee{
   // salary(зарплата) переменная private static
   private static double salary;
 
   // DEPARTMENT(отдел) – это константа
   public static final String DEPARTMENT = "Разработка ";
 
   public static void main(String args[]){
      salary = 1000;
      System.out.println(DEPARTMENT+"средняя зарплата: "+salary);
   }
}

Это будет производить следующий результат:

Разработка средняя зарплата: 1000

Примечание: для получения доступа из внешнего класса, константы должны быть доступны как Employee.DEPARTMENT.

Что дальше?

В предыдущих материалах не раз упоминались модификаторы доступа. В следующей главе мы подробно их рассмотрим.