static方法只跟类有关,而非static方法是于实例联系的.
把ok()改成改成非static之后就要先new一个实例才能访问.而static 方法只要类被加载就可以调用了.这也就是main为什么是static的原因之一

解决方案 »

  1.   

    简单地说,静态方法就是类的方法。理解了类和对象的区别,就容易理解什么是静态方法什么是非静态方法了。首先要搞清楚,世界是由具体的对象构成的,而不是类;一般说来,我们写的面向对象的程序也是这样,是由对象构成而不是类。类是对象的模板,还可以把类看作是“抽象的”而把对象看作成“具体的”。比如“人”是一个抽象的概念,是一个类;而象“施瓦星格”、“江泽民”之类的就是一个具体的概念,是一个人,即一个对象。什么是方法呢?方法就是行为或动作。比如每个“人”都会吃饭、上厕所;所以,“施瓦星格”、“江泽民”他们也都会吃饭、上厕所。对应到程序中,所有“人”的对象都会有这样的行为。这些呢,就是方法,而且是实例方法(非静态方法)。
    通常如果我们把现实中的事物映射到程序中时,我们能想到的方法都是实例方法,不存在静态方法。那到底什么是静态方法呢?
    我们可以把静态方法看成支持方法或工具方法,它和对象无关,只是为了程序上的方便。与“吃饭”、“上厕所”不同,这些方法不属于“人”的任何一个个体,它们属于“人”这个抽象的东西(由于它与对象无关,所以静态方法存在的理由很少)。设想作为抽象概念的“人”的一个行为吧,它不属于任何一个人。是不是很难?这就对了,面向对象编程强调的对象,不要让类混淆了你的视线。不好意思,我也想不出作为概念的“人”的行为/方法的一个例子。但希望你已经能明白静态方法和实例方法的区别。现在你说的问题就好解释了:public static void ok(double x) 这个方法是一个静态方法(由于有static修饰符),它属于ParamTest类而不是它的任何一个对象。同样,main方法也不属于ParamTest类的任一个对象。所以在类这一概念层次上,main方法调用ok方法没问题。
    现在你把ok方法的static修饰符去掉,它就变成一个实例方法了,它不属于ParamTest类,而属于ParamTest的对象。既然属于ParamTest的对象,所以就必须先有这么一个ParamTest对象才能执行ok方法。就像抽象的“人”是不会“吃饭”的,只有像“施瓦星格”、“江泽民”这样一个个具体的人才会“吃饭”。同理,在没有一个ParamTest对象时调用ok就没有意义了。噗...,讲了一大通不知说明白了没