Перейти к содержимому

Как вызвать обычный метод класса внутри static метода

  • автор:

Как вызвать нестатический метод в статическом в Java?

Здравствуйте! Создал нестатический метод logger . Он считывает стэк ошибки , вызываемый при каком-либо Exception ‘е , и выводит в графический интерфейс. Так как этот метод нестатический , вызвать его из статического метода нельзя. Объявить его статичным нельзя, так как я использую методы setContentPane и setSize , которые также не статичны. Что посоветуете сделать?

Отслеживать
470 5 5 серебряных знаков 11 11 бронзовых знаков
задан 27 июл 2014 в 16:41
TheCoolKuid TheCoolKuid
75 1 1 золотой знак 1 1 серебряный знак 13 13 бронзовых знаков

2 ответа 2

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

В статическом методе создать класс и вызвать из созданного класса нестатический метод. Примерно так:

class ClassName < public ClassName()< >public static sMethod() < new ClassName().nsMethod(); >public nsMethod() < println('Не статический метод') >> 

Отслеживать
ответ дан 27 июл 2014 в 16:44
3,676 2 2 золотых знака 36 36 серебряных знаков 78 78 бронзовых знаков

Если создать экземпляр класса, можно пользоваться его нестатическими методами из статического метода:

 public class Main < public static void main(String[] args) < int[] numbers = ; // создаем экземпляр, чтоб вызывать нестатический метод Main main = new Main(); System.out.println(main.minFromArray(numbers)); > // наш нестатический метод: public Integer minFromArray(int[] numbers) < var min = Arrays.stream(numbers).min().getAsInt(); return min; >> 

Отслеживать
ответ дан 28 янв в 8:27
1 2 2 бронзовых знака

  • java
  • ооп
    Важное на Мете
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.10.27.43697

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

static

Для того, чтобы объявить статический метод класса, необходимо использовать ключевое слово static.

Синтаксис

static methodName()

Описание

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

Вызов статических методов

Вызов из другого статического метода

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

class StaticMethodCall  static staticMethod()  return "Вызван статический метод"; > static anotherStaticMethod()  return this.staticMethod() + " из другого статического метода"; > > StaticMethodCall.staticMethod(); // 'Вызван статический метод' StaticMethodCall.anotherStaticMethod(); // 'Вызван статический метод из другого статического метода' 

Вызов из конструктора класса и других методов

Статические методы недоступны напрямую, используя ключевое слово this из нестатических методов. Вам нужно вызвать их с помощью имени класса: CLASSNAME.STATIC_METHOD_NAME() или вызовом метода как свойства конструктора: this.constructor.STATIC_METHOD_NAME() .

class StaticMethodCall  constructor()  console.log(StaticMethodCall.staticMethod()); // 'вызван статический метод.' console.log(this.constructor.staticMethod()); // 'вызван статический метод.' > static staticMethod()  return "вызван статический метод."; > > 

Примеры

Следующий пример демонстрирует:

  1. Как статический метод реализуется в классе.
  2. Как переопределить статический метод при наследовании.
  3. Как можно и как нельзя вызывать статические методы.
class Triple  static triple(n)  if (n === undefined)  n = 1; > return n * 3; > > class BiggerTriple extends Triple  static triple(n)  return super.triple(n) * super.triple(n); > > console.log(Triple.triple()); // 3 console.log(Triple.triple(6)); // 18 var tp = new Triple(); console.log(BiggerTriple.triple(3)); // 81 (не затрагивается экземпляром родителя) console.log(tp.triple()); // Выведет сообщение, что "tripple" не является // функцией ('tp.tripple is not a function'). 

Спецификации

Specification
ECMAScript Language Specification
# sec-class-definitions

Поддержка в браузерах

BCD tables only load in the browser

Смотрите также

  • class expression
  • class declaration
  • Classes

Found a content problem with this page?

  • Edit the page on GitHub.
  • Report the content issue.
  • View the source on GitHub.

This page was last modified on 7 авг. 2023 г. by MDN contributors.

Your blueprint for a better internet.

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

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

В объявление класса они добавляются с помощью ключевого слова static , например:

class User < static staticMethod() < alert(this === User); >> User.staticMethod(); // true

Это фактически то же самое, что присвоить метод напрямую как свойство функции:

class User < >User.staticMethod = function() < alert(this === User); >;

Значением this при вызове User.staticMethod() является сам конструктор класса User (правило «объект до точки»).

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

Звучит не очень понятно? Сейчас все встанет на свои места.

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

Естественное решение – сделать для этого статический метод Article.compare :

