小议静态方法和实例方法
今天在写代码的时候,突然想起了大一学Java的时候,老师提到了方法类型有两种:静态方法和实例方法。当时并没太多的思考,此后的学习也渐渐将这部分内容遗忘了。现在想起来,这还真是一个认识盲区,我已经写了很多方法了,静态的有,实例的也有,我从未去想过这个方法为什么用静态,那个方法为什么用实例,全是一种习惯罢了。为此,我花了一点时间查阅资料,重拾对这部分的“记忆”,给“静态方法”和“实例方法”做一次小结。
静态方法和实例方法的区别
既然被分类了,两者必然存在区别。首先从基本概念来认识他们:
若类的方法前加了static关键字,则该方法称为静态方法,反之为非静态方法。—百度百科
意思很明显了,当一个方法被static关键字修饰,他就是静态方法,否则就是实例方法。
两者在使用上也存在这区别(以java代码为例):
使用静态方法的时候,我们可以用 对象名.方法名 或 类名.方法名直接对其调用
1 | public class StaticMethod{ |
1 | public class testStaticMethod{ |
而实例方法是不能这样被直接调用的,实例方法依赖于类的对象,需要创建对象后,对象名.方法名使用
1 | public class InstanceMethod{ |
1 | public class testInstanceMethod{ |
此外,还有以下两点
1.静态方法只能访问静态成员,但实例方法可以访问静态和实例成员。因为实例成 员变量是属于某个对象的,而静态方法在执行时,并不一定需要对象的存在。
2.静态方法也不能访问实例方法,因为实例方法可以访问实例成员变量,如果允许静态方法调用实例方法,将间接地允许它使用实例成员变量,所以它也不能调用实例方法。同样的道理,静态方法中也不能使用关键字this。
一些理解
网上有些文章提到了两者在内存处理上存在的区别,认为实例方法对静态方法在内存占用上相对较低,我开始也觉得有道理,后来翻阅了一下教材和其他资料,发现实例方法在内存占用上的优势并不明显。两种方法在类被加载的时候就常驻在内存里了,在加载时机和占用内存上,静态方法和实例方法是一样的,调用的速度也基本上没有差别。
有没有发现,C语言是没有实例方法这一说的,作为面向过程的编程,几乎所有的方法都是“静态方法”。而实例方法是面向对象概念的出现而出现的,在C++,Java之类面向对象的语言上最为常见,他们的发明者应用实例化方法也许不是要解决什么性能、内存的问题,而是为了让开发更加模式化、静态方法和实例方法的区分可能是为解决编程问题提供更多模式。