A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 林豪 中级黑马   /  2012-4-16 10:31  /  1685 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 林豪 于 2012-4-16 10:33 编辑

静态修饰的变量和函数是不是要存放在方法区?
那么为什么主函数也是静态修饰的,为什么他在栈内存区?
还有主函数调用的函数也是静态修饰的,为什么也在栈内存区?求解!!

3 个回复

倒序浏览
静态:static。

用法:是一个修饰符,用于修饰成员(成员变量,成员函数)。

当成员被静态修饰后,就多了一个调用方式,除了可以被对象调用外,还可以直接被类名调用。类名.静态成员。
1、存放位置。

类变量随着类的加载而存在于方法区中。

实例变量随着对象的建立而存在于堆内存中。
主函数是程序的入口,有jvm调用,所以它是静态的 访问类型也是public
回复 使用道具 举报
主函数必须是静态的,因为主函数所在类,一加载,虚拟机要去调用这个入口。
调用函数时,是通过栈来进行的,需要压栈传递参数来调用函数,这时函数就进入栈内存了。
至于函数之前是在方法区,还是堆栈貌似都没关系。
只是方法区存放的是静态的,类一加载就有了,可以直接调用,堆栈里的动态方法,则要对象创建后才存在
回复 使用道具 举报
主函数的方法也是放到方法区里面的!只是会把一些引用放到栈里。
栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中   
举个小例子:
  1. public   class AppMain                //运行时, jvm 把appmain的信息都放入方法区      
  2. {      
  3.         public   static   void main(String[] args) //main 方法本身放入方法区。      
  4.         {      
  5.         Sample test1 = new Sample( " 测试1 " );   //test1是引用,所以放到栈区里, Sample是自定义对象应该放到堆里面      
  6.         Sample test2 = new Sample( " 测试2 " );      
  7.        
  8.         test1.printName();      
  9.         test2.printName();      
  10.         }      
  11. }
  12.    

  13. public   class Sample        //运行时, jvm 把appmain的信息都放入方法区      
  14. {      
  15.         /** 范例名称 */      
  16.         private name;      //new Sample实例后, name 引用放入栈区里, name 对象放入堆里      
  17.        
  18.         /** 构造方法 */      
  19.         public Sample(String name)      
  20.         {      
  21.                 this .name = name;      
  22.                
  23.                 /** 输出 */      
  24.                 public   void printName()   //print方法本身放入 方法区里。      
  25.                 {      
  26.                         System.out.println(name);      
  27.                 }      
  28.         }
  29. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马