黑马程序员技术交流社区

标题: 帮忙看一下代码的问题 [打印本页]

作者: 惜别的海岸    时间: 2013-5-17 17:13
标题: 帮忙看一下代码的问题
本帖最后由 惜别的海岸 于 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();
}
}

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

表达能力啊{:soso_e135:}感觉讲不明白了。
总之一句话:记住在静态函数中不能引用非静态变量。
作者: 薛淑凯    时间: 2013-5-17 18:06
System.out.println(name);//这行发生错误,说无法引用非静态变量name。
可以这么想,不知道对不对,这行错误应该是编译时候的错误,也就是没有创建对象的时候,所以根据规则,静态方法优先于对象存在了,既然这时候对象不存在,name前隐式的this也就不成立了
作者: 惜别的海岸    时间: 2013-5-18 12:15
哦,谢谢大家的回答,还是把先把它当成规定。
作者: 8047107    时间: 2013-5-18 14:48
本帖最后由 8047107 于 2013-5-18 14:50 编辑

好像懂了 无论什么时候 静态方法都只能访问静态成员~





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