Android java static method

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

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

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

У статических методов есть ряд ограничений:

  • они могут вызывать только другие статические методы
  • они могут непосредственно осуществлять доступ только к статическим переменным
  • они не могут ссылаться на члены типа this или super

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

Например, нельзя писать такой код.

В статическом методе main() мы пытаемся задействовать нестатическую переменную number.

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

Инициализирующий блок

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

Любые инициализирующие блоки выполняются до конструкторов.

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

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

В Android имеются много статических методов и переменных. Например, метод Log.i(). Так как метод является статическим, мы не объявляем Log log = new Log(). Достаточно сразу вызвать метод.

Также часто используется статический метод Toast makeText().

Статическая переменная

Чтобы лучше уяснить механизм работы статической переменной, напишем следующий пример. Создадим класс Cat.

Мы создали две статические переменные. Одну не трогаем, а вторую увеличиваем на единицу в конструкторе.

Переходим в класс активности и проверяем, чему равны эти переменные.

Программа вернёт значения, которые мы сами установили — 0 и 8. Обратите внимание, чтоб мы даже не создавали экземпляры класса, а обращались напрямую к классу.

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

Первые два значения понятны из предыдущего примера. Затем при создании первого кота, переменная sId автоматически увеличивается на единицу. Вторая переменная остаётся без изменений.

Затем мы явно указываем новое значение для второй переменной, и создаём второго кота, у которого также сработает увеличение на единицу первой переменной. Проверка убедит нас в этом. Было 1 и 8, стало 2 и 15.

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

Источник

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

Static в Java используется как ключевое слово используется для управления памятью. Его можно применять с переменными, методами, блоками и внутренними классами. В объявлении static относится к классу, а не экземпляру класса.

Статической может быть :

  • переменная ( переменная класса );
  • метод ( метод класса );
  • блок;
  • внутренний класс.

Статические переменные Java

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

Статические переменные в Java — преимущества

Java static переменная не загружает память.

Пример, в котором не используется статическая переменная

Предположим, что в колледже 500 студентов. Класс Student будут задействовать память каждый раз при создании объекта. У всех студентов есть уникальное rollno и name . А college — это общее свойство для всех объектов. Если сделать его статическим, то поле будет задействовать память только один раз.

Статическое свойство Java является общим для всех объектов.

Пример статической переменной

Программа подсчета без статической переменной

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

Программа подсчета со статической переменной

Java static переменная задействует память только один раз. Если какой-либо объект изменяет значение статической переменной, она сохраняет свое значение.

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

Если ключевое слово static применяется в объявлении метода, то это static method Java .

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

Источник

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

В этой статье мы изучим статические методы в Java и сравним Static и Instance. Главное запомнить, что если вы применяете статическое ключевое слово с любым методом, оно называется статическим методом.

Читайте также:  При загрузке лежит андроид

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

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

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

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

Синтаксис

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

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

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

Вывод:
vaibhav
shadow

Статические переменные(static) и их значения (примитивы или ссылки) определяются внутри класса и хранятся в пространстве памяти PermGen.

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

static int i = 1;
static Object obj = new Object();

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

Когда используются?

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

Что такое метод экземпляра Java?

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

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

  • Инстансы принадлежат объекту класса, а не классу, т. е. они будут также ссылаться, как и после создания объекта класса.
  • Каждый отдельный объект, созданный из <класса, категории>, имеет свою собственную копию метода(ов) экземпляра этого класса.
  • Они могут быть переопределены.

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

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

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

Спасибо, помогите другим — напишите комментарий, добавьте информации к статье.

Или поделись статьей

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

Источник

Android java static method

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

В Java мы оперируем такими понятиями, как Класс и instance класса — объект. Класс — это описание методов и свойств Объекта , а Объект — это уже инстанс класса, сущность.

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

Объект же — это сам прибор, со своим уникальным набором свойств.

Например, у него может быть цвет, материал изготовления, форма, он может состоять также из более мелких узлов(вспомогательных приборов) и т.д

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

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

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

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

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

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

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

Т.е такой метод не связан с объектом класса, он связан только с классом, в котором объявлен.

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

И вот тут как раз в дело вступает модификатор static .

Указав модификатор static у поля или метода класса, вы тем самым говорите: это поле или метод принадлежат именно классу.

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

Грубо говоря, если вы объявляете поле класса статическим, то вы как бы расшариваете это поле для всех объектов.

Представьте себе документ, который редактирует несколько пользователей. Если один из пользователй изменяет какое-то слово или абзац, то документ меняется у всех пользователей.

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

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

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

У вас должен возникнуть вопрос: «А где вообще можно использовать static ?»

Где используется static

Ключевое слово static может быть использовано при объявлении:

  • Поля класса
  • Метода класса
  • Блока кода
  • Вложенного класса

Наиболее часто встречаемое применение — это первые два пункта: поля и методы.

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

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

Пример: Math.abs(-20) , Math.sqrt(144) .

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

Контекст операции в данном случае — это число. Оно передается в аргументах и поэтому все, что нам нужно для работы уже доступно, мы никак не влияем на состояние объекта и нигде его не сохраняем.

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

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

Такие классы обычно имеют в своем имени слова типа Utils , тем самым намекая на то, что это класс для утилит.

Это классы без состояния, stateless , имеющие только статические методы.

Хороший пример такого подхода — FileUtils , который есть в большом количестве библиотек, Apache Commons IO в их числе. Область работы такого класса — это работа с файлами, если заглянуть внутрь мы обнаружим методы, наподобие boolean exists(File file) , void writeToFile(List data) и т.д.

