黑马程序员技术交流社区
标题:
静态方法对象.invoke()的疑惑
[打印本页]
作者:
绿树林
时间:
2013-4-2 12:59
标题:
静态方法对象.invoke()的疑惑
本帖最后由 郭华章 于 2013-4-2 20:51 编辑
通过上一个帖子,我知道了静态方法不需要对象调用,所以invoke里第一个参数是null。但是下面这个静态方法的invoke第一个参数可以是一个对象,通过测试,发现invoke(null,1)与invoke(t1,1)都可以正确执行。我想问下专家们,这两种有什么区别呢还是完全一样?
package cn.itheima.day1;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) throws Exception {
Test t1=new Test();
Method m=Class.forName("cn.itheima.day1.Test").getMethod("numAdd",int.class);
System.out.println(m.invoke(t1, 1));//参数为实例对象的时候
System.out.println(m.invoke(null, 1));//参数为null的时候
}
public static int numAdd(int a){
a++;
return a;
}
}
复制代码
作者:
谢达
时间:
2013-4-2 13:57
文档说明:
//如果底层方法是静态的,那么可以忽略指定的 obj 参数。该参数可以为 null。
//假如把static去掉,就会报NullPointerException异常.因为静态方法是属于类的。所以可以不用传具体某个对象
作者:
932759732
时间:
2013-4-2 15:25
你的t1指向的是new Test(),是这个类本身。
invoke方法调用的是传入的对象身上的特有方法。
类中的静态方法也算是这个对象中的特有方法。所以可以正确执行。
而当你参数为null的时候是直接调用的静态方法,所以也可以执行。
我是这样理解的
作者:
绿树林
时间:
2013-4-2 17:48
package cn.itcast.day1;
import java.lang.reflect.Method;
public class Test {
static int x=0;
static int y=0;
Test(int x){
this.x=x;
}
public static int numAdd(int a) {
x=x+a;
return x;
}
public static void main(String[] args) throws Exception {
Test t1 = new Test(1);
Method m = Class.forName("cn.itcast.day1.Test").getMethod("numAdd",int.class);
System.out.println(m.invoke(null, 1));// 参数为null的时候
System.out.println(m.invoke(t1, 1));// 参数为实例对象的时候
}
}
复制代码
刚开始疑惑为啥这俩结果不一样呢,现在懂了,谢谢。
作者:
蓝色骨头
时间:
2013-4-2 19:13
Method invok
如果底层方法是静态的,那么可以忽略指定的 obj 参数。该参数可以为 null。
如果底层方法所需的形参数为 0,则所提供的 args 数组长度可以为 0 或 null。
哈哈,这都文档里面的
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2