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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈希然 黑马帝   /  2011-9-24 14:29  /  1735 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

大家学反射都知道,当我们利用反射操作类里面的成员时,为什么操作实例成员还要要传递一个对象给它,而静态成员就不需要传递一个对象给它 ?

如:

public class BirdMan {
public static void cry() {
  System.out.println("I'm crying");
}
public void shout() {
  System.out.println("I'm shouting");
}
public static void main(String[] args) throws Exception {
  
  Class.forName("cn.itcast.draft.BirdMan").getMethod("cry", null).invoke(null, null) ;  //invoke方法没有传递对象
  
  BirdMan bm = new BirdMan() ;
  Class.forName("cn.itcast.draft.BirdMan").getMethod("shout", null).invoke(bm, null) ;  //invoke方法传递了对象
}
}

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1

查看全部评分

3 个回复

倒序浏览
黑马网友  发表于 2011-9-24 15:16:39
沙发
1:文档里面有这样一句话是这样说的@param obj (就是第一个参数) the object the underlying method is invoked from,意思invoke这个方法里的第一个参数是从自身上发起的。
2:静态属性和方法属于类方法,加载类后,就已经存在静态属性和方法,static方法可以不创建实例就能用的
3:JVM把静态方法集中放在某个地方,当要执行某个静态方法,JVM通过类型地址和方法地址在该区域中查找。
所以调用静态方法是不用new的,实例方法就得创建实例

评分

参与人数 1技术分 +2 收起 理由
wangfayin + 2

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-24 16:05:25
藤椅
[color=DarkOrange]为什么操作实例成员还要要传递一个对象给它[/color]
一个类(BirdMan)可以new很多实例对象:
BirdMan bm1 = new BirdMan() ;
BirdMan bm 2= new BirdMan() ;
BirdMan bm 3= new BirdMan() ;
。。。
每个对象对应一个shout()方法,当你调用此方法时,就需要指明调用的是哪一个对象的shout()方法。
[color=DarkOrange]而静态成员就不需要传递一个对象给它 ? [/color]
静态成员方法可直接被类调用,如BirdMan.cry(), 不需要new对象,理所当然传一个null意思一下。

评分

参与人数 1技术分 +2 收起 理由
wangfayin + 2

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马