黑马程序员技术交流社区

标题: java "静态的方法不能存取“this”所引用的对象。" [打印本页]

作者: 来明坤    时间: 2012-7-6 17:13
标题: java "静态的方法不能存取“this”所引用的对象。"
java "静态的方法不能存取“this”所引用的对象。"是静态的方法不能引用“this”所引用的对象吗?那非静态方法呢?
作者: 田向向    时间: 2012-7-6 17:38
本类中构造函数的引用一定且只能用this   静态的static的引用用类名,非静态的引用用对象
静态方法是跟实例无关的方法,只跟类有关,在类没有实例的时候就可以使用其静态方法。静态方法不能操作非静态变量,因为非静态变量是跟实例相关的,每个实例的非静态变量都不同,而类的静态变量是所有实例共有的。this是跟实例相关的,它就是当前调用该方法的实例的引用,这跟静态方法矛盾。而一般的方法可以操作静态变量,虽然允许这样做,但是不推荐。一般的方法必须由类的实例的引用调用,在没有实例的时候是没法调用的。
静态方法也叫类方法。在类被加载的时候被初始化,可以通过类名和对象名进行调用,在类内部可以直接调用。仅该方法不需要实例化对象,即可调用。
在静态的方法中不能以任何形式引用this,因为this默认的对象引用,静态方法被调用时,this所引用的对象并没有产生,this无所指向.
就是说一个静态的方法不能存在this去指向变量等等,如
public static void fun() {
  this.a = b;    //不能存在this,只能是a = b 而且这个a和b一定要是静态的
}

作者: 梁健生    时间: 2012-7-6 17:40
你问的这个知识,需要考虑static的生命周期问题:
                           1.static修饰的成员变量和成员函数,随着类的存在而存在,类的消失而消失。
                           2.而"this"出现的前提是先建立对象,static修饰的变量和方法存在时,对象
                           还没建立,又怎么能引用其相关元素呢?
                           
   总结一下就是: static修饰的方法只能调用static修饰的变量和函数,而非静态函数可以调用非静态函数和变量也可以调用static修饰的。

  给你举个例子吧!
          就像我们可以知道古代名人事迹,
                   而古代人却根本不可能知道我们现在的名人事迹一样。                     



作者: 黑马-李勇    时间: 2012-7-6 17:47
0601静态使用注意事项:
        1.静态方法只能访问静态成员(变量和方法)
          非静态方法既可以访问静态也可以访问非静态。
        2.静态方法中不可以定义this,super关键字
          因为静态优先于对象存在,所在静态方法中不可以出现this。
        3.主函数是静态的。
作者: 汤密奕    时间: 2012-7-6 19:28
静态只能访问静态,因为在内存中,先开辟空间的位置是数据共享区,对象实例存在堆空间中,类一旦加载,静态数据共享区先加载进来,此时静态数据只能访问静态,非静态存储在堆中,还未开辟堆空间,所以根本访问不到。

非静态当然既能访问静态也能访问非静态,理解了类加载进内存的原理,就很好理解了。
作者: 邱泉    时间: 2012-7-6 19:57
因为静态方法可以直接被类名调用,也就是说当类被加载进内存,并且还没有创建任何对象的情况下就可以用类名直接调用此静态方法。
因为此时内存中并没有创建对象,所以不能用this来引用这个静态方法,因为this代表一个明确的对象。
而非静态方法只能使用对象名调用,所以使用非静态方法的时候已经创建了一个的对象,所以可以使用this调用这个方法,此时this指向当前对象。

必须明确的是:静态方法优先于对象存在。
结论:静态方法中不能出现this,super关键字。而非静态方法中可以。





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