黑马程序员技术交流社区

标题: what ---方法区 [打印本页]

作者: 任雷彬    时间: 2012-10-20 19:04
标题: what ---方法区
被static修饰的成员和方法存放在方法区中,但是没有被static修饰的方法还存放在方法区中吗?
方法区除了存储static修饰的成员和方法,还存储什么呢?
class Demo
{
     private int age;
     Demo(int age)
     {
      this.age = age;
      System.out.println("age="+age);
}
     public static String = "CN";    //static修饰的成员变量存储在方法区中
     public static void show()    //static修饰的成员方法存储在方法区中

      {
         System.out.println("String="+string);
}
       public void speak()//未被static修饰的成员方法存放在内存什么地方?
{
           System.out.println("haha");
}
}
class  Demo
{
     public static void main(String[] args)
{
       Demo p = new Demo(5);
       this.play();
      
}
    public void  play()   //这个方发存在内存中什么地方?
{
       System.out.println("playing");
}  
}
作者: 梁枝武    时间: 2012-10-20 19:15
本帖最后由 梁枝武 于 2012-10-20 19:18 编辑

method(方法区)又叫静态区,存放所有的class和静态变量,方法区存放的是整个程序中唯一的元素,如class和static变量。method区可以被所有的线程共享,这一点和heap一样。


  1. public   class  AppMain                //运行时, jvm 把appmain的信息都放入方法区
  2. {
  3. public   static   void  main(String[] args)  //main 方法本身放入方法区。
  4. { //test1是引用,所以放到栈区里, Sample是自定义对象应该放到堆里面
  5. Sample test1 = new  Sample( " 测试1 " );   
  6. Sample test2 = new  Sample( " 测试2 " );

  7. test1.printName();
  8. test2.printName();
  9. }
  10. } Sample.java
  11. //运行时, jvm 把appmain的信息都放入方法区
  12. public   class  Sample      
  13. {
  14. /** 范例名称 */
  15. private  name;//new Sample实例后, name 引用放入栈区里,  name 对象放入堆里

  16. /** 构造方法 */
  17. public  Sample(String name)
  18. {
  19. this .name = name;
  20. }

  21. /** 输出 */
  22. public   void  printName()   //print方法本身放入 方法区里。
  23. {
  24. System.out.println(name);
  25. }
  26. }
复制代码

作者: 梁枝武    时间: 2012-10-20 19:30
本帖最后由 梁枝武 于 2012-10-20 19:48 编辑

静态化的方法叫类方法,在类加载的时候就进入内存方法区,于是不需要创建对象即可用类名来调用该类方法了。
没有被static修饰的方法就是实例方法 ,事实上类刚装载的时候也被装载好了,只是不能直接用类名来调用,因为没有指向任何对象,只有类创建对象的时候才会被分配入口地址,而类方法,是当程序的字节码文件加载到内存就马上分配入口地址,这就是为什么实例方法可以调用类方法,而类方法不能调用实例方法的原因,也是类方法为什么不可以操作实例变量而实例方法可以操作类变量的原因




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2