通常,我们创建类时会指出那个类的对象的外观与行为。除非用new 创建那个类的一个对象,否则实际上并
未得到任何东西。只有执行了new 后,才会正式生成数据存储空间,并可使用相应的方法。
但是有两种特殊的情形,上面的方法并不管用:
1. 只想用一个存储区域来保存一个特定的数据——无论要创建多少个对象,甚至根本不创建对象。
2. 我们需要一个特殊的方法,它没有与这个类的任何对象关联(也就是说没有new一个对象)。即使没有创建对象,也需要一个能调用的方法。
像上面的两种情况,用static可以很好的解决这些问题。
static方法的调用有两种方式,一种是通过对象调用,另一种是方法名调用。通常使用第二种。
对学过Java的人来说,对static的使用肯定不陌生,可能有人会说这有什么好说的呢?不就是方法前
加个static关键字,然后调用的时候直接用类名点方法名不就可以了吗。
使用的方法确实没错,这里要说的是static的一点特殊的解析:
如下:
成员前没加static:
public class StaticClass {
int i = 3;
}
public static void main(String[] args) {
StaticClass c1 = new StaticClass();
StaticClass c2 = new StaticClass();
c1.i++;
System.out.println(c2.i);
}
执行结果: 3
成员前加了static:
public class StaticClass {
static int i = 3;
}
执行类:
public static void main(String[] args) {
StaticClass c1 = new StaticClass();
StaticClass c2 = new StaticClass();
c1.i++;
System.out.println(c2.i);
}
或者:
public static void main(String[] args) {
StaticClass.i++;
System.out.println(StaticClass.i);
}
执行结果:4
总结:加了static的成员,无论new了多少个对象,该成员都只占用一个存储空间。
拓展:
关于类中的静态static模块:
public class StaticClass {
static {
//逻辑代码....类加载的时候执行,并且只执行一次。
System.out.println("类加载的时候执行,并且只执行一次。");
}
}
1. 当给StaticClass new 一个对象的时候,执行上述代码中的static块....,不管生成多少个对象,该static块只加载执行一次。
2. 当采取【Class.forName("类的全路径");】语句进行类加载时,执行static块。
正因为static块在类加载的时候就执行了,所以当在static方法中调用非static方法时,会报编译错误!!!!