楼主: sunnyan

java中static方法疑惑

[复制链接]
论坛徽章:
0
31#
发表于 2007-12-21 16:39 | 只看该作者
其实很简单的一个问题,被大家搞复杂了,实在看不下去。

1关于,main方法是static方法,但是为什么非要是static。

      原因就是,如果一个类她定义了main方法的话,那么她的main方法会在这个类的构造函数运行之前被调用。
      
      由于main方法运行的时候尚未在JVM里生成相应对象(构造函数未被执行),所以要声明为static。

2这就涉及到下面的问题,和其他任何方法一样,static方法可以创建或使用与其它类型相同的被命名对象,因此,static方法常常拿来做‘牧羊人’的角色,负责看护与其隶属同一类型的实例群。”

      其实作者的意思是说,按照GOF(模式四人帮)的观点,单实例工厂类的生产方法,应该是static的。
      
      关于‘牧羊人’的意思是指,在面向对象的语言里,最高级首先是元类,元类(meta class)下面是类,类下面才是对象。对于虚拟机来说,类是元类的对象,static方法是类

的方法,而不是对象的方法。

      所以,对象就相当于“羊”,

      类就相当于“羊圈”盛放和标示“羊”,拿出来一只羊,就要问问,你是哪个羊圈里的?

      static方法相当于“羊圈里的狗”,专门来管理羊。

      而元类才是幕后的‘牧羊人’。

      thinking作者本科是读物里的,后来才转过来读软件工程(那时候学的是c),可能是半路出家的原因,对面向对象的机制,在理解上有出入。

3关于,“static方法就是没有this的方法”这句话

      其实这句话是废话,this是对象的引用。而static方法是一个类的方法,不是哪个特定对象的方法,所以在static方法里使用this引用每意义。

4关于static方法和static属性是不是存储在一个地方的

      我爱死这个问题了。

      我可以负责任的说,他俩肯定不能存到同一个内存地址里面去(笑),虚拟地址除外。

      其实他们俩不属于哪个特定的对象,所以不会出现在为哪个特定对象分配的内存块里。

      刚才说了,static方法和static属性属于类,所以他俩是被存到相应的类的内存空间里。

      为什么类还有自己的内存空间?是因为特定的类是特定的元类的对象。也就是说,类是某个其它类的对象。而这个元类并未开放给应用程序员。


其实static是个非常古老的关键字,古老到比这里大部分朋友的年龄还老。

使用道具 举报

回复
论坛徽章:
27
开发板块每日发贴之星
日期:2008-01-17 01:06:29ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04紫蛋头
日期:2013-06-07 17:04:33马上有房
日期:2014-02-18 16:42:02懒羊羊
日期:2015-03-04 14:52:11秀才
日期:2015-08-24 09:51:48秀才
日期:2015-09-17 09:11:05天蝎座
日期:2016-01-04 11:15:24迷宫蛋
日期:2016-02-03 16:13:47咸鸭蛋
日期:2016-02-03 16:14:11
32#
发表于 2007-12-21 18:57 | 只看该作者
STATIC 在编译过程中,它会优先被编译

使用道具 举报

回复
论坛徽章:
27
开发板块每日发贴之星
日期:2008-01-17 01:06:29ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04紫蛋头
日期:2013-06-07 17:04:33马上有房
日期:2014-02-18 16:42:02懒羊羊
日期:2015-03-04 14:52:11秀才
日期:2015-08-24 09:51:48秀才
日期:2015-09-17 09:11:05天蝎座
日期:2016-01-04 11:15:24迷宫蛋
日期:2016-02-03 16:13:47咸鸭蛋
日期:2016-02-03 16:14:11
33#
发表于 2007-12-21 18:59 | 只看该作者
edwardhyde 讲的非常好~~

使用道具 举报

回复
论坛徽章:
1
奥运会纪念徽章:篮球
日期:2008-10-24 13:29:38
34#
 楼主| 发表于 2007-12-22 12:28 | 只看该作者
原帖由 edwardhyde 于 2007-12-21 16:39 发表
其实很简单的一个问题,被大家搞复杂了,实在看不下去。

1关于,main方法是static方法,但是为什么非要是static。

      原因就是,如果一个类她定义了main方法的话,那么她的main方法会在这个类的构造函数运行之前被调用。
      
      由于main方法运行的时候尚未在JVM里生成相应对象(构造函数未被执行),所以要声明为static。

2这就涉及到下面的问题,和其他任何方法一样,static方法可以创建或使用与其它类型相同的被命名对象,因此,static方法常常拿来做‘牧羊人’的角色,负责看护与其隶属同一类型的实例群。”

      其实作者的意思是说,按照GOF(模式四人帮)的观点,单实例工厂类的生产方法,应该是static的。
      
      关于‘牧羊人’的意思是指,在面向对象的语言里,最高级首先是元类,元类(meta class)下面是类,类下面才是对象。对于虚拟机来说,类是元类的对象,static方法是类

