今天在写代码的时候,突然想起了大一学Java的时候,老师提到了方法类型有两种:静态方法和实例方法。当时并没太多的思考,此后的学习也渐渐将这部分内容遗忘了。现在想起来,这还真是一个认识盲区,我已经写了很多方法了,静态的有,实例的也有,我从未去想过这个方法为什么用静态,那个方法为什么用实例,全是一种习惯罢了。为此,我花了一点时间查阅资料,重拾对这部分的“记忆”,给“静态方法”和“实例方法”做一次小结。


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

既然被分类了,两者必然存在区别。首先从基本概念来认识他们:

若类的方法前加了static关键字,则该方法称为静态方法,反之为非静态方法。—百度百科

意思很明显了,当一个方法被static关键字修饰,他就是静态方法,否则就是实例方法。
两者在使用上也存在这区别(以java代码为例):
使用静态方法的时候,我们可以用 对象名.方法名 或 类名.方法名直接对其调用

1
2
3
4
5
6
public class StaticMethod{
//定义一个静态方法
public static void callMe(){
  System.out.println("我是一个静态方法!");
}
}
1
2
3
4
5
6
7
public class testStaticMethod{
  public static void main(String args[]){
  testStaticMethod.callMe(); //不创建对象,类名直接调用静态方法   
  testStaticMethod test = new hasStaticMethod(); //创建一个对象
  test.callMe(); //利用对象来调用静态方法
}
}

而实例方法是不能这样被直接调用的,实例方法依赖于类的对象,需要创建对象后,对象名.方法名使用

1
2
3
4
5
6
public class InstanceMethod{
//定义一个实例方法
public void callMe(){
  System.out.println("我是一个实例方法!");
}
}
1
2
3
4
5
6
public class testInstanceMethod{
  public static void main(String args[]){ 
  InstanceMethod test = new InstanceMethod(); //创建一个对象
  test.callMe(); //利用对象来调用实例方法
}
}

此外,还有以下两点

1.静态方法只能访问静态成员,但实例方法可以访问静态和实例成员。因为实例成 员变量是属于某个对象的,而静态方法在执行时,并不一定需要对象的存在。

2.静态方法也不能访问实例方法,因为实例方法可以访问实例成员变量,如果允许静态方法调用实例方法,将间接地允许它使用实例成员变量,所以它也不能调用实例方法。同样的道理,静态方法中也不能使用关键字this。

一些理解

网上有些文章提到了两者在内存处理上存在的区别,认为实例方法对静态方法在内存占用上相对较低,我开始也觉得有道理,后来翻阅了一下教材和其他资料,发现实例方法在内存占用上的优势并不明显。两种方法在类被加载的时候就常驻在内存里了,在加载时机和占用内存上,静态方法和实例方法是一样的,调用的速度也基本上没有差别。

有没有发现,C语言是没有实例方法这一说的,作为面向过程的编程,几乎所有的方法都是“静态方法”。而实例方法是面向对象概念的出现而出现的,在C++,Java之类面向对象的语言上最为常见,他们的发明者应用实例化方法也许不是要解决什么性能、内存的问题,而是为了让开发更加模式化、静态方法和实例方法的区分可能是为解决编程问题提供更多模式。