比如  
  class A{
   public void testMethod(){
   //方法体
}
}现在有2个线程,去调用这个方法:class MyThread extends Thread{  public void run(){   (new A()).testmethod();
}public void main(String[] args){
  Thread thread1 = new MyThread ();
  Thread thread2 = new MyThread ();
   thread1.start();
thread2.start();
}
}
则thread1,thread2取得到testMethod()这个函数的地址一样吗?为什么?
如果把testMethod()定义成static,结果是不是也一样呢?
为什么?

解决方案 »

  1.   

    有什么方法可以证实方法的地址一样呢?
    那如果一样,还要static干什么呢?
      

  2.   

    应该是相同的,当一个class被虚拟机加载后,它的方法入口地址就已经定下来了,
    有没有static表明这个方法是类的还是对象的,即要不要new一个,相对来说static速度快一点,因为不用调new.
    但涉及到线程同步的时候,一般会用非static的。
      

  3.   

    static方法里面只能用到static变量和本地变量,而在多线程的环境下,使用static变量要非常小心,注意同步问题. 方法是否设计成static,具体还是要看你的需求. 不要把非static的方法就看成了有多份,方法本身都没有状态的,没必要多于一份,有状态的只是变量.
      

  4.   


    多线程使用static成员的时候,获取不互斥,修改时互斥,这样应该没问题吧
      

  5.   


    现在的问题是,
    是不是不管加不加static,函数testMethod的地址是不是类A被JVM载入后,就确定了?
      

  6.   

    实际上,在JVM中每个类都有一张方法表,像list一样,存的是下标与方法对应。每个对像存放的是下标。
      

  7.   

    你的思想时带有C和C++的味道。
    一样的,代码都在方法区内,只有一份,这个是不是static没关系。
      

  8.   

     既然这样,那一个方法加与不加static的区别是不是就是前者属性类,后者属性对象的呢?
     
      

  9.   

    所有的方法(指含有static和非static的)方法代码在方法区中只有一份。
    static属性在方法区中也只有一份。
    非static属性在每一个对象中都有一份。
      

  10.   

    那JAVA之父为什么要搞出一个static出来,有何用意呢?
      

  11.   

    谢谢各位的回答,我总结一下吧。 对于一个函数,加不加static,它的地址都是一样的。JVM在载入类后,会把函数分配固定的地址。所以加不加static函数的地址是一样的。所以二者在都是需要考虑同步的问题。 那JAVA之父为什么要提出static呢? 
    我想主要是为了“共享”。一段static资源(变量,函数)可以被程序中的其它代码共享。而不加static就不一样了,不加static必须依赖某一个对象才行。 所以函数加不加static就是类与对象的区别。 类是静态的,而对象则是动态的。 那么我们时候用static呢?  
      

  12.   

    很简单,需要共享的时候,就用static吧。