class Article < constructor(title, date) < this.title = title; this.date = date; >static compare(articleA, articleB) < return articleA.date - articleB.date; >> // использование let articles = [ new Article("HTML", new Date(2019, 1, 1)), new Article("CSS", new Date(2019, 0, 1)), new Article("JavaScript", new Date(2019, 11, 1)) ]; articles.sort(Article.compare); alert( articles[0].title ); // CSS

Здесь метод Article.compare стоит «над» статьями, как средство для их сравнения. Это метод не отдельной статьи, а всего класса.

Другим примером может быть так называемый «фабричный» метод.

Скажем, нам нужно несколько способов создания статьи:

  1. Создание через заданные параметры ( title , date и т. д.).
  2. Создание пустой статьи с сегодняшней датой.
  3. …или как-то ещё.

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

Такой как Article.createTodays() в следующем примере:

class Article < constructor(title, date) < this.title = title; this.date = date; >static createTodays() < // помним, что this = Article return new this("Сегодняшний дайджест", new Date()); >> let article = Article.createTodays(); alert( article.title ); // Сегодняшний дайджест

Теперь каждый раз, когда нам нужно создать сегодняшний дайджест, нужно вызывать Article.createTodays() . Ещё раз, это не метод одной статьи, а метод всего класса.

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

// предположим, что Article - это специальный класс для управления статьями // статический метод для удаления статьи по id: Article.remove();

Статические методы недоступны для отдельных объектов

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

Например. такой код не будет работать:

// . article.createTodays(); /// Error: article.createTodays is not a function

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

Новая возможность
Эта возможность была добавлена в язык недавно. Примеры работают в последнем Chrome.

Статические свойства также возможны, они выглядят как свойства класса, но с static в начале:

class Article < static publisher = "Илья Кантор"; >alert( Article.publisher ); // Илья Кантор

Это то же самое, что и прямое присваивание Article :

Article.publisher = "Илья Кантор";

Наследование статических свойств и методов

Статические свойства и методы наследуются.

Например, метод Animal.compare в коде ниже наследуется и доступен как Rabbit.compare :

class Animal < constructor(name, speed) < this.speed = speed; this.name = name; >run(speed = 0) < this.speed += speed; alert(`$бежит со скоростью $.`); > static compare(animalA, animalB) < return animalA.speed - animalB.speed; >> // Наследует от Animal class Rabbit extends Animal < hide() < alert(`$прячется!`); > > let rabbits = [ new Rabbit("Белый кролик", 10), new Rabbit("Чёрный кролик", 5) ]; rabbits.sort(Rabbit.compare); rabbits[0].run(); // Чёрный кролик бежит со скоростью 5.

Мы можем вызвать Rabbit.compare , при этом будет вызван унаследованный Animal.compare .

Как это работает? Снова с использованием прототипов. Как вы уже могли предположить, extends даёт Rabbit ссылку [[Prototype]] на Animal .

Так что Rabbit extends Animal создаёт две ссылки на прототип:

  1. Функция Rabbit прототипно наследует от функции Animal .
  2. Rabbit.prototype прототипно наследует от Animal.prototype .

В результате наследование работает как для обычных, так и для статических методов.

Давайте это проверим кодом:

class Animal <> class Rabbit extends Animal <> // для статики alert(Rabbit.__proto__ === Animal); // true // для обычных методов alert(Rabbit.prototype.__proto__ === Animal.prototype); // true

Итого

Статические методы используются для функциональности, принадлежат классу «в целом», а не относятся к конкретному объекту класса.

Например, метод для сравнения двух статей Article.compare(article1, article2) или фабричный метод Article.createTodays() .

В объявлении класса они помечаются ключевым словом static .

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

class MyClass < static property = . ; static method() < . >>

Технически, статическое объявление – это то же самое, что и присвоение классу:

MyClass.property = . MyClass.method = . 

Статические свойства и методы наследуются.

Для class B extends A прототип класса B указывает на A : B.[[Prototype]] = A . Таким образом, если поле не найдено в B , поиск продолжается в A .

Задачи

Класс расширяет объект?

важность: 3

Как мы уже знаем, все объекты наследуют от Object.prototype и имеют доступ к «общим» методам объекта, например hasOwnProperty .

class Rabbit < constructor(name) < this.name = name; >> let rabbit = new Rabbit("Rab"); // метод hasOwnProperty от Object.prototype alert( rabbit.hasOwnProperty('name') ); // true

Но что если мы явно напишем «class Rabbit extends Object» – тогда результат будет отличаться от обычного «class Rabbit» ?

Ниже пример кода с таким наследованием (почему он не работает? исправьте его):

class Rabbit extends Object < constructor(name) < this.name = name; >> let rabbit = new Rabbit("Кроль"); alert( rabbit.hasOwnProperty('name') ); // Ошибка

