静态方法定义:
在类中使用static修饰的方法。
说明:
使用static修饰的静态方法会在类定义的时候被装载到内存中;而非静态方法是属于具体实例化的对象的,只有当持有该方法的类的对象被创建的时候,该方法就会被加载到该对象所在内存。
注意:
非静态方法既可以访问静态数据成员和方法又可以访问非静态数据成员和方法;
而静态方法只能访问静态数据成员和方法。
原因:
静态方法和静态数据成员会随着类的定义而被分配和装载入内存中,而非静态方法和非静态数据成员只有在类的对象创建时在对象所在内存中才有这个方法和数据成员的代码段。
调用方式:
调用静态方法时,可以用类名.方法名的形式,也可以使用对象名.方法名的形式。
示例代码和说明如下:
public class Test {
public static void main(String[] args) {
//testOne()为StaticTest类的静态方法,可以直接通过“类名.方法名”的方式调用
int x = StaticTest.testOne();
System.out.println(x);
//也可以通过实例化对象调用静态方法testOne()
StaticTest staticTest = new StaticTest();
int y = staticTest.testTwo();
System.out.println(y);
}
//静态类
public static class StaticTest {
static int a;
int b = 200;
//静态方法块,只在类装载的时候执行一次,一般用来初始化静态变量。
static {
a = 100;
}
//静态方法
public static int testOne() {
//这里会报错,静态方法内不可以使用非静态成员(不可以使用b)
// 但可以使用静态成员(可以使用a)
int c = b + a;
return c;
}
//非静态方法
public int testTwo() {
//非静态方法内可以直接使用静态成员和非静态成员
int d = b + a;
return d;
}
}
}
总结:
1.静态方法会在类被定义的时候装载到内存中,静态变量只有一份副本,只分配一个内存空间。含有静态方法的这个类可能会有多个实例,但这些实例会共享该内存,所以当任何一个实例对象对静态数据成员做修改,都会影响其它对象。
2.静态方法不能引用非静态数据成员,因为静态方法和静态数据成员会随着类的定义而被分配和装载入内存中,而非静态方法和非静态数据成员只有在类的对象创建时在对象所在内存中才有这个方法和成员的代码段。在类加载静态方法的时候去使用了非静态的方法和其他数据成员,将无法在内存中找到非静态的代码段,必然会出错,这种做法是Java虚拟机决不允许的。
3.静态方法块,只在类装载的时候执行一次,一般用来初始化静态变量。