Java static keyword

All about "static"

The static keyword can be used in 3 scenarios

1) static variables2) static methods3) static blocks of code.

Lets look at static variables and static methods first.

Contents

 [hide] 
  • 1static variable
  • 2static method
  • 3Assignment
  • 4static block

static variable

  • It is a variable which belongs to the class and not to object(instance)
  • Static variables are initialized only once , at the start of the execution . These variables will be initialized first, before the initialization of any instance variables
  • A single copy to be shared by all instances of the class
  • A static variable can be accessed directly by the class name and doesn’t need any object
  • Syntax : <class-name>.<variable-name>

static method

It is a method which belongs to the class and not to the object(instance)

  • A static method can access only static data. It can not access non-static data (instance variables)
  • A static method can call only other static methods and can not call a non-static method from it.
  • A static method can be accessed directly by the class name and doesn’t need any object
  • Syntax : <class-name>.<method-name>
  • A static method cannot refer to "this" or "super" keywords in anyway

Important Note

main method is static , since it must be be accessible for an application to run , before any instantiation takes place.

Lets learn the nuances of the static keywords by doing some excercises!

Assignment

The goal of this assignment is to learn working of static variables & method

Step 1) Copy the following code into a editor

  1. class Student {
  2. int a; //initialized to zero
  3. static int b; //initialized to zero only when class is loaded not for each object created.
  4.  
  5.   Student(){
  6.    //Constructor incrementing static variable b
  7.    b++;
  8.   }
  9.  
  10.  
  11.    public void showData(){
  12.       System.out.println("Value of a = "+a);
  13.       System.out.println("Value of b = "+b);
  14.    }
  15. //public static void increment(){
  16. //a++;
  17. //}
  18.  
  19. }
  20.  
  21. class Demo{
  22.    public static void main(String args[]){
  23.      Student s1 = new Student();
  24.      s1.showData();
  25.      Student s2 = new Student();
  26.      s2.showData();
  27.      //Student.b++;
  28.      //s1.showData();
  29.   }
  30. }

Step 2) Save & Compile the code. Run the code as, java Demo.

Step 3) Expected output show below

Following diagram shows , how reference variables & objects are created and static variables are accessed by the different instances.

Step 4) It is possible to access a static variable from outside the class using the syntax ClassName.Variable_Name. Uncomment line # 27 & 28 . Save , Compile & Run . Observe the output.


Step 5) Uncomment line 15,16 & 17 . Save , Compile & Run.

Step 5) Error = ? This is because it is not possible to access instance variable "a" from static method "increment".

static block

The static block, is a block of statement inside a Java class that will be executed when a class is first loaded in to the JVM


  1. class Test{
  2.  
  3.   static {
  4.  
  5.      //Code goes here
  6.  
  7.   }
  8.  
  9. }


A static block helps to initialize the static data members, just like constructors help to initialize instance members


转载http://www.javatutorialhub.com/wiki/All_about_%22static%22



Question:

Quick question -

When are static fields initialized? If I never instantiate a class, but I access a static field, are ALL the static blocks and private static methods used to instantiate private static fields called (in order) at that instant?

What if I call a static method? Does it also run all the static blocks? Before the method?

Answer:

A classes static initialization normally happens immediately before the first time one of the following events occurs:

  • an instance of the class is created,
  • a static method of the class is invoked,
  • a static field of the class is assigned,
  • a non-constant static field is used, or
  • for a top-level class, an assert statement lexically nested within the class is executed.

See JLS 12.4.1.

It is also possible to force a class to initialize (if it hasn't already initialized) by using Class.forName(String, boolean, ClassLoader)

转载http://stackoverflow.com/questions/3499214/java-static-class-initialization

你可能感兴趣的:(java,Class,initialization,methods,variables,Instantiation)