Сперва давайте разберёмся, почему код не работает.

Причина становится очевидна, если мы попытаемся запустить его. Унаследованный конструктор класса должен вызывать super() . В противном случае «this» будет не определён.

class Rabbit extends Object < constructor(name) < super(); // надо вызвать конструктор родителя, когда наследуемся this.name = name; >> let rabbit = new Rabbit("Кроль"); alert( rabbit.hasOwnProperty('name') ); // true

Но это ещё не все.

Даже после исправления есть важное различие между «class Rabbit extends Object» и class Rabbit .

Как мы знаем, синтаксис «extends» устанавливает 2 прототипа:

  1. Между «prototype» функций-конструкторов (для методов)
  2. Между самими функциями-конструкторами (для статических методов).

В случае с class Rabbit extends Object это значит:

class Rabbit extends Object <> alert( Rabbit.prototype.__proto__ === Object.prototype ); // (1) true alert( Rabbit.__proto__ === Object ); // (2) true

Таким образом, Rabbit предоставляет доступ к статическим методам Object через Rabbit , например:

class Rabbit extends Object <> // обычно мы вызываем Object.getOwnPropertyNames alert( Rabbit.getOwnPropertyNames() ); // a,b

Но если явно не наследуем от объекта, то для Rabbit.__proto__ не установлено значение Object .

class Rabbit <> alert( Rabbit.prototype.__proto__ === Object.prototype ); // (1) true alert( Rabbit.__proto__ === Object ); // (2) false (!) alert( Rabbit.__proto__ === Function.prototype ); // как у каждой функции по умолчанию // ошибка - нет такой функции у Rabbit alert( Rabbit.getOwnPropertyNames() ); // Ошибка

Таким образом, в этом случае у Rabbit нет доступа к статическим методам Object .

Кстати, у Function.prototype также есть «общие» методы, такие как call , bind и т. д. Они в конечном итоге доступны в обоих случаях, потому что для встроенного конструктора Object Object.__proto__ === Function.prototype .

Пример на картинке:

Короче говоря, есть два отличия:

class Rabbit class Rabbit extends Object
необходимо вызвать super() в конструкторе
Rabbit.__proto__ === Function.prototype Rabbit.__proto__ === Object

Ключевое слово static в Java

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

Далее предстоит изучить статические и нестатические методы в Джаве. Эта информация пригодится как новичкам, так и более опытным специалистам. Предстоит изучить модификатор static, его применение к методам, классам, переменным и блокам инициализации.

Анатомия static

В Java есть нестатические переменные и статические. Первые относятся к конкретному объекту в пределах программного когда. Они привязываются к экземплярам класса. Статические связаны со статическими объектами класса.

То же самое происходит с методами. Они в Java могут быть статическими и «обычными». Статический метод класса привязан только к статическому объекту класса. Обращаться он способен исключительно к статическим переменным и/или иным methods класса соответствующего типа.

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

Можно вызвать статичный метод путем создания статического объекта класса, который всегда существует после загрузки класса непосредственно в память устройства. Из-за этого main() является статическим. Он привязан к статичному экземпляру класса, а для его вызова никаких дополнительных объектов не требуется.

Форма записи и пример

Статические методы классов имеют элементарную форму записи:

Статические поля, переменные и другие компоненты кода всегда задаются за счет ключевого слова static.

Ниже представлен наглядный пример – статический блок программного кода:

public class Solution

public static void main(String args[])

public static void test()

int a = 2/0;

В данном случае метод main() будет вызван Java-машиной при помощи команды solution.main(). Статический метод test() вызывается в статическом main(). Других вариантов предложенный код не предусматривает.

Вызовы

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

Вот наглядные примеры статических методов класса:

Исходный код Static methods
Int b = math.max(a, b) Int max (int a, int b)
Thread.sleep(300) Void sleep(long ms)
Path path = path.of(«c:readme.txt») Path of(string str)

Все это поможет понять особенности, которые обладают нестатические и статические компоненты в Java.

Сравнение с обычными методами

Далее статические методы будут сравниваться с обычными. Эта информация пригодится каждому разработчику на Джаве.

Обычный method связан с объектом – экземпляром класса. Статические методы соответствующей связи не имеют. Обычные компоненты кода способны обращаться в переменным в своем экземпляре класса, а статические – нет. Связано это с тем, что у них просто отсутствуют связанные объекты.

Параметр Обычные методы Статические методы классов
Связи для создания экземпляра +
Может вызывать обычные methods класса +
Может ли вызывать статические methods + +
Обращение к обычным переменным класса +
Обращение к статическим переменным класса + +
Возможность вызова у объекта + +
Возможность вызова у class +

