静态与非静态

一、静态变量和实例变量的区别

1、静态变量

  由static修饰,在jvm中,静态变量加载顺序在对象之前,所以静态变量不依赖对象的存在,可以不实例化对象的情况下使用类的静态变量。

通过上面的代码可以看出,静态变量可以在未实例化对象的时候使用,但是非静态变量只能在实例化对象时候才能使用。

 

运行结果为:

30
李四

40
李四

把User中的name改为非静态变量后

运行结果为:

30
李四

40
张三

根据上面两次运行结果可以看出,静态变量属于类,不属于类中任何一个对象,因此静态变量又叫做类变量,一个类不管创建多少个对象(对象是类的一个实例),静态变量在内存中有且仅有一个,所以name为静态变量时,即使是实例化对象,获得的name值是在内存中的,实例化对象并不会初始化该对象静态变量的值。

2、实例变量

  必须依附于对象存在,只有实例化类后才可以使用此类中的实例变量,实例变量即非静态变量。

上面例子User中的age即是实例变量。

二、静态方法与实例方法的区别

1、静态方法

  方法用static关键字修饰,静态方法与静态成员变量一样,属于类本身,在类装载的时候被装载到内存,不自动进行销毁,会一直存在于内存中,直到JVM关闭。使用时也是不需要实例化类,能够直接使用。

  

通过上面的代码可以看出,在静态方法中只能访问类中的静态成员跟静态方法,不能直接访问类中的实例变量跟实例方法。

 因为静态方法和静态变量一样,在jvm中,加载顺序在对象之前,可能在调用非静态方法或非静态变量时,被调用的非景田方法或非静态变量还未被实例化,所以在静态方法中要使用非静态变量或方法,只能通过实例化对象来调用。

2、实例化方法

  属于实例对象,实例化后才会分配内存,必须通过类的实例来引用。不会常驻内存,当实例对象被JVM 回收之后,也跟着消失。

上面例子User中showAge就是实例化方法,实例化方法即非静态方法。

注:

1.线程安全:静态方法是共享代码段,静态变量是共享数据段。既然是“共享”就有并发的问题。非静态方法是针对确定的一个对象的,所以不会存在线程安全的问题。 
2.如果静态方法在系统中定义太多,会占用大量的资源,最后造成内存溢出,所以静态方法不能滥用。

原文地址:https://www.cnblogs.com/guochang/p/9555848.html