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类放外边就没事

解决方案 »

  1.   

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

  2.   

    你具体是放哪里了 不会是放到main里了吧
      

  3.   

    因为main方法是静态方法,如果要调用自己类的方法或变量,
    若该类已经声明,则可以通过该类调用该方法或变量,
    否则就需要将调用的方法或变量用static修饰所以如果Person类放到主类Person2里之后编译,Person类需要用static修饰
      

  4.   

    神马意思,LZ是说把Person作为Person2的内部类时编译报错的吧原因如3L说的,如果是作为内部类,因为main方法是static的,所以内部类必须是static才能直接new,否则需要外部类实例才能new,如 Persone a = new Person2().new Person(); 同样的,b,c一样,如果b,c的外部类实例需要一样的话,可以先声明外部类实例,然后再调用该实例的new内部类就可以了其实可以把内部类看成一个特殊的成员,那么它的访问限制跟成员变量一样,LZ好好体会吧
      

  5.   

    回复于:2012-07-30 18:21:41静态函数不能引用非静态变量 因为静态函数的调用不用非得new一个对象 所以静态函数运行的时候非静态变量没有创建 
      

  6.   

    引用静态的不是用对象,而是类,所以没有this和super之说。
      

  7.   

    我用eclipse运行程序通过了,也能输出结果、、、