的方法,而不是对象的方法。

      所以,对象就相当于“羊”,

      类就相当于“羊圈”盛放和标示“羊”,拿出来一只羊,就要问问,你是哪个羊圈里的?

      static方法相当于“羊圈里的狗”,专门来管理羊。

      而元类才是幕后的‘牧羊人’。

      thinking作者本科是读物里的,后来才转过来读软件工程(那时候学的是c),可能是半路出家的原因,对面向对象的机制,在理解上有出入。

3关于,“static方法就是没有this的方法”这句话

      其实这句话是废话,this是对象的引用。而static方法是一个类的方法,不是哪个特定对象的方法,所以在static方法里使用this引用每意义。

4关于static方法和static属性是不是存储在一个地方的

      我爱死这个问题了。

      我可以负责任的说,他俩肯定不能存到同一个内存地址里面去(笑),虚拟地址除外。

      其实他们俩不属于哪个特定的对象,所以不会出现在为哪个特定对象分配的内存块里。

      刚才说了,static方法和static属性属于类,所以他俩是被存到相应的类的内存空间里。

      为什么类还有自己的内存空间?是因为特定的类是特定的元类的对象。也就是说,类是某个其它类的对象。而这个元类并未开放给应用程序员。


其实static是个非常古老的关键字,古老到比这里大部分朋友的年龄还老。

这才叫高人。。

使用道具 举报

回复
论坛徽章:
8
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44奥运会纪念徽章:沙滩排球
日期:2008-05-26 13:31:13生肖徽章2007版:蛇
日期:2009-03-14 20:45:17生肖徽章2007版:鼠
日期:2009-04-05 14:46:50生肖徽章2007版:虎
日期:2009-05-05 15:59:272010年世界杯参赛球队:塞尔维亚
日期:2010-03-31 06:52:012010广州亚运会纪念徽章:乒乓球
日期:2010-11-29 12:21:31迷宫蛋
日期:2011-07-06 09:00:48
35#
发表于 2007-12-26 10:47 | 只看该作者
我的理解:
static方法不需要初始化这个类的实例,而初始化类的实例需要在内存中加载这个类的全部数据(属性),而且需要调用构造方法。
所以初始化实例就占用较多的内存、CPU资源,因而效率低。
有些方法不需要(太多)依赖类本身的数据,就不必要初始化这个类。
static方法可以提高效率

使用道具 举报

回复
论坛徽章:
8
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44奥运会纪念徽章:沙滩排球
日期:2008-05-26 13:31:13生肖徽章2007版:蛇
日期:2009-03-14 20:45:17生肖徽章2007版:鼠
日期:2009-04-05 14:46:50生肖徽章2007版:虎
日期:2009-05-05 15:59:272010年世界杯参赛球队:塞尔维亚
日期:2010-03-31 06:52:012010广州亚运会纪念徽章:乒乓球
日期:2010-11-29 12:21:31迷宫蛋
日期:2011-07-06 09:00:48
36#
发表于 2007-12-26 11:02 | 只看该作者
打个比方:
Connection conn = DriverManager.getConnection(url, user, password);
getConnection是DriverManager的static方法,原因是DriverManager完全可以由url, user, password三个arguments创建一个Connection,而不需要依赖其它数据(或对象)。
然后:
Statement stmt = conn.createStatement();
createStatement是Connection的非static方法,因为Statement的创建是建立在一个Connection的基础上的,也就是必须有个Connection才能有Statement,Statement的实例依赖于Connection的数据。所以createStatement是非static的。

使用道具 举报

回复
论坛徽章:
0
37#
发表于 2007-12-26 11:02 | 只看该作者
建议大家把 单例模式 和 三种工厂模式 看明白了 在来发表言论吧,否则会让人笑掉大牙的!

使用道具 举报

回复
论坛徽章:
0
38#
发表于 2007-12-26 11:04 | 只看该作者
任何时候必须以事实依据说话,不要凭空自认为!

使用道具 举报

回复
论坛徽章:
8
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44奥运会纪念徽章:沙滩排球
日期:2008-05-26 13:31:13生肖徽章2007版:蛇
日期:2009-03-14 20:45:17生肖徽章2007版:鼠
日期:2009-04-05 14:46:50生肖徽章2007版:虎
日期:2009-05-05 15:59:272010年世界杯参赛球队:塞尔维亚
日期:2010-03-31 06:52:012010广州亚运会纪念徽章:乒乓球
日期:2010-11-29 12:21:31迷宫蛋
日期:2011-07-06 09:00:48
39#
发表于 2007-12-26 11:06 | 只看该作者
ls的你没理解这个帖子的意义,
这里讨论的是static方法的原理及意义,没讨论它的用法。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表