黑马程序员技术交流社区

标题: 静态方法的问题? [打印本页]

作者: 程宏志    时间: 2012-11-19 23:59
标题: 静态方法的问题?
今天碰到一个很纠结的问题?
  静态方法中是否可以处理非静态属性?
  这个答案很有争议,大家都知道静态方法中是不能调用实例属性的,我们往往强调的是调用,可是处理和调用的概念感觉有很大的出入,我的理解是通过对象来调用实例属性是否也是一种处理呢?
   大家给点意见,帮忙判断下!
作者: 徐军涛    时间: 2012-11-20 00:33
对于静态我们一般只关心:静态成员变量、静态方法
因为声明周期的问题,静态是有局限性的:静态方法只能调用静态成员
举个例子:
假定,有一个求圆面积的静态方法,我们把半径 PI 声明成static final
半径是未知的,所以就需要传入参数,这个参数就是非静态的
从参数来看,静态方法,是可以处理非静态的属性的。
但是,调用的时,只能是静态调用静态
作者: 刘菲    时间: 2012-11-20 08:24
本帖最后由 刘菲 于 2012-11-20 10:10 编辑

楼主你好,对于你提出的问题我是这样理解的。
1.我们通常强调静态方法只能访问静态成员(方法和变量)。
这里所说的访问其实也不光是指调用。
2.静态方法虽然不能调用非静态成员,但它却能处理非静态成员。
  主函数就是个很好的例子,我们通常在主函数内可以处理静态的,也可以处理非静态的。
作者: 初艳春    时间: 2012-11-20 09:20
从内存方面解释:静态方法在编译器在编译时会为其和其变量分配内存空间,如果引用了一个非静态的变量,那么在非静态变量作用结束后,这个变量就会消失,那么为它分配的那块内存就成了无用内存,但却无法回收,这样就造成了内存泄露,这样显然不合理。所以java中规定,静态方法不能直接调用非静态的方法或属性。
作者: 陈军    时间: 2012-11-20 10:43
我的理解: 程序处理很多种,调用只算是一种。  
  一般java中静态方法不能处理非静态成员,是因为非static成员属于对象,

而我们在类静态方法内部设计的时候,一般还没有对象,所以不能处理非static成员。

如下面这个例子:
public class Test9 {

         int i=0;
        public static void main(String[] args) {
          

        }
        public static void add(){
                Test9 t=new Test9();
                t.i =6;//有了对象才能处理
        }

}

所以LZ。你别纠结这种问题了。。。文字游戏不好玩的。






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2