无法从静态上下文java引用非静态变量

时间:2013-12-07 15:19:38

标签: java

我知道这个问题已经被问了很多次,而且我已经阅读了很多答案,但我无法理解如何解决我的问题。这是我的代码:

public class Circle
{
    public int diameter;
    public int xPosition;
    public int yPosition;
    public String color;


    public Circle()
    {
        diameter = 30;
        xPosition = 20;
        yPosition = 60;
        color = "blue";
    }

    public void toString()
    {
        System.out.println("The diameter of the circle is " + Circle.diameter);
        System.out.println("The x position of the circle is " + Circle.xPosition);
        System.out.println("The y position of the circle is " + Circle.yPosition);
        System.out.println("The colour of the circle is " + Circle.color);
    }


   public static void main(String[] args)
   {
        Circle c1 = new Circle();
        c1.toString();

   }

}

我最初通过更改来解决问题:

public class Circle
{
    public int diameter;
    public int xPosition;
    public int yPosition;
    public String color;
}

public class Circle
{
    public static int diameter;
    public static int xPosition;
    public static int yPosition;
    public static String color;
}

虽然这确实有效,但我觉得这不是一个好方法。我已经阅读了一些关于实例变量的内容,但我不知道该怎么做。

感谢。

2 个答案:

答案 0 :(得分:7)

问题在于toString()功能:

    System.out.println("The diameter of the circle is " + Circle.diameter);
    System.out.println("The x position of the circle is " + Circle.xPosition);
    System.out.println("The y position of the circle is " + Circle.yPosition);
    System.out.println("The colour of the circle is " + Circle.color);

您正在引用带有Class引用的非静态变量。只需将Circle替换为this即可。看看Understanding Instance and Class member教程

修改

  

奇怪的是,它不会让我使用名称toString()因为   “Circle中的toString()不能覆盖对象中的toString()”。有用   除了任何其他名称

是的,因为toString()方法是在Object类中声明的,它是所有java类的超类。此方法的返回类型为String,而您使用的是void。因此,您必须将返回类型更改为String或将函数名称更改为其他任何内容。

答案 1 :(得分:0)

由于静态变量和方法是连接到类本身而不是它的实例 所以他们使用类名调用:

=============================================== =================================

class ABC{
public static int a;

public void A()
{
   System.out.println("The value of a is: "+a);
}

public class test
{
   ABC.a = 10;
   ABC.A();
}

您无需将变量更改为静态变量。

只需使用this运算符调用变量即可。