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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 程宏志 中级黑马   /  2012-11-19 23:59  /  1202 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

今天碰到一个很纠结的问题?
  静态方法中是否可以处理非静态属性?
  这个答案很有争议,大家都知道静态方法中是不能调用实例属性的,我们往往强调的是调用,可是处理和调用的概念感觉有很大的出入,我的理解是通过对象来调用实例属性是否也是一种处理呢?
   大家给点意见,帮忙判断下!

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
对于静态我们一般只关心:静态成员变量、静态方法
因为声明周期的问题,静态是有局限性的:静态方法只能调用静态成员
举个例子:
假定,有一个求圆面积的静态方法,我们把半径 PI 声明成static final
半径是未知的,所以就需要传入参数,这个参数就是非静态的
从参数来看,静态方法,是可以处理非静态的属性的。
但是,调用的时,只能是静态调用静态

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
本帖最后由 刘菲 于 2012-11-20 10:10 编辑

楼主你好,对于你提出的问题我是这样理解的。
1.我们通常强调静态方法只能访问静态成员(方法和变量)。
这里所说的访问其实也不光是指调用。
2.静态方法虽然不能调用非静态成员,但它却能处理非静态成员。
  主函数就是个很好的例子,我们通常在主函数内可以处理静态的,也可以处理非静态的。
回复 使用道具 举报
从内存方面解释:静态方法在编译器在编译时会为其和其变量分配内存空间,如果引用了一个非静态的变量,那么在非静态变量作用结束后,这个变量就会消失,那么为它分配的那块内存就成了无用内存,但却无法回收,这样就造成了内存泄露,这样显然不合理。所以java中规定,静态方法不能直接调用非静态的方法或属性。
回复 使用道具 举报
我的理解: 程序处理很多种,调用只算是一种。  
  一般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。你别纠结这种问题了。。。文字游戏不好玩的。

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