java静态要领和非静态要领的区分
1、静态要领(static method)
与静态成员变量一样,属于类自身,在类装载的时刻被装载到内存中,不自动举行烧毁,会一向存在内存中,直到JVM封闭;
2、非静态要领(non-static method)
又称实例化要领,属于实例对象,实例化以后才会分派内存,必需经由过程类的实例来援用,当实例对象被JVM接纳以后,也随着消逝
静态要领和实例要领的区分
1.生命周期
静态要领的生命周期从历程建立时就最先,一向到历程完毕,所以说静态要领是全局的,贯串全部历程
实例要领的生命周期,从实例化对象最先,一向到实例化对象被注销接纳以后完毕
所以实例要领的生命周期是短于静态要领的生命周期,这也是实例要领中不能挪用静态要领的缘由
2.挪用体式格局
在外部挪用静态要领时,能够运用 “类名.要领名”的体式格局,也能够运用“对象.要领名”的体式格局,也就是说挪用静态要领时无需建立对象
实例要领只能运用“对象.要领名的体式格局”
//-----------hasStaticMethod.java----------------- public class hasStaticMethod{ //定义一个静态要领 public static void callMe(){ System.out.println("This is a static method."); } }
下面这个递次运用两种情势来挪用静态要领。
//-----------invokeStaticMethod.java----------------- public class invokeStaticMethod{ public static void main(String args[]){ hasStaticMethod.callMe(); //不建立对象,直接挪用静态要领 hasStaticMethod oa = new hasStaticMethod(); //建立一个对象 oa.callMe(); //应用对象来挪用静态要领 } }
3.接见限定
静态要领在接见本类的成员时,只许可接见静态成员(即静态变量和静态要领),而不许可接见实例成员变量和实例要领;而实例要领则无此限定
实例成员变量是属于某个对象的,在静态要领实行时,并不一定存在该对象;同理,假如许可静态要领接见实例成员要领,就间接的能够接见实例成员变量,所以也不能接见实例成员要领;基于一样的原理,静态要领中也不能运用关键字this
//-----------accessMember.java----------------- class accessMember{ private static int sa; //定义一个静态成员变量 private int ia; //定义一个实例成员变量 //下面定义一个静态要领 static void statMethod(){ int i = 0; //准确,能够有本身的局部变量sa = 10; //准确,静态要领能够运用静态变量 otherStat(); //准确,能够挪用静态要领 ia = 20; //毛病,不能运用实例变量 insMethod(); //毛病,不能挪用实例要领 } static void otherStat(){} //下面定义一个实例要领 void insMethod(){ int i = 0; //准确,能够有本身的局部变量 sa = 15; //准确,能够运用静态变量 ia = 30; //准确,能够运用实例变量 statMethod(); //准确,能够挪用静态要领 } }
4.实行递次
当一个class文件被ClassLoader load进入JVM以后,要领指令保存在Stack中,此时Heap区并没有数据。然后递次手艺器最先实行指令,假如是静态要领,直接顺次实行指令代码,固然此时指令代码是不能接见Heapshuju数据区的;假如是实例要领(实例要领有一个隐含的传入参数,该参数是JVM给它的,这个参数就是实例对象在Stack中的内存地址,因而实例要领才能够找到在Heap中属于本身的数据),则在挪用前必需实例化该对象,在Heap中分派数据,并将Stack中的内存指针经由过程JVM的隐含参数传给实例要领。若不实例化直接挪用,因为隐含参数没有值,会报错。
以上就是java静态要领和非静态要领的区分的细致内容,更多请关注ki4网别的相干文章!