日期:2014-05-20  浏览次数:20613 次

静态函数无法引用非静态变量的问题,初学者,帮帮忙
class Person
{
String name ;
int age ;
public Person()
{
System.out.println("this.name,this.age") ;
}
public Person(String nam, int ag)
{
name = nam ;
age = ag ;
System.out.println("this.name ,this.age") ;
}
public Person(String nam)
{
name = nam ;
age = 22 ;
System.out.println(" this.name ,this.age") ;
}
public String talk()
{
return "我是" + name + "今年" + age + "岁了!!" ;
}

}
public class Person2
{  
public static void main(String agrs [])
{
Person a = new Person() ;
System.out.println(a) ;
Person b = new Person("张三") ;
Person c = new Person("张三",30) ;
System.out.println(a.talk()) ;
System.out.println(b.talk()) ;
System.out.println(c.talk()) ;
}
}

为什么把Person类放到主类Person2里之后编译时提醒:无法从静态上下文中引用非静态变量 this ,而把Person类放外边就没事

------解决方案--------------------
静态函数不能引用非静态变量 因为静态函数的调用不用非得new一个对象 所以静态函数运行的时候非静态变量没有创建


------解决方案--------------------
因为main方法是静态方法,如果要调用自己类的方法或变量,
若该类已经声明,则可以通过该类调用该方法或变量,
否则就需要将调用的方法或变量用static修饰

所以如果Person类放到主类Person2里之后编译,Person类需要用static修饰
------解决方案--------------------
神马意思,LZ是说把Person作为Person2的内部类时编译报错的吧

原因如3L说的,如果是作为内部类,因为main方法是static的,所以内部类必须是static才能直接new,否则需要外部类实例才能new,如 Persone a = new Person2().new Person(); 同样的,b,c一样,如果b,c的外部类实例需要一样的话,可以先声明外部类实例,然后再调用该实例的new内部类就可以了

其实可以把内部类看成一个特殊的成员,那么它的访问限制跟成员变量一样,LZ好好体会吧
------解决方案--------------------
回复于:2012-07-30 18:21:41静态函数不能引用非静态变量 因为静态函数的调用不用非得new一个对象 所以静态函数运行的时候非静态变量没有创建

 

------解决方案--------------------
简单点说就是,静态函数是单独存在的,非静态变量是类实例化有了对象之后才有的。
所以静态函数不能引用非静态变量,因为那个时候连对象都没有
------解决方案--------------------
引用静态的不是用对象,而是类,所以没有this和super之说。