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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© HM周磊 中级黑马   /  2013-3-9 22:29  /  2097 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 HM周磊 于 2013-3-10 12:14 编辑

毕老师不是讲静态方法中不可以写this, super关键字吗。如果我一定要在静态方法中写this关键字呢。比如

class Person
{
String name;//成员变量,实例变量。
static String country = "CN";//静态的成员变量,类变量。
public static void show()
{
  System.out.println("::::");
  this.haha();
}
public static void haha()
{}
}
class  StaticDemo
{
public static void main(String[] args)
{
  Person p = new Person();
    p.show();
}
}
这样可以吗???

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 新人鼓励

查看全部评分

9 个回复

倒序浏览
类加载的时候,静态方法就随着加载了,这个时候还没有对象,this就不存在,好好看看视频,毕老师讲的很清楚

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
不行,看代码注释。
class Person
{
String name;//
static String country = "CN";
public static void show()
{
   System.out.println("::::");
   this.haha();//无法从静态方法中引用非静态。
}
public static void haha()
{}
}
class  StaticDemo
{
public static void main(String[] args)
{
   Person p = new Person();
     p.show();
}
}
回复 使用道具 举报
如果那样编译不通过。。。。
不能加this的原因是,我们在用到类中内容的时候,类被加载进内存,比如通过类名调用静态函数,
或者创建对象。
类是在创建对象之前,加载进内存的,这时候不存在对象,所以静态函数中this就不知道该指向谁,
所以编译时期就会报错。。。。
回复 使用道具 举报
静态方法在对象创建之前就会被加载到内存,this,super是个引用,哪个对象调用方法就引用哪个对象。 所有会出现一种现象,this的指向是不存在的对象,而静态方法有可能不是被对象调用的,this无从引用,上面代码 this.haha();肯定是错,
第一你要明白为什么明白
静态方法中不可以写this, super关键字,
第二,你就要记住它,这是规则,和篮球规则不一样吗?走步就是走步,既然都说:讲静态方法中不可以写this, super关键字,你还一定要在静态方法中写this关键字,那就是违法规则,编译就不让你通过

回复 使用道具 举报
去厕所前都没人回复,回来刷新下都这么多人了
回复 使用道具 举报
呵呵同学:

public static void show()
{
  System.out.println("::::");
  this.haha();
}

写上this.haha() 是会报错的,,this是代表对象,没有对象就没有任何代表,this这个引用他都没有被初始化过,他怎么能去调用内容呢,,,
此时没有对象,这个静态方法 show()要访问的是对象的.haha(),你连对象都没有,这个.haha()就没在内存中存在过,因为先来后到,静态先在了,那个非静态还没在,我当然不能访问你了

所以;静态方法只能访问静态成员(方法和变量)。

顺便说说静态成员的特点:

  1.随着类的加载而加载

比如: Person类当被你使用到的时候, Person类就进内存了这个Person类一进内存的时候,这个静态的country 就已经存在了,就是说当我这个Person类一加载到内存当中,这个country = "CN"  这个值就已经在内存中开辟好了空间
   也就是说:静态会随着类的消失而消失。说明它的生命周期最长。 Person类只要还在,这个"CN" 就一直在内存当中,类没了那么CN"就在内存中消失了

注意:当我这个Person类加载到内存当中的时候,country就已经在内存里了,name不在内存里,因为只有创建了对象以后,堆内存里才有name

  2.优先于对象存在
明确一点:静态是先存在的。对象是后存在的。

  3.被所有对象所共享
  4.可以直接被类名调用

使用注意:
  静态方法只能访问静态成员
  静态方法中不可以写this,super关键字

回复 使用道具 举报
都是人才啊         你自己运行下就知道行不行了  
回复 使用道具 举报
小路飞 来自手机 中级黑马 2013-3-10 08:18:40
9#
这个我之前也问过了,就是加载进内存的先后顺序的问题啦
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马