静态方法和实例方法的区别:

1、在外部调用静态方法时,可以使用“类名.方法名”的方式,也可以使用“对象名.方法名”的方式。而实例方法只有后面这种方式。也就是说调用静态方法可以不用创建对象。

下面通过一个例子来展示:

Java
//StaticMethod.java
public class StaticMethod {
//定义一个静态方法
public static void callMe(){
System.out.println("This is a static method");
}
}
1
2
3
4
5
6
7
//StaticMethod.java
publicclassStaticMethod{
//定义一个静态方法
publicstaticvoidcallMe(){
System.out.println("This is a static method");
}
}
Java
//TestStaticMethod.java
public class TestStaticMethod {
public static void main(String args[]) {
StaticMethod.callMe();//直接调用静态方法,不需要创建对象
StaticMethod oj = new StaticMethod();//创建一个对象
oj.callMe();//通过对象来调用静态方法
}
}
1
2
3
4
5
6
7
8
9
//TestStaticMethod.java
publicclassTestStaticMethod{
publicstaticvoidmain(Stringargs[]){
StaticMethod.callMe();//直接调用静态方法,不需要创建对象
StaticMethodoj=newStaticMethod();//创建一个对象
oj.callMe();//通过对象来调用静态方法
}
}

程序的输出结果:

This is a static method
This is a static method

之所以允许不通过创建对象来调用静态方法,是为了减少程序员调用某些常用的方法时的麻烦,一个典型的例子是“Math.pow(x, a)”。

2、静态方法在访问本类成员时,只允许访问静态成员(静态成员变量和静态方法),而不允许访问实例成员变量和实例方法,而实例方法则没有这方面的要求。

下面通过例子来展示静态方法访问成员变量:

Java
//AccessMember.java
public class AccessMember {
private static int staticNumber;//定义一个静态成员变量
private int nonStaticNumber;//定义一个实例成员变量
//定义一个静态方法
static void staticMethod(){
int i = 0;//正确,可以定义自己的局部变量
otherStat();//正确,静态方法可以使用静态变量
nonStaticNumber = 20; //错误,不能使用实例变量
insMethod();//错误,不能调用实例方法
}
static void otherStat(){};
void insMethod(){
int i = 0;//正确,可以有自己的局部变量
staticNumber = 15;//正确,可以使用静态变量
nonStaticNumber = 30;//正确,可以使用实例变量
staticMethod();//正确,可以调用静态方法
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//AccessMember.java
publicclassAccessMember{
privatestaticintstaticNumber;//定义一个静态成员变量
privateintnonStaticNumber;//定义一个实例成员变量
//定义一个静态方法
staticvoidstaticMethod(){
inti=0;//正确,可以定义自己的局部变量
otherStat();//正确,静态方法可以使用静态变量
nonStaticNumber=20;//错误,不能使用实例变量
insMethod();//错误,不能调用实例方法
}
staticvoidotherStat(){};
voidinsMethod(){
inti=0;//正确,可以有自己的局部变量
staticNumber=15;//正确,可以使用静态变量
nonStaticNumber=30;//正确,可以使用实例变量
staticMethod();//正确,可以调用静态方法
}
}

总之,静态方法只能访问静态成员,实例方法可以访问静态和实例成员。之所以不允许静态方法访问实例成员变量,是因为实例成员变量时属于某个对象的,而静态方法执行时,并不一定存在对象。同样,如果允许静态方法调用实例方法,将间接的允许其使用实例成员变量,所以不允许静态方法调用实例方法。同样的道理,静态方法中也不能使用关键在this。

main()方法时一个典型的静态方法,同样遵循一般静态方法的规则,所以他可以由系统在创建对象之前就调用。