Читатель Б в предыдущем постеЯ хожуВ сообщении из этой серии говорилось: «Я вслепую догадался, что следующим заголовком будет:« Я иду, ты даже не знаешь статического ключевого слова »». Я могу только сказать, что B угадал наполовину. Как читатели могли догадаться о таком талантливом блогере, как я? Он должен сделать что-то другое, поэтому вы можете видеть заголовок этой статьи.
Семь лет назад я вернулся из Сучжоу, где много красивых женщин, в Лоян, где тоже много красивых женщин. много резюме и "собеседовались" со многими интервьюерами., но только два или три меня удовлетворили. Один из них, Лао Ма, до сих пор жив в моей адресной книге WeChat. Он бросил вопрос интервью и ошеломил меня: "Брат, расскажи о ключевом слове static в Java."
Мне тогда было двадцать три года, а я был в юности. Думал, что смогу правильно ответить на все вопросы интервью, но не ожидал, что буду "сложным" - оказывается, есть технические эксперты в интернет-пустыне Лоян. Оглядываясь назад, на его лице бессознательно появился румянец стыда: главным образом потому, что он был слишком наивен в то время.
В любом случае, после многих лет напряженной работы моя текущая техническая база очень прочная, и у меня есть возможность написать статью для анализа статического ключевого слова в Java - пока я могу дать ссылку новичкам, я очень доволен .
Давайте сначала дадим схему (увы, блоггер в области идиом онлайн):
Ключевое слово static можно использовать в переменных, методах, блоках кода и внутренних классах, чтобы указать, что конкретный член принадлежит только самому классу, а не объекту этого класса.
01. Статические переменные
Статическая переменная, также называемая переменной класса, принадлежит классу, а не объекту этого класса.
public class Writer {
private String name;
private int age;
public static int countOfWriters;
public Writer(String name, int age) {
this.name = name;
this.age = age;
countOfWriters++;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Среди них countOfWriters называется статической переменной, которая отличается от имени и возраста двух переменных-членов, поскольку перед ней стоит модификатор.static
.
Это означает, что независимо от того, сколько раз этот класс инициализировался, значение статической переменной будет общим для объектов всех классов.
Writer w1 = new Writer("沉默王二",18);
Writer w2 = new Writer("沉默王三",16);
System.out.println(Writer.countOfWriters);
В соответствии с приведенной выше логикой вы должны сделать вывод, что в настоящее время значение countOfWriters должно быть равно 2, а не 1. С точки зрения памяти статические переменные будут храниться в специальном пуле под названием «Metaspace» (метапространство, начиная с Java 8) в виртуальной машине Java.
Существует большая разница между статическими переменными и переменными-членами.Значение переменных-членов принадлежит определенному объекту, и значение не распределяется между разными объектами, а статические переменные - нет, его можно использовать для подсчета количества объектов, потому что он общий. Как и в случае с countOfWriters в приведенном выше примере, при создании одного объекта его значение равно 1, а при создании двух объектов его значение равно 2.
Краткое изложение:
1) Поскольку статические переменные принадлежат классу, к ним не следует обращаться через ссылки на объекты, а следует обращаться непосредственно через имя класса;
2) Статические переменные доступны без инициализации класса.
public class WriterDemo {
public static void main(String[] args) {
System.out.println(Writer.countOfWriters); // 输出 0
}
}
02. Статический метод
Статические методы также называются методами класса.Как и статические переменные, они принадлежат классу, а не объекту этого класса.
public static void setCountOfWriters(int countOfWriters) {
Writer.countOfWriters = countOfWriters;
}
setCountOfWriters()
это статический метод, который модифицируется ключевым словом static.
Если вы использовали класс java.lang.Math или некоторые классы инструментов Apache (такие как StringUtils), вы не будете незнакомы со статическими методами.
Почти все методы класса Math являются статическими и могут вызываться непосредственно по имени класса без создания объекта класса.
Краткое изложение:
1) Статические методы в Java разрешаются во время компиляции, потому что статические методы не могут быть переопределены (переопределение метода происходит на этапе выполнения для полиморфизма).
2) Абстрактные методы не могут быть статическими.
3) Статические методы не могут использовать ключевые слова this и super.
4) Методы-члены могут напрямую обращаться к другим методам-членам и переменным-членам.
5) Методы-члены также могут напрямую обращаться к статическим методам и статическим переменным.
6) Статический метод может получить доступ ко всем другим статическим методам и статическим переменным.
7) Статические методы не могут напрямую обращаться к методам-членам и переменным-членам.
03. Статические блоки кода
Блоки статического кода можно использовать для инициализации статических переменных, хотя статические методы также можно инициализировать непосредственно во время объявления, но иногда для завершения инициализации нам требуется несколько строк кода.
public class StaticBlockDemo {
public static List<String> writes = new ArrayList<>();
static {
writes.add("沉默王二");
writes.add("沉默王三");
writes.add("沉默王四");
System.out.println("第一块");
}
static {
writes.add("沉默王五");
writes.add("沉默王六");
System.out.println("第二块");
}
}
writes является статическим ArrayList, поэтому вряд ли он будет инициализирован во время объявления, поэтому инициализацию необходимо выполнять в статическом блоке кода.
Краткое изложение:
1) Класс может иметь несколько статических блоков кода.
2) Порядок синтаксического анализа и выполнения блока статического кода соответствует его положению в классе. Для проверки этого вывода можно добавить в класс StaticBlockDemo пустой метод main, результат выполнения которого будет следующим:
第一块
第二块
04. Статический внутренний класс
Java позволяет нам объявить внутренний класс внутри класса, что обеспечивает убедительный способ использования некоторых переменных только в одном месте, что делает код более организованным и читабельным.
Существует четыре общих внутренних класса, внутренний класс-член, локальный внутренний класс, анонимный внутренний класс и статический внутренний класс.Из-за нехватки места первые три не входят в рамки нашего обсуждения в этой статье, и мы обсудим их подробно. позже.
public class Singleton {
private Singleton() {}
private static class SingletonHolder {
public static final Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
}
Знакомы ли вы с приведенным выше кодом? Да, это способ создания синглтона. Экземпляр не инициализируется при первой загрузке класса Singleton, только первый вызовgetInstance()
Виртуальная машина Java начинает загружать SingletonHolder и инициализировать экземпляр при использовании метода, что не только обеспечивает безопасность потоков, но и гарантирует уникальность класса Singleton. Однако более элегантным способом создания синглтона является использование перечисления.
Краткое изложение:
1) Статический внутренний класс не может получить доступ ко всем переменным-членам внешнего класса.
2) Статический внутренний класс может получить доступ ко всем статическим переменным внешнего класса, включая частные статические переменные.
3) Внешние классы нельзя объявлять статическими.
Ты учил? Учиться значит зарабатывать.
Я Silent King Er, интересный программист. Если вы считаете, что статья полезна для вас, пожалуйста, выполните поиск по запросу "Тихий король 2"Прочтите это в первый раз, ответьте [666] Есть также обучающие видео высокой четкости 500G (по категориям), которые я тщательно подготовил для вас.
эта статьяGitHubОн был включен, и есть полные тестовые площадки для интервью на крупных заводах Добро пожаловать в Star.
Оригинальность непроста, не просите пустой билет, пожалуйста, поставьте лайк этой статье, что будет моей сильнейшей мотивацией писать больше качественных статей.