成都创新互联网站制作重庆分公司

java中静态方法和非静态方法有区别吗

java中静态方法和非静态方法有区别吗?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

创新互联建站专业为企业提供灌云网站建设、灌云做网站、灌云网站设计、灌云网站制作等企业网站建设、网页设计与制作、灌云企业网站模板建站服务,10年灌云做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。

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中静态方法和非静态方法有区别吗问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注创新互联行业资讯频道了解更多相关知识。


当前名称:java中静态方法和非静态方法有区别吗
链接分享:http://cxhlcq.com/article/jodjjo.html

其他资讯

在线咨询

微信咨询

电话咨询

028-86922220(工作日)

18980820575(7×24)

提交需求

返回顶部