В идеале такой класс является еще и финальным — final , так как не к чему позволять таким классам возможность участвовать в наследовании.

Статические методы применяются также при использовании factory и builder паттернов.

Подробнее об этом в Паттерны.

Создание экземпляров объектов

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

Например: String.valueOf(15) , Integer.valueOf(«14») .

Т.е это некоторые factory -методы, которые помогают нам создавать объекты.

Обычно внутри таких методов добавляется еще какая-то логика или оптимизация.

В частности, статические методы создания valueOf() у классов-оболочек примитивов, кроме чисел с плавающей точкой, имеют кеш. По умолчанию данный кеш содержит значения от -128 до 127 , если значение попадает в кеш — оно достается в разы быстрее, чем при использовании конструктора, при этом не расходууется лишняя память.

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

Поэтому, если есть возможность, то лучше использовать такие factory -методы.

Например, предпочтительней использовать Integer.valueOf(«14») , вместо new Integer(14) .

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

Это значит, что статические поля, например, можно использовать для создания примитивынх счетчиков( counter -ов).

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

Также статическое поле используется внутри Singleton -паттерна.

Но в основном статические поля используются для создания констант:

Тут, я думаю, все понятно — константа и в Африке константа.

Про константы и их оформление можно прочесть вот тут.

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

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

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

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

Выглядит синтаксис статического блока вот так:

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

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

Т.е у нас есть некоторый каталог и есть данные для заполнения.

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

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

Подобный подход используется еще и при работе с базами данных в Java , например, в JDBC, когда надо загрузить драйвер для работы с конкретной БД .

Так вот, загрузку драйвера как раз делают в статическом блоке:

Подробнее о порядке выполнения кода при инициализации класса: Порядок инициализации полей класса в Java.

Однако помните! Статичный блок НЕ может пробросить перехваченные исключения, но может выбросить не перехваченные. В случае возникновения исключения в статическом блоке кода выбросится ExceptionInInitializerError .

Статические вложенные классы

В Java можно объявить класс внутри другого класса.

Такой вложенный класс называется nested -классом. Вложенные классы делятся на статические и нестатические.

Нестатические вложенные классы называют еще внутренними классами — inner -классами.

Класс, внутри которого объявлен другой класс, назовем обрамляющим или outer -классом.

Для иллюстрации вышесказанного:

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

Зачем же вообще нужны nested классы?

Например, вы пишите реализацию связного списка.

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

Логично, что исходя из этого делать отдельный public класс излишне.

Объявив же в такой ситуации вложенный класс, вы добьетесь сразу нескольких преимуществ:

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

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

Это способ привести код к более читабельному и поддерживаемому виду.

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

Это увеличивает инкапсуляцию.

Если вложенный класс используется только внутри стороннего класса, логично скрыть его и использовать лишь внутри. Аналогично с тем, как мы объявляем private поля.

Если посмотреть стандартную реализацию java.util.LinkedHashMap в Java 8 , то там именно так и сделано:

Подробнее о вложенных классах: Вложенные классы в Java.

Как стоит обращаться к статическим полям или методам

Если коротко, то раз поле или метод принадлежит классу, то и обращаться к нему необходимо через имя класса.

Если нужны подробности, то давайте посмотрим на следующий класс, содержащий статическое поле:

Мы хотим обратиться к этому полю, и возникает вопрос: как правильно это сделать?

Есть два рабочих варианта:

  • Обратиться к полю через экземпляр объекта класса.
  • Обратиться к полю через класс.

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

Вспомните, что статические поля принадлежат не экземпляру объекта класса, а самому классу. Так зачем вам объект?

Для закрепления приведу следующий пример:

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

Если вы ответили, что будет исключение NullPointerException , то прочтите еще раз статью.

Мы не увидим NullPointerException , так как вместо ex в месте обращения к статической переменной field умный компилятор увидит ошибку глупого программиста и подставит Example — имя класса.

Ведь мы обращаемся к полю, которое принадлежит классу! А значит обращение будет не к объекту экземпляра, и код, который выполнится будет равнозначен выполнению:

Что корректно и без ошибок выведет нам 14 .

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

Запомните следующее: обращение к статическим методам и полям осуществляется только через имя класса.

Еще один интересный момент состоит в том, что статический метод нельзя переопределить.

Т.е при работе с статическими методами override невозможен.

Если вы объявите один и тот же метод в классе-наследнике и в родительском классе, т.е. метод с таким же именем и сигнатурой, вы лишь спрячете метод родительского класса, но не переопределите.

Такое скрытие называется hiding .

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

В первом вызове тип ссылки p был Parent , во втором — Child .

Соответственно, в первом случае метод test вызвался у класса Parent , а во втором у Child .

Данный пример непрозрачно намекает, что использовать статические методы при наследовании не стоит.

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

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

Что еще надо знать про static модификатор в Java

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

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

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

Ключевое слово static может быть использовано при объявлении:

  • Поля класса
  • Метода класса
  • Блока кода
  • Вложенного класса

Чаще всего оно применяется для первых двух случаев.

Для ответа на вопрос, должен ли быть метод статическим, надо понять: доступен ли контекст выполняемой операции полностью из аргументов метода? Если ответ ‘да’, то это весомый аргумент для использования static . Так как в таком случае, вам не нужен объект класса — вы не используете его состояние, поведение и т.д.

Использовать статические методы при наследовании не стоит из-за hiding .

В целом, static использовать стоит аккуратно, помимо случаев, когда вы создаете константу или factory- метод .

Источник

Читайте также:  Рандомные звуки уведомлений android
Оцените статью