黑马程序员技术交流社区
标题:
无法引用非静态变量的问题?
[打印本页]
作者:
高鑫
时间:
2012-4-29 23:13
标题:
无法引用非静态变量的问题?
class Person
{
String name;
static String country="CN";
public static void show()
{
System.out.println("name="+name+","+"country="+country);
}
}
class StaticDemo
{
public static void main(String[] args)
{ Person p=new Person();
p.show();
System.out.println(Person.country);
}
}
复制代码
代码中的p.show()为什么无法引用name,这里的对象已经生成了啊,即使name没有值也应该显示null啊?为什?哪的问题?
作者:
马浩
时间:
2012-4-29 23:24
class Person
{
String name;//
非静态变量不能被静态方法访问
static String country="CN";
public static void show()//
静态方法不能访问非静态变量
{
System.out.println("name="+name+","+"country="+country);
}
}
class StaticDemo
{
public static void main(String[] args)
{ Person p=new Person();
p.show();
System.out.println(Person.country);
}
}
作者:
根号5
时间:
2012-4-29 23:49
静态方法不能访问非静态变量,而非静态方法既可以访问静态变量又可以访问非静态变量。
class Person
{
String name;//
把此处的代码改为static String name;这样就可以了
static String country="CN";
public static void show()
{
System.out.println("name="+name+","+"country="+country);
}
}
class StaticDemo
{
public static void main(String[] args)
{ Person p=new Person();
p.show();
System.out.println(Person.country);
}
}
作者:
杨威
时间:
2012-4-30 03:25
class Person
{
String name;
static String country="CN";
public static void show()
{
System.out.println("name="+name+","+"country="+country);
}
}
class StaticDemo
{
public static void main(String[] args)
{ Person p=new Person();
p.show();
System.out.println(Person.country);
}
}
复制代码
上面两位兄弟已经说明了错误的地方及改正方法了。但也只是针对程序本身,从理论实际上说不应该static修饰,因为name是特有的,因为每个人的名字是不同的。
但我感觉针对你的这个程序你应该知道上面的语句String name;前加static修饰后就没问题了。你
的迷惑之处在于为什么要加static修饰,你认为你已经建立了Person对象,调用应该可以的。从表面上看你是想建立Person对象后,属性name进堆,初始化为null,country进方法区赋值CN,然后用对象调用show()方法,你认为应该输出name为null。(个人揣测的)
原因就在于编译检查语法错误,show()方法是静态的,不能访问非静态的成员,在编译时期就已经出现问题。即便你的主函数里没有
任何语句编译还是会失败的。
作者:
张小庆
时间:
2012-4-30 07:03
对啊,你的show方法是静态的,是不能访问非静态的name的
作者:
永恒之翼网络
时间:
2012-4-30 14:06
01.class Person
02.{
03. String name;//没有用static修饰,非静态变量不能被静态方法访问 ,原因是在内存中静态方法优先于对象加载,也就是说static void show()在内存中存在的时候,还没有p这个对象,那怎么能调用p对象中的name成员变量呢?如果改成static修饰,那么name成员变量是所以Person类实例对象的共享数据。它和static void show()是随着类加载而加载在内存中的,所以可以被show方法调用。
04. static String country="CN";
05. public static void show()
06. {
07. System.out.println("name="+name+","+"country="+country);
08. }
09.
10.}
11.class StaticDemo
12.{
13. public static void main(String[] args)
14. { Person p=new Person();
15. p.show();
16. System.out.println(Person.country);
17. }
18.
19.}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2