静态关键词可以修饰三种:
Part1 : 静态变量—相对应的是实例变量:
static int a = 13;:不依附于实例化对象的存在 而是存在于内存中而且永远只有一个。我们可以在不实例化类的情况下直接使用静态变量: className.static_variable_name can return the value of this static variable. //more vivid example: int c = statictestClass.a;
int b = 14;:必须依附于对象存在,只有实例化类之后才可以使用此类中的实例变量. int c = new statictestClass().b
Part2: 静态方法—对应的是实例化方法
静态方法,和静态成员类似,属于类本身,在类装载 的时候被加载到内存 不会进行自动销毁,会一直纯在于内存中。静态方法无法被重写(但是可以被重载(重写是父类子类,重载是自己本身)),无法被非静态方法调用。并且静态方法只能访问类中的静态成员跟静态方法,不能直接访问类中的实例变量跟实例方法,如果想在静态方法内访问实例方法或者实例变量,需要先创建一个新的对象,再通过对象进行访问
实例:
public class StaticTest {
public static void MyStatic(){
System.out.println("这是StaticTest的一个静态方法");
}
public static void main(String[] args) {
StaticTest.MyStatic();
}
}
如果想要在静态方法中调用实例变量和方法 需要:
public class StaticTest {
int b = 14;
public void MyMethod(){
System.out.println("这是StaticTest的一个实例方法");
}
public static void MyStatic(){
StaticTest st = new StaticTest();
int e = st.b;
st.MyMethod();
}
}
而实例化方法(就是一般方法)属于实例对象,只有实例化之后才会分配内存,必须通过类的实例来引用。不会常驻内存。当实例对象被JVM回收了之后,实例化方法也会跟着消失。
总结:
“缺点”:静态方法是共享代码段,静态变量是共享数据段。因为是“共享”,所以多线程之下就会出现并发问题。而非静态的方法和变量是针对某一个确定对象的,因此不存在线程安全问题。而静态方法在系统中定义太多,会造成内存溢出。
“优点”:静态方法可以通过类名.方法进行直接调用。而且由于静态方法会直接加载在内存 因此效率比较高。
Part3:静态类与非静态类
这显然是一个更大的概念。
静态类有以下几个特点:
- 只包含静态成员
- 无法被实例化(也因此不能包含实例构造函数)
非静态类有以下几个特点: - 可以含有静态或非静态成员
- 针对其内部的静态与非静态成员,有着不同的访问方式,一种是无需实例化即可调用或者访问,另一种则需要
一些思考:
还记得之前对什么时候写 Integer.parseInt() 和var.charAt()很奇怪吗?
现在想一下,parseInt() 必然是Integer类的静态方法,而charAt()必然是var这个实例对象的非静态方法。