Статические методы в java(static methods)

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

Язык программирования Java позволяет нам создавать класс внутри класса. Это обеспечивает убедительный способ группировки элементов, которые будут использоваться только в одном месте, это помогает сохранить наш код более организованным и читаемым.

Архитектура вложенного класса разделена на две части:

  • вложенные классы, объявленные статическими , называются статическими вложенными классами , тогда как,
  • вложенные классы, которые не являются статическими , называются внутренними классами

Основное различие между этими двумя классами заключается в том, что внутренние классы имеют доступ ко всем членам заключающего класса (включая private), в то время как статические вложенные классы имеют доступ только к статическим членам внешнего класса.

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

6.1. Пример статического класса

Наиболее широко используемый подход к созданию одноэлементных объектов-это статический вложенный класс, он не требует никакой синхронизации и прост в освоении и реализации:

public class Singleton  {    
    private Singleton() {}
    
    private static class SingletonHolder {    
        public static final Singleton instance = new Singleton();
    }    

    public static Singleton getInstance() {    
        return SingletonHolder.instance;    
    }    
}

6.2. Веские причины для использования статического внутреннего класса

  • Группировка классов, которые будут использоваться только в одном месте, увеличивает инкапсуляцию
  • Код приближается к месту, которое будет только одним для его использования; это повышает читабельность и делает код более удобным для обслуживания
  • Если вложенный класс не требует какого-либо доступа к его заключающим членам экземпляра класса, то лучше объявить его как static , потому что таким образом он не будет связан с внешним классом и, следовательно, будет более оптимальным, поскольку им не потребуется память кучи или стека

6.3. Ключевые моменты, которые следует запомнить

  • статические вложенные классы не имеют доступа ни к каким членам экземпляра заключающего внешнего класса ; он может получить доступ к ним только через ссылку на объект
  • статические вложенные классы могут обращаться ко всем статическим членам заключающего класса, включая частные
  • Спецификация программирования Java не позволяет нам объявлять класс верхнего уровня как static ; только классы внутри классов (вложенные классы) могут быть сделаны как static

Доступ к статическим методам

При вызове статического метода используется имя класса и оператор разрешения области видимости , вместо операции доступа , так как статический метод относится ко всему классу, а не к конкретному объекту этого класса:

Пример

Попробуй сам

Результат выполнения кода:

blue

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

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

Пример

Попробуй сам

Результат выполнения кода:

blue

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

Пример

Попробуй сам

Результат выполнения кода:

Привет мир!

Чтобы получить доступ к статическому методу из дочернего класса, используйте ключевое слово внутри дочернего класса:

Пример

Попробуй сам

Результат выполнения кода:

wm-school.ru

Примечание: Статический метод, к которому нужно получить доступ из дочернего класса должен иметь модификатор видимости или .

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

  • Применяется для инициализации статического члена;
  • Выполняется перед методом main во время загрузки класса.

Пример статического блока

class A2{  
  static{System.out.println("static block is invoked");}  
  public static void main(String args[]){  
   System.out.println("Hello main");  
  }  
}

Проверить сейчас

Вывод: static block is invoked
       Hello main

Вопрос: можно ли выполнить программу без метода main()?

Ответ: да, один из способов — применение модификатора static в Java, но в предыдущей версии JDK, а не в JDK 1.7.

class A3{  
  static{  
  System.out.println("static block is invoked");  
  System.exit(0);  
  }  
}

Проверить сейчас

Вывод: static block is invoked (если не JDK7)

В JDK7 и выше вывод будет следующим:

Output:Error: Main method not found in class A3, please define the main method as (метод main не найден в классе А3, определите метод main как):

public static void main(String[] args)

Пожалуйста, опубликуйте свои мнения по текущей теме материала. За комментарии, дизлайки, подписки, лайки, отклики низкий вам поклон!

СМСергей Марочканичавтор статьи «Java static keyword»

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

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

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

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

Несмотря на то, что поле не может быть объявлено как , поле const по своему поведению является статическим. Он относится к типу, а не к экземплярам типа. Поэтому к полям можно обращаться с использованием той же нотации , что и для статических полей. Экземпляр объекта не требуется.