Статический метод – это компонент, который обладает серьезными и многочисленными ограничениями. Его значение все равно остается важным для разработчиков. Связано это с преимуществами изучаемого элемента разработки. Далее все «плюсы» использования static-компонентов будут рассмотрены более подробно.

К ключевым преимуществам static-элементов в Java относят:

  1. Простое обращение к методам и переменным. Для него не потребуется передавать ссылки на объекты.
  2. Иногда в рамках проекта требуется, чтобы переменная была реализована один раз. Единственный ее экземпляр обеспечивается за счет static-компонентов.
  3. Возможность вызова method еще до того, как разработчик получает право на создание тех или иных объектов. Пример – main(). В нем начинается работа приложения: JVM обращается к соответствующему методу до создания экземпляра класса.

Остальные особенности статических методов класса будут изучены более подробно далее. Они рассматривается в сравнении с обычными methods.

Связь с экземпляром класса

При вызове обычного method в него будет передаваться скрытый параметр. В качестве него выступает объект, у которого вызвали «алгоритм». Соответствующий параметр именован как this. Он является скрытым и является ссылкой на вызываемый экземпляр класса. Выступает одним из ключевых отличий рассматриваемых элементов разработки на Java.

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

Разница в вызовах

За счет скрытого параметра this обычные «функции» вызываются при помощи ссылок на объекты классов. Ниже – наглядный пример:

Все это приводит к тому, что обычная «процедура» не может быть вызвана из статического.

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

Обращения к обычным переменным класса

Из обычной «процедуры» можно обратиться к обычным переменным класса. Это связано с тем, что при реализации операции происходит обращение к переменным экземпляра класса. Его легко извлечь, используя всего один параметр – this.

В случае со статическими «процедурами» ситуация складывается иначе: система не знает, из какого экземпляра класса ему брать значения обычных переменных. Это влечет за собой простой принцип – обратиться к обычным переменным класса из статических «функций» нельзя.

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

Обращение к статическим переменным класса

Обращения к статическим членам класса осуществляются по тем же принципам, что и в случае с методами. Операция возможна, причем из любого места исходного кода. Это значит, что Java допускает обращения из статических и обычных «процедур».

Вызов у объектов

Обычные и статические методы класса разрешается вызывать у объектов. Первый вариант доступен из-за того, что это – единственный возможный способ «взаимодействия». Статическая «процедура» у объекта тоже может быть вызвана. В данном ситуации тип переменной определяется автоматически.

Исходный код приложения Как код рассматривается компилятором
Thread th = Thread.current();th.sleep(50000); Thread th = Thread.current();Thread.sleep(50000);
Integer i = 1;int x = i.parseInt(«12»); Integer i = 1;int x = Integer.parseInt(«12»);
«».valueOf(12); String.valueOf(12);

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

Возможность вызова у класса

Последняя особенность, на которую необходимо обратить внимание – это вызов у class. Для реализации соответствующей операции можно использовать только статические методы Java. Обычные процедуры вызов у classes не поддерживают.

Данный принцип указывает на то, что при работе с обычными «процедурами» не допускается использование формы:

Использование в интерфейсах

С появлением Java 8 разработчики получили возможность работать со static methods в интерфейсах. Их поведение напоминает принципы работы методов по умолчанию (default methods). Отличия есть – упомянутый изначально компонент не может быть предопределен методами в реализующих интерфейс классах.

Все это позволяет избежать возникновения ошибок при отладке и запуске исходного кода. Выше – наглядный пример реализации static method в интерфейсе.

Ключевые моменты

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

  1. Вызов во время компиляции. Они никогда не могут быть переопределены. Соответствующее правило работает и для static methods интерфейсов.
  2. Статическими не могут быть abstract methods.
  3. Рассматриваемые «процедуры» не умеют ни при каких обстоятельствах взаимодействовать с this и super.
  4. Не могут напрямую обращаться к переменным экземпляра, а также его методам. Для этого обязательно требуется ссылка на объект, которая у рассматриваемых «процедур» отсутствует.
  5. Поля и static methods – это не потокобезопасные компоненты. Используемые переменные нуждаются в дополнительной защите от одновременного обращения к ней нескольких потоков. Для этого static final (static-переменная) должна быть синхронизированной.
  6. Связь происходит во время компиляции. Обычные «процедуры» связываются друг с другом непосредственно во время исполнения.

Теперь понятно, что собой представляет статический метод в упомянутом языке. Лучше разобраться в особенностях применения соответствующего элемента программного кода помогут специализированные компьютерные курсы. На них в срок от пары месяцев до года пользователя научат с «нуля» программировать не только на Java, но и на других языках разработки. Клиенты могут выбрать курс с учетом уже имеющегося багажа знаний и сочетать их по собственному усмотрению.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *