Статик для чего в программе

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

Статические поля

Статические поля хранят состояние всего класса / структуры. Статическое поле определяется как и обычное, только перед типом поля указывается ключевое слово static . Например, рассмотрим класс Person, который представляет человека:

Person bob = new(68); bob.СheckAge(); // Уже на пенсии Person tom = new(37); tom.СheckAge(); // Сколько лет осталось до пенсии: 28 // получение статического поля Console.WriteLine(Person.retirementAge); // 65 // изменение статического поля Person.retirementAge = 67; class Person < int age; public static int retirementAge = 65; public Person(int age) < this.age = age; >public void СheckAge() < if (age >= retirementAge) Console.WriteLine(«Уже на пенсии»); else Console.WriteLine($»Сколько лет осталось до пенсии: «); > >

В данном случае класс Person имеет два поля: age (хранит возраст человека) и retirementAge (хранит пенсионный возраст). Однако поле retirementAge является статическим. Оно относится не к конкретному человеку, а ко всем людям. (В данном случае для упрощения пренебрежем тем фактом, что в зависимости от пола и профессии пенсионный возраст может отличаться.) Таким образом, поле retirementAge относится не к отдельную объекту и хранит значение НЕ отдельного объекта класса Person, а относится ко всему классу Person и хранит общее значение для всего класса.

Что такое статический блок инициализации? static инициализатор ‍ Собеседование Java #Shorts ✅

Причем в самом классе мы можем использовать это поле как и любые другие. Так, в методе СheckAge() , который поверяет пенсионный статус человека, для проверки используем это поле:

if (age >= retirementAge)

Но если мы хотим обратиться к этому полю вне своего класса, то мы можем обращаться к этому полю по имени класса:

Console.WriteLine(Person.retirementAge); Person.retirementAge = 67;

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

Статические методы класса в C#

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

Статические свойства

Подобным образом мы можем создавать и использовать статические свойства:

Person bob = new(68); bob.СheckAge(); Console.WriteLine(Person.RetirementAge); // 65 class Person < int age; static int retirementAge = 65; public static int RetirementAge < get < return retirementAge; >set < if (value >1 value < 100) retirementAge = value; >> public Person(int age) < this.age = age; >public void СheckAge() < if (age >= retirementAge) Console.WriteLine(«Уже на пенсии»); else Console.WriteLine($»Сколько лет осталось до пенсии: «) ; > >

В данном случае доступ к статической переменной retirementAge опосредуется с помощью статического свойства RetirementAge .

МОДИФИКАТОР STATIC В C# | ЧТО ТАКОЕ И КАК ИСПОЛЬЗОВАТЬ

Таким образом, переменные и свойства, которые хранят состояние, общее для всех объектов класса / структуры, следует определять как статические.

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

var tom = new Person(); var bob = new Person(); var sam = new Person(); Console.WriteLine(Person.Counter); // 3 class Person < static int counter = 0; public static int Counter =>counter; public Person() < counter++; >>

Читайте также:
Что за программа таскер

В данном случае в классе Person счетчик хранится в приватной переменной counter, значение которой увеличивается на единицу при создании объекта в конструкторе. А с помощью статического свойства Counter, которое доступно только для чтения, мы можем получить значение счетчика.

Статические методы

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

Person bob = new(68); Person.CheckRetirementStatus(bob); class Person < public int Age < get; set; >static int retirementAge = 65; public Person(int age) => Age = age; public static void CheckRetirementStatus(Person person) < if (person.Age >= retirementAge) Console.WriteLine(«Уже на пенсии»); else Console.WriteLine($»Сколько лет осталось до пенсии: «) ; > >

В данном случае в классе Person определен статический метод CheckRetirementStatus() , который в качестве параметра принимает объект Person и проверяет его пенсионный статус.

Следует учитывать, что статические методы могут обращаться только к статическим членам класса. Обращаться к нестатическим методам, полям, свойствам внутри статического метода мы не можем.

Статический конструктор

Кроме обычных конструкторов у класса также могут быть статические конструкторы. Статические конструкторы имеют следующие отличительные черты:

  • Статические конструкторы не должны иметь модификатор доступа и не принимают параметров
  • Как и в статических методах, в статических конструкторах нельзя использовать ключевое слово this для ссылки на текущий объект класса и можно обращаться только к статическим членам класса
  • Статические конструкторы нельзя вызвать в программе вручную. Они выполняются автоматически при самом первом создании объекта данного класса или при первом обращении к его статическим членам (если таковые имеются)

Статические конструкторы обычно используются для инициализации статических данных, либо же выполняют действия, которые требуется выполнить только один раз

Определим статический конструктор:

Console.WriteLine(Person.RetirementAge); class Person < static int retirementAge; public static int RetirementAge =>retirementAge; static Person() < if (DateTime.Now.Year == 2022) retirementAge = 65; else retirementAge = 67; >>

В данном случае с помощью встроенной структуры DateTime получаем текущий год. Для этого используется свойство DateTime.Now.Year . если он равен 2022, устанавливаем один пенсионный возраст. При другом значении текущего года устанавливается другое значение пенсионного возраста.

Статические классы

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

Console.WriteLine(Operations.Add(5, 4)); // 9 Console.WriteLine(Operations.Subtract(5, 4)); // 1 Console.WriteLine(Operations.Multiply(5, 4)); // 20 static class Operations < public static int Add(int x, int y) =>x + y; public static int Subtract(int x, int y) => x — y; public static int Multiply(int x, int y) => x * y; >

Источник: metanit.com

Для чего нужен блок static?

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

Отслеживать
50.9k 81 81 золотой знак 261 261 серебряный знак 499 499 бронзовых знаков
задан 6 июл 2015 в 7:52
user184942 user184942
163 1 1 золотой знак 1 1 серебряный знак 6 6 бронзовых знаков

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

Читайте также:
Программа cyberlink photodirecTor что это

6 июл 2015 в 20:14

5 ответов 5

Сортировка: Сброс на вариант по умолчанию

Статические блоки вызываются в момент инициализации класса (когда ClassLoader будет грузить его в MetaSpace, подробнее в JLS), и могут использоваться для иницализации статических переменных. Зачем вызывать каждый раз инициализацию статических переменных в конструкторе, если можно сделать это единожды, таким образом не тратить ресурсы на повторные инициализации?

Отслеживать
ответ дан 6 июл 2015 в 8:06
zzashpaupat zzashpaupat
1,429 8 8 серебряных знаков 13 13 бронзовых знаков

Мне кажется у вас небольшое недопонимание разницы между static и instance полями класса.

Поля с модификатором static могут быть использованы даже если не было создано не одного экземпляра класса (ни одного объекта) — и они являются общими для всех экземпляров класса.

static методы соответственно могут взаимодействовать только со static полями.

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

Кроме static блока инициализации если еще не статик блок инициализации — он выполняется до конструктора, например:

public class Test < static < System.out.println(«Static»); > < System.out.println(«Non-static block»); >public Test() < System.out.println(«Constructor»); >>

Источник: ru.stackoverflow.com

10 заметок о модификаторе Static в Java

10 заметок о модификаторе Static в Java - 1

Модификатор static в Java напрямую связан с классом. Если поле статично, значит оно принадлежит классу, если метод статичный — аналогично: он принадлежит классу. Исходя из этого, можно обращаться к статическому методу или полю, используя имя класса. Например, если поле count статично в классе Counter, значит, вы можете обратиться к переменной запросом вида: Counter.count.

Прежде чем приступить к заметкам, давайте вспомним (а может быть, узнаем), что такое static и что может быть статическим в Java. Static — модификатор, применяемый к полю, блоку, методу или внутреннему классу. Данный модификатор указывает на привязку субъекта к текущему классу.

Статические поля

10 заметок о модификаторе Static в Java - 2

При обозначении переменной уровня класса мы указываем на то, что это значение относится к классу. Если этого не делать, то значение переменной будет привязываться к объекту, созданному по этому классу. Что это значит? А то, что если переменная не статическая, то у каждого нового объекта данного класса будет своё значение этой переменной, меняя которое мы меняем его исключительно в одном объекте: Например, у нас есть класс Car с нестатической переменной:

public class Car
Тогда в main:
Car orangeCar = new Car(); orangeCar.km = 100; Car blueCar = new Car(); blueCar.km = 85; System.out.println(«Orange car — » + orangeCar.km); System.out.println(«Blue car — » + blueCar.km);
Вывод мы получим:
Orange car — 100 Blue car — 85

Как видим, у каждого объекта своя переменная, изменение которой происходит только для этого объекта. Ну а если у нас переменная статическая, то это глобальное значение — одно для всех: Теперь мы имеем Car со статической переменной:

public class Car
Тогда тот же код в main будет выдавать в консоль:
Orange car — 85 Blue car — 85

Ведь переменная у нас одна на всех, и каждый раз мы меняем именно ее. К статическим переменным, как правило обращаются не по ссылке на объект — orangeCar.km, а по имени класса — Car.km

Статический блок

Есть два блока инициализации — обычный и статический. Блок предназначен для инициализации внутренних переменных. Если блок обычный, то им инициализируют внутренние переменные объекта, если же статический, соответственно, им задают статические переменные (то есть переменные класса). Пример класса со статическим блоком инициализации:

Читайте также:
Рутрекер что это за программа

public class Car < static int km; static < km = 150; >>

Статический метод

Статические методы отличаются от обычных тем, что они также привязаны к классу, а не к объекту. Важным свойством статического метода является то, что он может обратиться только к статическим переменным/методам. В качестве примера давайте рассмотрим класс, который у нас будет неким счётчиком, ведущим учет вызовов метода:

public class Counter < static int count; public static void invokeCounter() < count++; System.out.println(«Текущее значение счётчика — » + count); >>
Вызовем его в main:
Counter.invokeCounter(); Counter.invokeCounter(); Counter.invokeCounter();
И получим вывод в консоль:
Текущее значение счётчика — 1 Текущее значение счётчика — 2 Текущее значение счётчика — 3

Статический класс в Java

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

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

public class Vehicle < public static class Car < public int km; >>
Создание экземпляра данного класса и задание значения внутренней переменной:
Vehicle.Car car = new Vehicle.Car(); car.km = 90;

10 заметок о модификаторе Static в Java - 3

Для использования статических методов/переменных/класса нам не нужно создавать объект данного класса. Конечно, следует учитывать модификаторы доступа. Например, поля private доступны только внутри класса, в котором они объявлены. Поля protected доступны всем классам внутри пакета (package), а также всем классам-наследникам вне пакета.

Для более подробной информации ознакомьтесь со статьей “private vs protected vs public”. Предположим, существует статический метод increment() в классе Counter , задачей которого является инкрементирование счётчика count . Для вызова данного метода можно использовать обращение вида Counter.increment() . Нет необходимости создавать экземпляр класса Counter для доступа к статическому полю или методу. Это фундаментальное отличие между статическими и НЕ статическими объектами (членами класса). Еще раз напомню, что статические члены класса напрямую принадлежат классу, а не его экземпляру. То есть, значение статической переменной count будет одинаковое для всех объектов типа Counter . Далее в этой статье мы рассмотрим основополагающие аспекты применения модификатора static в Java, а также некоторые особенности, которые помогут понять ключевые концепции программирования.

Что должен знать каждый программист о модификаторе Static в Java

  1. Вы НЕ можете получить доступ к НЕ статическим членам класса, внутри статического контекста, как вариант, метода или блока. Результатом компиляции приведенного ниже кода будет ошибка:

public class Counter< private int count; public static void main(String args[])< System.out.println(count); //compile time error >>
class Vehicle < public static void kmToMiles(int km)< System.out.println(«Внутри родительского класса/статического метода»); >> class Car extends Vehicle < public static void kmToMiles(int km)< System.out.println(«Внутри дочернего класса/статического метода «); >> public class Demo< public static void main(String args[])< Vehicle v = new Car(); v.kmToMiles(10); >>

Источник: javarush.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru