Java declare static method

Java Static – Variable, Method, Block, Class and Import Statement

Static keyword in java can be applied on variables, methods, blocks, import and inner classes. In this tutorial, we will learn the effect of using static keyword in these places with examples.

Table of Contents 1. Static Variable 2. Static Method 3. Static Import Statement 4. Static Block 5. Static Class 6. Summary

To declare a variable static, use static keyword in variable declaration. static variable syntax is:

ACCESS_MODIFER static DATA_TYPE VARNAME;

For example, a public static variable of Integer type is declared in this way.

public static Integer staticVar;

The most important thing about static variables is that they belong to class level. What it means is that there can be only one copy of variable in runtime.

When you define a static variable in class definition, each instance of class will have access to that single copy. Separate instances of class will not have their own local copy, like they have for non-static variables.

public class JavaStaticExample < public static void main(String[] args) < DataObject objOne = new DataObject(); objOne.staticVar = 10; objOne.nonStaticVar = 20; DataObject objTwo = new DataObject(); System.out.println(objTwo.staticVar); //10 System.out.println(objTwo.nonStaticVar); //null DataObject.staticVar = 30; //Direct Access System.out.println(objOne.staticVar); //30 System.out.println(objTwo.staticVar); //30 >> class DataObject < public static Integer staticVar; public Integer nonStaticVar; >Output: 10 null 30 30

Notice how we changed the value to 30, and both objects now see the updated value which is 30.

Читайте также:  Javascript асинхронные функции синхронно

Another thing you should have noticed that how we are able to access static variable with its classname i.e. DataObject.staticVar . We don’t need to create any instance to access static variables. It clearly shows that static variables belong to class scope.

To declare a static method, use static keyword in method declaration. Static method syntax is:

ACCESS_MODIFER static RETURN_TYPE METHOD_NAME;

For example, a public static variable of Integer type is declared in this way.

public static Integer staticVar; public static Integer getStaticVar()

  1. You can access only static variables inside static methods. If you try to access any non-static variable, the compiler error will be generated with message “Cannot make a static reference to the non-static field nonStaticVar“.
  2. Static methods can be accessed via it’s class reference, and there is no need to create an instance of class. Though you can access using instance reference as well but it will have not any difference in comparison to access via class reference.
  3. Static methods also belong to class level scope.
public class JavaStaticExample < public static void main(String[] args) < DataObject.staticVar = 30; //Direct Access Integer value1 = DataObject.getStaticVar(); //access with class reference DataObject objOne = new DataObject(); Integer value2 = objOne.getStaticVar(); //access with instance reference System.out.println(value1); System.out.println(value2); >> class DataObject < public Integer nonStaticVar; public static Integer staticVar; //static variable public static Integer getStaticVar()< return staticVar; >> Output: 30 30

3. Static Import Statement

The normal import declaration imports classes from packages, so that they can be used without package reference. Similarly the static import declaration imports static members from classes and allowing them to be used without class reference.

A static import statement also comes in two flavors: single-static import and static-import-on-demand. A single-static import declaration imports one static member from a type. A static-import-on-demand declaration imports all static members of a type.

//Single-static-import declaration: import static >.>.>; //Static-import-on-demand declaration: import static >.>.*;
//Static import statement import static java.lang.System.out; public class JavaStaticExample < public static void main(String[] args) < DataObject.staticVar = 30; out.println(DataObject.staticVar); //Static import statement example >> class DataObject < public static Integer staticVar; //static variable >Output: 30

Static blocks are portion of class initialization code, which are wrapped with static keyword.

Static blocks are executed when the class is loaded in the memory. A class can have multiple static blocks and these will be executed in the same sequence in which they appear in class definition.

import static java.lang.System.out; class DataObject < public Integer nonStaticVar; public static Integer staticVar; //static variable //It will be executed first static < staticVar = 40; //nonStaticVar = 20; //Not possible to access non-static members >//It will be executed second static < out.println(staticVar); >> Output: 40

In Java, you can have a static class as inner class. Just like other static members, nested classed belong with class scope so the inner static class can be accessed without having an object of outer class.

public class JavaStaticExample < public static void main(String[] args) < //Static inner class example System.out.println( DataObject.StaticInnerClas.innerStaticVar ); >> class DataObject < public Integer nonStaticVar; public static Integer staticVar; //static variable static class StaticInnerClas < Integer innerNonStaticVar = 60; static Integer innerStaticVar = 70; //static variable inside inner class >>

Please note that an static inner class cannot access the non-static members of outer class. It can access only static members from outer class.

