Java - Static keyword in Java

转载 2015年07月10日 11:28:16

http://javarevisited.blogspot.de/2011/11/static-keyword-method-variable-java.html

Sometimes I can't open this page without proper proxy configuration, so I have to copy the content here.


10 points about static keyword in Java

1) static keyword can be applied with variable, method or nested class. static keyword can not be applied on top level class. Making a top level class static in Java will result in compile time error.

2) static variables are associated with class instead of object.

3) static variables in java keeps same value for every single object.

4) you can not use non-static variable inside a static method , it will result in compilation error.

5) Static variables are bonded using static binding at compile time so they are comparatively faster than their non-static counter part which were bonded during runtime.

6) Static fields are initialized at the time of class loading in Java, opposite to instance variable which is initialized when you create instance of a particular class.

7) Static keyword can also be used to create static block in Java which holds piece of code to executed when class is loaded in Java. This is also known as static initialize block as shown in below example.

static {
        String category = "electronic trading system";
        System.out.println("example of static block in java");
}

NOTE:

Beware that if your static initialize block throws Exception then you may get java.lang.NoClassDefFoundError when you try to access the class which failed to load.

8) Static method can not be overridden in Java as they belong to class and not to object. so if you have same static  method in subclass and super class , method will be invoked based on declared type of object. For example:

public class TradingSystem {

    public static void main(String[] args) {
        TradingSystem system = new DirectMarketAccess();
        DirectMarketAccess dma = new DirectMarketAccess();
        
        // static method of super class will be called,
        // even though object is of sub-class DirectMarketAccess
        system.printCategory();
        
        //static method of sub class will be called
        dma.printCategory();
    }
  
    public static void printCategory(){
        System.out.println("inside super class static method");
    }
}
  
class DirectMarketAccess extends TradingSystem{
    public static void printCategory(){
        System.out.println("inside sub class static method");
    }
}

Output:
inside super class static method
inside sub class static method

This shows that static method can not be overridden in Java and concept of method overloading doesn't apply to static methods. Instead declaring same static method on Child class is known as method hiding in Java.

9)  If you try to override a static method with a non-static method in sub class you will get compilation error.


10)  Be careful while using static keyword in multi-threading or concurrent programming because most of the issue arise of concurrently modifying a static variable by different threads resulting in working with stale or incorrect value if not properly synchronized. most common issue is race condition which occurs due to poor synchronization or no synchronization of static variable.

Best practices - static variable and static method in Java

1)  Consider making a static variable final in Java to make it constant and avoid changing it from anywhere in the code. Also remember that if  you change value of static final variable in Java like in enum String pattern, you need to recompile all classes which use those variable, because static final variables are cached on client side.

2)  Do not use static and non static synchronized method to protect a shared resource because these two methods locked on different object, which means they can be executed concurrently.

public class SynchornizationMistakes {
    private static int count = 0;
 
    //locking on "this" object lock
    public synchronized int getCount(){
        return count;
    }
 
    //locking on "SynchornizationMistakes.class" object lock
    public static synchronized void increment(){
        count++;
    }
   
}

Here shared count is not accessed in mutual exclusive fashion which may result in passing incorrect count to caller of getCount() while another thread is incrementing count using static increment() method.

When to make a method static in Java

1)  Method doesn't depends on object's state, in other words doesn't depend on any member variable and everything they need is passes as parameter to them.
      
2)  Method belongs to class naturally can be made static in Java.
      
3) Utility methods are good candidate of making static in Java because then they can directly be accessed using class name without even creating any instance. Classic example is java.lang.Math
      
4)  In various designs pattern which need a global access e.g. Singleton pattern, Factory Pattern.

Disadvantage of static method in Java

There are certain disadvantages also if you make any method static in Java for example you can not override any static method in Java so it makes testing harder you can not replace that method with mock. Since static method maintains global state they can create subtle bug in concurrent environment which is hard to detect and fix.

What is nested static class in Java

Nested static class in Java is a static member of any top level class. Though you can make any class static in Java, but you can only make nested classes i.e. class inside another class as static, you can not make any top level class static. Those classes are called nested static classes.

Since to create instance of any nested class you require instance of outer class but that is not required in case of static nested class in Java. You can have an instance of nested static class without any instance of outer class. Here is an example of static nested class in Java:

public class StaticClass{

    public static void main(String args[]){
        StaticClass.NestedStaticClass ns = new StaticClass.NestedStaticClass();
        System.out.println(ns.getDescription());
    }
  
    static class NestedStaticClass{
        public String NestedStaticDescription =" Example of Nested Static Class in Java";
      
        public String getDescription(){
            return NestedStaticDescription;
        }
    }
} 

Output:
Example of Nested Static Class in Java

When to use nested static class in Java

Normally we make a class static in Java when we want a single resource to be shared between all instances and normally we do this for utility classes which are required by all components and which itself doesn't have any state. Sometime interviewer ask  "when to use Singleton vs Static Class in Java" for those purpose, answer is that if it's completely stateless and it work on provided data then you can go for static class otherwise Singleton pattern is a better choice.

Example of static class and method in Java library

Static method in Java is very popular to implement Factory design pattern. JDK itself is a good example of  several static factory methods like String.valueOf(). Another popular example of static method is main method in Java.

1) java.util.Collections has some static utility method which operates on provided collection.
2) java.lang.Math class has static method for maths operations.
3) BorderFactory has static method to control creation of object.
4) Singleton Classes like java.lang.Runtime.


相关文章推荐

Thinking in Java - The static keyword

Ordinarily, when you create a class you are describing how objects of that class look and how they w...

Java static keyword

All about "static" The static keyword can be used in 3 scenarios 1) static variables2) static meth...

The volatile keyword in Java

用在多线程,同步变量。 线程为了提高效率,将某成员变量(如A)拷贝了一份(如B),线程中对A的访问其实访问的是B。只在某些动作时才进行A和B的同步。因此存在A和B不一致的情况。volatile就是用来...

Thinking in Java(8)-final keyword

1.final data The following example shows the basic rules of final keyword:import java.util.*;class ...

static keyword in C

一、static历史 术语static有着不寻常的历史. 起初,在C中引入关键字static是为了表示退出一个块后仍然存在的局部变量。 随后,static C中有了第二种含义:用来表示不能被其它文件...
  • tlaff
  • tlaff
  • 2016年12月16日 14:55
  • 222

Thinking in java-14 static 关键字

static关键字意义

The Default Methods And Static Methods In Java Interface

Default Methods Default methods enable you to add new functionality to the interfaces of your lib...

Static Blocks in Java

come from:http://www.jusfortechies.com/java/core-java/static-blocks.php In java you see "static...

Static class in Java

源址:www.geeksforgeeks.org/static-class-in-java/ Static class in Java Can a ...
  • UzxMx
  • UzxMx
  • 2014年10月30日 21:11
  • 299

Dynamic Binding vs Static Binding in Java

Difference between Dynamic Binding & Static Binding in Java Dynamic Binding or Late Binding ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java - Static keyword in Java
举报原因:
原因补充:

(最多只允许输入30个字)