132 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			132 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
|   | --- | |||
|  | title: Static | |||
|  | localeTitle: статический | |||
|  | --- | |||
|  | # статический
 | |||
|  | 
 | |||
|  | Когда вы объявляете переменную или метод статическими, она принадлежит классу, а не конкретному экземпляру. Это означает, что существует только один экземпляр статического члена, даже если вы создаете несколько объектов класса или если вы его не создаете. Он будет использоваться всеми объектами. | |||
|  | 
 | |||
|  | Статическое ключевое слово можно использовать с переменными, методами, блоками кода и вложенными классами. | |||
|  | 
 | |||
|  | ## Статические переменные
 | |||
|  | 
 | |||
|  | **_Пример:_** | |||
|  | 
 | |||
|  | ```java | |||
|  | public class Counter {  | |||
|  |   public static int COUNT = 0;  | |||
|  |   Counter() {  | |||
|  |     COUNT++;  | |||
|  |   }  | |||
|  |  }  | |||
|  | ``` | |||
|  | 
 | |||
|  | Переменная `COUNT` будет использоваться всеми объектами этого класса. Когда мы создаем объекты нашего класса Counter в main и получаем доступ к статической переменной. | |||
|  | 
 | |||
|  | ```java | |||
|  | public class MyClass {  | |||
|  |   public static void main(String[] args) {  | |||
|  |     Counter c1 = new Counter();  | |||
|  |     Counter c2 = new Counter();  | |||
|  |     System.out.println(Counter.COUNT);  | |||
|  |   }  | |||
|  |  }  | |||
|  |  // Outputs "2"  | |||
|  | ``` | |||
|  | 
 | |||
|  | Outout равно 2, потому что переменная `COUNT` статична и увеличивается каждый раз при создании нового объекта класса Counter. Вы также можете получить доступ к статической переменной с помощью любого объекта этого класса, такого как `c1.COUNT` . | |||
|  | 
 | |||
|  | ## Статические методы
 | |||
|  | 
 | |||
|  | Статический метод относится к классу, а не к экземплярам. Таким образом, его можно вызвать без создания экземпляра класса. Он используется для изменения статического содержимого класса. Существуют некоторые ограничения статических методов: | |||
|  | 
 | |||
|  | 1.  Статический метод не может использовать нестатические элементы (переменные или функции) класса. | |||
|  | 2.  Статический метод не может использовать `this` или `super` ключевые слова. | |||
|  | 
 | |||
|  | **_Пример:_** | |||
|  | 
 | |||
|  | ```java | |||
|  | public class Counter {  | |||
|  |   public static int COUNT = 0;  | |||
|  |   Counter() {  | |||
|  |     COUNT++;  | |||
|  |   }  | |||
|  |   | |||
|  |   public static void increment(){  | |||
|  |     COUNT++;  | |||
|  |   }  | |||
|  |  }  | |||
|  | ``` | |||
|  | 
 | |||
|  | Статические методы также можно вызывать из экземпляра класса. | |||
|  | 
 | |||
|  | ```java | |||
|  | public class MyClass {  | |||
|  |   public static void main(String[] args) {  | |||
|  |     Counter.increment();  | |||
|  |     Counter.increment();  | |||
|  |     System.out.println(Counter.COUNT);  | |||
|  |   }  | |||
|  |  }  | |||
|  |  // Outputs "2"  | |||
|  | ``` | |||
|  | 
 | |||
|  | Выходной сигнал равен 2, поскольку он увеличивается с помощью статического метода `increament()` . Подобно статическим переменным, статические методы также могут быть доступны с использованием переменных экземпляра. | |||
|  | 
 | |||
|  | ## Статические блоки
 | |||
|  | 
 | |||
|  | Статические блоки кода используются для инициализации статических переменных. Эти блоки выполняются сразу после объявления статических переменных. | |||
|  | 
 | |||
|  | **_Пример:_** | |||
|  | 
 | |||
|  | ```java | |||
|  | public class Saturn {  | |||
|  |   public static final int MOON_COUNT;  | |||
|  |   | |||
|  |   static {  | |||
|  |     MOON_COUNT = 62;  | |||
|  |   }  | |||
|  |  }  | |||
|  | ``` | |||
|  | 
 | |||
|  | ```java | |||
|  | public class Main {  | |||
|  |   public static void main(String[] args) {  | |||
|  |     System.out.println(Saturn.MOON_COUNT);  | |||
|  |   }  | |||
|  |  }  | |||
|  |  // Outputs "62"  | |||
|  | ``` | |||
|  | 
 | |||
|  | Вывод равен 62, потому что переменной `MOON_COUNT` присваивается это значение в статическом блоке. | |||
|  | 
 | |||
|  | ## Статические вложенные классы
 | |||
|  | 
 | |||
|  | Класс может иметь статический вложенный класс, к которому можно получить доступ, используя внешнее имя класса. | |||
|  | 
 | |||
|  | **_Пример:_** | |||
|  | 
 | |||
|  | ```java | |||
|  | public class Outer {  | |||
|  |   | |||
|  |   public Outer() {  | |||
|  |   }  | |||
|  |   | |||
|  |   public static class Inner {  | |||
|  |     public Inner() {  | |||
|  |     }  | |||
|  |   }  | |||
|  |  }  | |||
|  | ``` | |||
|  | 
 | |||
|  | В приведенном выше примере класс `Inner` может быть напрямую доступен как статический член класса `Outer` . | |||
|  | 
 | |||
|  | ```java | |||
|  | public class Main {  | |||
|  |   public static void main(String[] args) {  | |||
|  |     Outer.Inner inner = new Outer.Inner();  | |||
|  |   }  | |||
|  |  }  | |||
|  | ``` | |||
|  | 
 | |||
|  | Один из вариантов использования статических вложенных классов в [шаблоне Builder,](https://en.wikipedia.org/wiki/Builder_pattern#Java) широко используемом в java. |