Статический означает «глобальный» или «статический» и используется для изменения переменных-членов и методов-членов. Он также может образовывать статический блок кода, но в языке Java нет понятия глобальных переменных.
Переменные-члены и методы-члены, измененные с помощью static, не зависят от каких-либо объектов класса. То есть он не зависит от конкретного экземпляра класса и является общим для всех экземпляров класса.
Пока этот класс загружен, виртуальная машина Java может найти их по умолчанию в области методов области данных времени выполнения на основе имени класса. Таким образом, к статическому объекту можно получить доступ до создания любого из его объектов без ссылки на какие-либо объекты.
Статические переменные-члены и методы-члены, модифицированные с помощью public, по сути являются глобальными переменными и глобальными методами. Когда объявляется объект его класса, копия статической переменной не создается, но все экземпляры класса используют одну и ту же статическую переменную.
Статической переменной может предшествовать частная модификация, что означает, что эту переменную можно использовать в статическом блоке кода класса или в других статических методах-членах класса (конечно, ее также можно использовать в нестатических методы-члены), но его нельзя использовать в других классах. Важно ссылаться непосредственно на имя класса. На самом деле вам нужно понимать, что приватный означает ограничение прав доступа, а статический означает, что его можно использовать без создания экземпляра, что гораздо проще понять. Эффект от добавления других ключевых слов разрешения доступа перед статическим также тот же.
Переменные-члены и методы-члены, измененные с помощью static, обычно называются статическими переменными и статическими методами. Доступ к ним можно получить напрямую через имя класса. Синтаксис доступа:
Имя класса. Имя статического метода (список параметров...).
Имя класса. Имя статической переменной.
Блок кода, модифицированный с помощью static, представляет собой блок статического кода. Когда виртуальная машина Java (JVM) загружает класс, блок кода выполняется (очень полезно, ха-ха).
1. статическая переменная
Переменные-члены класса можно разделить на два типа в зависимости от того, являются ли они статическими: одна — это переменная, измененная статической переменной или переменной класса; другая — переменная, не модифицированная статической переменной, называемая переменной экземпляра.
Разница между ними заключается в следующем:
Для статических переменных существует только одна копия в памяти (для экономии памяти). JVM выделяет память для статических переменных только один раз. Выделение памяти для статических переменных завершается в процессе загрузки класса. Доступ к ней можно получить напрямую. имя класса (удобно). Конечно, к нему можно получить доступ и через объекты Visit (но это не рекомендуется).
Для переменных экземпляра перед созданием экземпляра память будет выделена один раз для переменной экземпляра. Переменные экземпляра могут иметь несколько копий в памяти, не влияя друг на друга (гибкий).
Поэтому статические переменные обычно используются, когда необходимо реализовать следующие две функции:
1).При разделении значений между объектами
2).Когда доступ к переменным удобен
2. Статический метод
Статические методы можно вызывать напрямую через имя класса, а также можно вызывать любой экземпляр.
Таким образом, ключевые слова this и super не могут использоваться в статических методах, а к переменным экземпляра и методам экземпляра класса, к которому они принадлежат, нельзя получить прямой доступ (т. е. к переменным-членам и методам-членам без static. Только статические переменные-члены и). можно получить доступ к методам-членам класса, которому они принадлежат.
Потому что члены экземпляра связаны с конкретными объектами! Это нужно понять и разобраться, а не заучивать наизусть! ! !
Поскольку статические методы не зависят от какого-либо экземпляра, статические методы должны быть реализованы и не могут быть абстрактными.
Например, чтобы облегчить вызов метода, все методы класса Math в Java API являются статическими, а статические методы в общих классах также позволяют другим классам вызывать этот метод.
Статический метод — это особый тип метода внутри класса. Соответствующий метод объявляется статическим только при необходимости. Методы внутри класса обычно нестатические.
3. статический блок кода
Статический блок кода также называется статическим блоком кода. Это статический блок операторов в классе, который не зависит от членов класса. Их может быть несколько, и они могут быть размещены где угодно. Эти блоки статического кода отсутствуют. будет выполняться, когда JVM загружает класс. Если имеется несколько блоков статического кода, JVM выполнит их в том порядке, в котором они появляются в классе, и каждый блок кода будет выполнен только один раз. Например:
общественный класс Test5 {частный статический int a; частный int b; Test5.a = 3; Test5 t = новый Test5 (); tb = 1000; println(tb); } static { Test5.a=4; System.out.println(a); } public static void main(String[] args) { // TODO Автоматически генерировать заглушки методов} static { Test5.a=5; System.out.println(a } public void f() { System.out.println("hhahhahah" } };
Результаты запуска:
3
хахахаха
1000
4
5
Вы можете использовать статические блоки кода для присвоения значений некоторым статическим переменным. Наконец, взгляните на эти примеры. Все они имеют статический основной метод, поэтому JVM может вызывать его напрямую, не создавая экземпляр при запуске основного метода. .
4. Что означают static и Final при совместном использовании?
Статический финал используется для изменения переменных-членов и методов-членов, которые можно просто понимать как «глобальные константы»!
Для переменных это означает, что как только значение задано, его нельзя изменить, и к нему можно получить доступ через имя класса.
Для методов это означает, что они не могут быть переопределены и доступны непосредственно через имя класса.
Иногда вам нужно определить член класса так, чтобы его использование было полностью независимым от любых объектов этого класса. Обычно доступ к члену класса должен осуществляться через объект его класса, но можно создать член, который можно использовать сам по себе, не ссылаясь на конкретный экземпляр. Такой член можно создать, добавив ключевое слово static (статический) перед объявлением члена. Если член объявлен статическим, к нему можно получить доступ до создания любого объекта его класса без необходимости ссылаться на какой-либо объект. Вы можете объявить как методы, так и переменные как статические. Самый распространенный пример статического члена — main(). Поскольку функция main() должна вызываться при начале выполнения программы, она объявлена статической.
Переменные, объявленные как статические, по сути, являются глобальными переменными. При объявлении объекта копия статической переменной не создается, но все переменные экземпляра класса используют одну и ту же статическую переменную. Методы, объявленные статическими, имеют следующие ограничения:
1).Они могут вызывать только другие статические методы.
2).Они могут получить доступ только к статическим данным.
3).Они не могут никак ссылаться на this или super (ключевое слово super связано с наследованием и описано в следующей главе).
Если вам нужно инициализировать статические переменные посредством вычислений, вы можете объявить статический блок. Статический блок выполняется только один раз при загрузке класса. В следующем примере показан класс со статическим методом, некоторыми статическими переменными и статическим блоком инициализатора:
// Демонстрируем статические переменные, методы и блоки. class UseStatic { static int a = 3; static void meth(int x) { System.out.println("x = " + x); println("a = " + a); System.out.println("b = " + b); } static { System.out.println("Статический блок инициализирован."); } Public static void main(String args[]) {meth(42) };
После загрузки класса UseStatic выполняются все статические операторы. Сначала a присваивается значение 3, затем выполняется статический блок (печать сообщения) и, наконец, b инициализируется значением a*4 или 12. Затем вызывается main(), main() вызывает meth(), передавая значение 42 в x. Три оператора println() относятся к двум статическим переменным a и b и локальной переменной x.
Примечание. Ссылаться на какие-либо переменные экземпляра в статическом методе запрещено.
Вот вывод этой программы:
Скопируйте код кода следующим образом:
Статический блок инициализирован.
х = 42
а=3
б = 12
Статические методы и переменные можно использовать независимо от любого объекта вне класса, в котором они определены. Таким образом, вы просто добавляете оператор точки после имени класса. Например, если вы хотите вызвать статический метод вне класса, вы можете использовать следующий общий формат:
Скопируйте код кода следующим образом:
имя класса.метод()
Здесь имя класса — это имя класса, в котором определен статический метод. Как видите, этот формат аналогичен формату вызова нестатических методов через переменные ссылки на объект. Доступ к статической переменной можно получить в том же формате — имя класса, за которым следует оператор точки. Именно так Java реализует контролируемую версию глобальных функций и глобальных переменных.
Ниже приведен пример. В main() доступ к статическому методу callme() и статической переменной b осуществляется за пределами их классов.
класс StaticDemo { static int a = 42; static int b = 99; static void callme() { System.out.println("a = " + a } } class StaticByName { public static void main(String args[]) { StaticDemo.callme(); System.out.println("b = " + StaticDemo.b } });
Вот вывод этой программы:
Скопируйте код кода следующим образом:
а=42
б = 99
Статические члены не могут быть доступны экземплярам, созданным их классом.
Если члены без статической модификации являются членами объекта, они принадлежат каждому объекту.
Члены, модифицированные с помощью static, являются членами класса, что означает, что они могут вызываться непосредственно из класса и являются общими для всех объектов.