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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 惜别的海岸 中级黑马   /  2013-5-17 17:13  /  1568 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 惜别的海岸 于 2013-5-18 12:16 编辑

视频教程中说,静态成员不能引用非静态成员的原因是没有创建对象,所有成员变量也没有分配内存,所以静态成员引用不到。在下面这个程序中,主函数中已经创建了一个p对象,那么p对象的成员变量name已经在内存中存在,那么接下来调用静态函数时,静态函数应该可以访问到非静态成员name。但是程序报错了。说无法引用非静态变量name。谁能解释一下吗?
  

class Person
{
String name;//成员变量,实例变量。
static String country = "CN";//静态的成员变量,类变量。
public static void show()
{
  
  System.out.println(name);//这行发生错误,说无法引用非静态变量name。
  
}
public void haha()
{}
}
class  StaticDemo
{
public static void main(String[] args)
{
  Person p = new Person();
  Person.show();
}
}

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

4 个回复

倒序浏览
楼主的想法要稍微转变下才行...
对象创建了,非静态成员变量也确实存在了
但是如果没创建对象,静态函数是不是就不能使用非静态成员变量。因为这样就规定静态函数中不能使用非静态变量。这是一种规定啊!!!
楼主的意思是,我现在创建了对象,我就可以去该静态函数中的代码,使其可以使用非静态成员变量。打个不是特别贴切的比喻:
电视机没打开之前,我们不清楚放什么节目,也不能对电视机里面的东西做些什么。而楼主的想法好像就是只要电视机打开了,里面出现了画面,例如有好吃的东西,楼主就可以拿出来吃似的。

表达能力啊{:soso_e135:}感觉讲不明白了。
总之一句话:记住在静态函数中不能引用非静态变量。

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
System.out.println(name);//这行发生错误,说无法引用非静态变量name。
可以这么想,不知道对不对,这行错误应该是编译时候的错误,也就是没有创建对象的时候,所以根据规则,静态方法优先于对象存在了,既然这时候对象不存在,name前隐式的this也就不成立了

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
哦,谢谢大家的回答,还是把先把它当成规定。
回复 使用道具 举报
本帖最后由 8047107 于 2013-5-18 14:50 编辑

好像懂了 无论什么时候 静态方法都只能访问静态成员~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马