黑马程序员技术交流社区

标题: 静态方法为什么不能访问类中的非静态成员 [打印本页]

作者: 小路飞    时间: 2013-3-9 17:03
标题: 静态方法为什么不能访问类中的非静态成员
本帖最后由 侯国奇 于 2013-3-10 07:58 编辑

难道是因为静态随着类的加载而优先于对象存在的缘故?是否还有其他原因?求详解,谢了!
作者: HM张勇    时间: 2013-3-9 17:12
静态方法只能访问静态的属性,静态方法中访问非静态方法,只能通过实例化当前类。用当前类调用该非静态方法。非静态的变量是依赖于对象存在的,对象必须实例化之后,它的变量才会在内存中存在。而静态成员不依赖于对象存在,即使是类所属的对象不存在,也可以被访问,它对整个进程而言是全局的。因此,在静态方法内部是不可以直接访问非静态成员的。
作者: 孙宁    时间: 2013-3-9 17:29
静态函数随着类的加载而加载,优先于对象存在于内存中,而非静态成员是随着对象存储的,需要创建对象后才能使用,非静态成员不存在的时候类的静态方法就已经存在了,所以静态方法去访问一个内存中不存在的就会出错了
作者: 傅宇    时间: 2013-3-9 17:38
类的静态成员(变量和方法)属于类本身,在类加载的时候就会分配到内存(方法区),可以通过类名.变量名(类名.方法名)直接访问;非静态成员(变量和方法)属于类的对象,只有在类的对象产生(即创建类的实例)时才会分配内存,然后通过类的对象(实例)去访问。

在一个类的静态成员中去访问其非静态成员之所以会出错是因为在类的非静态成员不存在的时候类的静态成员就已经存在了,访问一个内存中不存在的东西当然会出错!!!

作者: 李洪因    时间: 2013-3-9 17:45
因为静态是随着类的加载而加载的  也就是说类只要存在了,那么静态就存在了,而静态是优先于对象存在的 ,你要访问非静态的东西,也就是非静态的成员(包括变量和方法),非静态的东西还没存在你怎么访问的到呢

  static的成员 是在类加载的时候初始化的 ,jvm的ClassLoader加载,首次主动使用加载;
而 非static的成员是在创建对象的时候,即 new操作的时候才初始化的 ;

先后顺序是,先加载 ,才能初始化,那么 加载的时候初始化static的成员,此时非static还没有初始化,必然不能使用,
而 非 static的成员是在 类加载之后 ,通过new操作符创建对象的时候初始化的,此时static已经初始化 ,即已经分配内存空间,所以可以访问
作者: HM李超    时间: 2013-3-9 17:51
        static修饰的成员是在类加载的时候初始化的,而非static的成员是在创建对象的时候,即new 操作的时候才初始化的。
        先后顺序是先加载,才能初始化,那么加载的时候初始化static的成员,此时非static的成员还没有被加载必然不能使用,而非static的成员是在类加载之后,通过new操作符创建对象的时候初始化,此时static 已经分配内存空间,所以非静态成员可以访问静态成员!
      简单点说:静态成员属于类,不需要生成对象就存在了.而非静态需要生成对象才产生.,所以静态成员不能直接访问.  

static的特点:
       1.随着类的加载而加载;
                也就是说,静态随着类的消失而消失,说明它的生命周期最长
       2.优先于对象存在;
                明确一点:静态先存在,对象后存在
       3.被所有对象共享;
       4.可以直接被类名所调用;

静态变量和类变量的区别:
       1,存放的位置:
                类变量随着类的加载而存在于方法区中;
                实例变量随着对象的建立存在于堆内存中
      2,生命周期:
                类变量的生命周期最长,随着类的消失而消失
                实例变量的生命周期随着对象的消失而消失

静态使用注意事项:
      1,静态方法只能访问静态成员
                非静态既可以访问静态也可以访问非静态
      2,静态方法中不可以使用this,super关键字
                因为静态优先于对象存在,所以金泰方法中不可以出现this

静态的利弊
   利:对对象的共享数据进行单独空间的存储,节省空间,没有必要没一个对象中都存储一份
         可以直接被类名所调用(类.静态成员)
   弊:生命周期过长,访问出现局限性(只能访问静态)
作者: amen0205    时间: 2013-3-9 20:25
你答对了   
作者: 小路飞    时间: 2013-3-10 07:58
李洪因 发表于 2013-3-9 17:45
因为静态是随着类的加载而加载的  也就是说类只要存在了,那么静态就存在了,而静态是优先于对象存在的 , ...

说的挺详细的,看来我的理解没错,还是谢了




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