类方法(静态方法)和实例方法的区别
我们已经知道类体中的方法分为实例方法和类方法两种,用 static 修饰的是类方法。二者有什么区别呢?
当一个类创建了一个对象后,这个对象就可以调用该类的方法。当类的字节码文件被加载到内存时, 类的实例方法不会被分配入口地址, 当该类创建对象后,类中的实例方法才分配入口地址, 从而实例方法可以被类创建的任何对象调用执行。 需要注意的是,当我们创建第一个对象时,类中的实例方法就分配了入口地址,当再创建对象时,不再分配入口地址, 也就是说, 方法的入口地址被所有的对象共享, 当所有的对象都不存在时,方法的入口地址才被取消。对于类中的类方法, 在该类被加载到内存时, 就分配了相应的入口地址。 从而类方法不仅可以被类创建的任何对象调用执行, 也可以直接通过类名调用。 类方法的入口地址直到程序退出才被取消。类方法在类的字节码加载到内存时就分配了入口地址, 因此,Java语言允许通过类名直接调用类方法,而实例方法不能通过类名调用,必须通过创建实例对象去调用实例方法。在讲述类的时候我们强调过,在 Java 语言中,类中的类方法不可以操作实例变量,也不可以调用实例方法,这是因为在类创建对象之前,实例成员变量还没有分配内存,而且实例方法也没有入口地址。
一、区别
1、静态方法在程序开始时生成内存,实例方法在程序运行中生成内存,所以静态方法可以直接调用。
2、实例方法要先成生实例,通过实例调用方法,静态速度很快,但是多了会占内存。
3、静态内存是连续的,因为是在程序开始时就生成了,而实例申请的是离散的空间,所以当然没有静态方法快,而且静态内存是有限制的,太多了程序会启动不了。
4、类方法常驻内存,实例方法不是,所以类方法效率高但占内存。
5、类方法在堆上分配内存,实例方法在堆栈上。
6、实例方法需要先创建实例才可以调用,比较麻烦,类方法不用,比较简单。
7、类方法,也称静态方法,指的是用static关键字修饰的方法。此方法属类本身的方法,不属于类的某一个实例(对象)。
8、类方法中不可直接使用实例变量。其调用方式有三种:可直接调用、类名.方法名、对象名.方法名。
9、实例方法指的是不用static关键字修饰的方法。每个实例对象都有自身的实例方法,互相独立,不共享一个。其调用方式只能是对象名+方法名。
二、使用场景
1、如果需要访问或者修改某个实例的成员变量时,将该方法定义成实例方法。类方法正好相反,它不需要访问或者修改某个实例的成员变量。
2、类方法一般用于实现一些工具方法,比如对某个对象进行扩展,或者实现单例。
3、事实上如果一个方法与他所在类型的实例无关,那么它就应该是静态的,决不会有人把它写成实例方法。所以所有的实例方法都与实例有关,既然与实例有关,那么创建实例就是必然的步骤,没有麻烦简单一说。实际上上你可以把所有的实例方法都写成静态的,将实例作为参数传入即可。