java static 学习

static可用来修饰nested class,method,field,static block,在jdk5后,还有static import(用import static 将其他类或包中的static member引入到当前类中,就像是当前类本身的member一样使用它们).


通用的规则是,你想在所有objects间共享数据了,那就可以做成static的。


static像其他java关键字一样可用于method,nested class,member variable。但不可以修饰top level class 。

static variable属于整个类而属于某个object。类只是一个“蓝本”(blueprint),object才是instance!static variable 和 non-static variable区别在:static variable属于整个类,所有对象共享它;而non-static属于object!当多线程编程时,对static variable要用synchronized同步!为了避免麻烦,不建议在multi-thread时使用static variable!

static variable由于是在编译是“静态绑定”,所以比non-static 运行时绑定,要faster。

static variable 在类加载的时候初始化,而instance variable 是在创建instance的时候。


static method也属于类,所以不需要创建类的实例对象,只用类名就可以调用它。

在static method中不可以引用non-static variable 。否则会编译错误。

static method不可以被override!因为它属于class而不是object!当子类父类中有同样的方法时,调用的方法会是对象所在的类中声明的那个方法。

	public static void main(String[] args)  {
		Father f = new Father();
		Son s = new Son();
		f.f();
		s.f();
	}

class Father{
	static void f(){
		System.out.println("inside super static");
	}
}

class Son extends Father{
	
	static void f(){
		System.out.println("inside sub static");
	}
	
}

output:

inside super static
inside sub static


static block,当类被加载的时候,执行static block中的代码,注意,如果在static block中抛出异常的话,会报java.lang.NoClassDefFoundError 异常,因为加载类失败了!


Best Practice

1,将static的variable搞成static final的,使之成为一个常量,避免在任何地方修改它!如果要改变static final的值,比如在 enum String pattern需要重新编译所有用到这个变量的类,因为static final variable会cached到client side。


2,不要使用static 和 non-static 同步方法去保护共享的数据,因为它们的lock不一样,这意味着它们可以并发执行。see more here Java Mistake 2 - Mixing non static and static method in Java 


3,

什么是静态内部类?

nested static class 是top level class 的一个static member。要创建内部类的实例,需要外部类的实例对象,但要创建静态内部类的实例,就不需要任何外部类的实例!

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


什么时候使用静态内部类?

将类做成static的,是为了作成单一资源(唯一的),并在所有对象间共享它。一般被所有组件共享的工具类及自身没有状态的,适合使用静态内部类。面试中常问,when to use Singleton vs Static Class in Java ,如果自身无状态,并且在给定的数据上工作,那就用nested static class,否则用 Singleton pattern较好。


什么时候使用静态方法

1),当方法不需要依赖对象的状态,也即member field,只需要传入参数即可时,此时,不需要实例对象,用类名直接调用方法即可。

2),需要global access时










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值