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.
|