public class JavaStaticExample < public static void main(String[] args) < //Static inner class example DataObject.StaticInnerClas.accessOuterClass(); >> class DataObject < public Integer nonStaticVar; public static Integer staticVar; //static variable static < staticVar = 40; //nonStaticVar = 20; //Not possible to access non-static members >public static Integer getStaticVar() < return staticVar; >static class StaticInnerClas < public static void accessOuterClass() < System.out.println(DataObject.staticVar); //static variable of outer class System.out.println(DataObject.getStaticVar()); //static method of outer class >> > Output: 40

Let’s summarize everything about static keyword usage in Java.

  1. Static members belong to class. No need to create class instance to access static members.
  2. Static members (variables and methods) can be accessed inside static methods and static blocks only.
  3. Non-static members cannot be accessed inside static methods, blocks and inner classes.
  4. A class can have multiple static blocks and they will be executed in order they appear in class definition.
  5. A class can be static only if its declared as inner class inside outer class.
  6. Static imports can be used to import all static members from a class. These members can be referred without any class reference.

Источник

10 заметок о модификаторе Static в Java

Java-университет

10 заметок о модификаторе Static в Java - 1

Модификатор static в Java напрямую связан с классом. Если поле статично, значит оно принадлежит классу, если метод статичный — аналогично: он принадлежит классу. Исходя из этого, можно обращаться к статическому методу или полю, используя имя класса. Например, если поле count статично в классе Counter, значит, вы можете обратиться к переменной запросом вида: Counter.count. Прежде чем приступить к заметкам, давайте вспомним (а может быть, узнаем), что такое static и что может быть статическим в Java. Static — модификатор, применяемый к полю, блоку, методу или внутреннему классу. Данный модификатор указывает на привязку субъекта к текущему классу.

Статические поля

10 заметок о модификаторе Static в Java - 2

При обозначении переменной уровня класса мы указываем на то, что это значение относится к классу. Если этого не делать, то значение переменной будет привязываться к объекту, созданному по этому классу. Что это значит? А то, что если переменная не статическая, то у каждого нового объекта данного класса будет своё значение этой переменной, меняя которое мы меняем его исключительно в одном объекте: Например, у нас есть класс Car с нестатической переменной:

 Car orangeCar = new Car(); orangeCar.km = 100; Car blueCar = new Car(); blueCar.km = 85; System.out.println("Orange car - " + orangeCar.km); System.out.println("Blue car - " + blueCar.km); 
 Orange car - 100 Blue car - 85 

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

 Orange car - 85 Blue car - 85 

Ведь переменная у нас одна на всех, и каждый раз мы меняем именно ее. К статическим переменным, как правило обращаются не по ссылке на объект — orangeCar.km, а по имени класса — Car.km

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

Есть два блока инициализации — обычный и статический. Блок предназначен для инициализации внутренних переменных. Если блок обычный, то им инициализируют внутренние переменные объекта, если же статический, соответственно, им задают статические переменные (то есть переменные класса). Пример класса со статическим блоком инициализации:

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

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

 Counter.invokeCounter(); Counter.invokeCounter(); Counter.invokeCounter(); 
 Текущее значение счётчика - 1 Текущее значение счётчика - 2 Текущее значение счётчика - 3 

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

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

 Vehicle.Car car = new Vehicle.Car(); car.km = 90; 

Для использования статических методов/переменных/класса нам не нужно создавать объект данного класса. Конечно, следует учитывать модификаторы доступа. Например, поля private доступны только внутри класса, в котором они объявлены. Поля protected доступны всем классам внутри пакета (package), а также всем классам-наследникам вне пакета. Для более подробной информации ознакомьтесь со статьей “private vs protected vs public”. Предположим, существует статический метод increment() в классе Counter , задачей которого является инкрементирование счётчика count . Для вызова данного метода можно использовать обращение вида Counter.increment() . Нет необходимости создавать экземпляр класса Counter для доступа к статическому полю или методу. Это фундаментальное отличие между статическими и НЕ статическими объектами (членами класса). Еще раз напомню, что статические члены класса напрямую принадлежат классу, а не его экземпляру. То есть, значение статической переменной count будет одинаковое для всех объектов типа Counter . Далее в этой статье мы рассмотрим основополагающие аспекты применения модификатора static в Java, а также некоторые особенности, которые помогут понять ключевые концепции программирования.

Что должен знать каждый программист о модификаторе Static в Java

  1. Вы НЕ можете получить доступ к НЕ статическим членам класса, внутри статического контекста, как вариант, метода или блока. Результатом компиляции приведенного ниже кода будет ошибка:
 class Vehicle < public static void kmToMiles(int km)< System.out.println("Внутри родительского класса/статического метода"); >> class Car extends Vehicle < public static void kmToMiles(int km)< System.out.println("Внутри дочернего класса/статического метода "); >> public class Demo< public static void main(String args[])< Vehicle v = new Car(); v.kmToMiles(10); >> 

Источник

Оцените статью