C# не поддерживает статические локальные переменные (то есть переменные, объявленные в области действия метода).

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

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

Если класс содержит статические поля, должен быть указан статический конструктор, который инициализирует эти поля при загрузке класса.

Вызов статического метода генерирует инструкцию вызова в промежуточном языке Microsoft (MSIL), в то время как вызов метода экземпляра генерирует инструкцию , которая также проверяет наличие ссылок на пустые объекты. Однако в большинстве случаев разница в производительности двух видов вызовов несущественна.

6 ответов

289

Лучший ответ

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

ИЛИ ЖЕ

Более подробную информацию об этой ошибке можно найти в MSDN.

31 янв. 2009, в 06:44
Поделиться

14

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

31 янв. 2009, в 10:30
Поделиться

7

В этом случае, когда вы хотите получить элемент управления формы и получаете эту ошибку, у меня есть небольшой обход для вас.

Перейдите в свою Program.cs и измените

к

Теперь вы можете получить доступ к элементу управления с помощью

Также: не забудьте установить свой уровень доступа на уровне управления.

И да, я знаю, этот ответ не подходит для вызывающего вопроса, но он подходит для гуглеров, у которых есть эта проблема с элементами управления.

07 янв. 2017, в 20:48
Поделиться

3

Ваш метод должен быть статическим

01 июль 2014, в 14:25
Поделиться

Приобретите @COOLGAMETUBE за то, что он меня опрокинул на то, что закончилось для меня. Его идея была хорошей, но у меня возникла проблема при вызове Application.SetCompatibleTextRenderingDefault после того, как форма уже была создана. Поэтому с небольшими изменениями это работает на меня:

27 июль 2018, в 03:43
Поделиться

Из моего поиска вы даете пустое значение в текстовое поле и возвращаете его в , так как это статический метод. Вы можете заменить его на , который может включить нулевое значение.

12 янв. 2013, в 12:30
Поделиться

Ещё вопросы

  • 1Откройте страницу options.html расширения в новой вкладке, нажав на значок расширения.
  • 2Использование System.ComponentModel в библиотеке базовых классов .NET
  • 1Android Market — Продажа платных обновлений (не обновлений)
  • MySQL Load Data Infile (CSV): заменить / удалить вертикальные вкладки
  • Нужны ли заголовки для элементов Html5 Aside & Nav?
  • Проблема с получением элементов массива json_encode в отдельные переменные jQuery
  • 1Объявление типа массива Java
  • Не могу изменить свойства объекта окна, используя JavaScript
  • простой jQuery toggle () не работает
  • Наведите указатель мыши на элемент div, измените цвет элемента <a> внутри этого элемента div.
  • 1Отладка файла libcore String.java в Android с помощью Eclipse
  • 1Индивидуальные ресурсы для подстановочных субдоменов
  • 1Создание 2D бинарной матрицы в JAVA
  • 1Jest onSpy — ожидаемая фиктивная функция была вызвана
  • почему можно получить адрес функции-члена по типу класса
  • Как сделать кросс-компиляцию файлов Flash SWF в файл (ы) Keil Compilable C / C ++
  • Ошибка в конфигурации ресурса при использовании функции $ resource.query () с AngularJS / Rails
  • 2Обновить свойство в главном окне, даже если новое окно открыто в WPF
  • Обновляйте файл JPlayer MP3 каждый раз, когда вызывается функция
  • 2Как создать общую процедуру для временных методов?
  • Подключение андроид приложения к MySQL через SQL server express
  • Добавление $ http запроса кирпичиков Ionic приложение
  • одна кнопка два, если заявления для CSS CSS в JavaScript
  • 1Как мне инициализировать Uint8Array?
  • 1Проблема в настройке широты и долготы в андроиде
  • 2Предотвращение TIME_WAIT с помощью .NET ‘Async’ API
  • 2Как показать прогресс в TextBlock и ProgressBar?
  • 1Публикация в Facebook определенного списка друзей с помощью Android SDK Facebook
  • Оптимизируется ли эта группа транспонирования MySQL по запросу?
  • 1в то время как цикл foreach выводит дважды
  • Вставить несколько строк, используя один оператор против пакетной вставки в MySQL
  • 2Плавно соединяющие центры круга
  • 1Как интегрировать ваше приложение в БЫСТРЫЙ КОНТАКТ на родное приложение контактов на Android?
  • 10mq: латентность pubsub постоянно растет с сообщениями?
  • JQuery работает несколько страниц, но не все
  • Обновление переменной в файле rhtml
  • Пользовательский ввод значения, хранящегося в массиве целых чисел C ++
  • 1Google Maps API на Android
  • jQuery ищет плагин для динамического перемещения таблиц и соответственно обновляет идентификаторы
  • jsoup разбор tr андроид
  • 1Точки быстро меняются
  • 1Javascript — получить указанное значение бита как int без использования Number (n) .toString (2)
  • Как читать только одну строку из JSON с AngularJS
  • 1Невозможно найти местоположение пользователя с помощью GPS
  • Как я могу получить выбранные значения в раскрывающемся списке множественного выбора
  • 1StartActivity и множественные экземпляры
  • 2WPF — Как динамически изменить языковые свойства окна
  • 1Ошибка обновления фильтра Java API Google Analytics
  • 1Как передать эту функцию в settimeout с параметрами?
  • Имеет ли функция .load () доступ к серверу в мобильных приложениях?

Метод экземпляра или статический метод в Java?

  • Метод экземпляра получит прямой доступ к методам экземпляра и переменным.
  • Метод экземпляра будет обращаться к статическим переменным и статическим методам напрямую.
  • Статические методы будут обращаться к статическим переменным и методам напрямую.
  • Статические методы не могут напрямую обращаться к методам экземпляра и переменным экземпляра. И статический метод не может использовать это, так как нет экземпляра для «this», на который можно сослаться.

Оцени статью

Оценить

Средняя оценка / 5. Количество голосов:

Видим, что вы не нашли ответ на свой вопрос.

Помогите улучшить статью.

Спасибо за ваши отзыв!

Что такое статические методы в Java?

Статические методы – это методы в Java, которые можно вызывать без создания объекта класса. Они задокументированы именем {class the category}. Статическое ключевое слово может использоваться с классом, переменной, методом и блоком. Статические члены принадлежат классу, а не конкретному экземпляру, это означает, что если вы сделаете член статическим, вы сможете получить к нему доступ без объекта. Давайте рассмотрим пример, чтобы понять это:

Здесь у нас есть статический метод myMethod(), мы можем вызвать этот метод без какого-либо объекта, потому что когда мы делаем член статическим, он становится уровнем класса. Если мы удалим ключевое слово static и сделаем его нестатичным, нам нужно будет создать объект класса для его вызова.

Статические члены являются общими для всех экземпляров (объектов) класса, но нестатические члены являются отдельными для каждого экземпляра класса.

class SimpleStaticExample
{
    // This is a static method
    static void myMethod()
    {
        System.out.println("myMethod");
    }
 
    public static void main(String[] args)
    {
          /* You can see that we are calling this
           * method without creating any object. 
           */
           myMethod();
    }
}

Синтаксис

public static void geek(String name)
{
// code to be executed....

Он хранится в Permanent Generation, поскольку связывается с {class the category}, где они находятся, а не с объектами этого класса. Тем не менее, их локальные переменные, а также передаваемый им аргумент(ы) находятся в стеке.

Важные моменты:

  • Статический метод(ы), связанный с классом, в котором они находятся, то есть они будут ссылаться на него, даже если он не создает экземпляр класса, т.е. ClassName.methodName (args).
  • Они предназначены для совместного использования всеми объектами, созданными из одного класса.
  • Статические методы не могут быть переопределены.

Пример использования статических методов в Java:

import java.io.*;
class Flair{
   public static String FlairName = "";
   public static void geek(String name)
{
         FlairName = name;
   }
}
class GFG {
   public static void main (String[] args) {
         Flair.flair("vaibhav");
         System.out.println(Flair.flairName);
         Flair obj = new Flair ();
         obj.flair("shadow");
         System.out.println(obj.flairName);
   }
}

Вывод:

Что если статическая переменная ссылается на объект?

В первой строке значение, которое будет храниться в разделе PermGen. Во второй строке ссылка obj будет храниться в секции PermGen, а объект, на который она ссылается, будет храниться в секции heap.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: