1

当我尝试编译此代码时,我收到一条错误消息“Rectangle.java:35: error: non-static variable this cannot be referenced from a static context this.inDemand = inDemand;”我通过将 inDemand 参数重命名为isInDemand 并在 setInDemand 方法中从 inDemand 中删除 this 前缀。我只是想了解为什么我最初所做的事情没有奏效。

代码如下:

public class Rectangle extends Polygon
{
    private double height;
    private static boolean inDemand = false;
    private double width;
    public Rectangle()
    {
        this(1,1,"None");
    }
    public Rectangle(double height, double width, String id)
    {
        super(id);
        this.height = height;
        this.width = width;
    }

    public double getArea()
    {
        return this.height*this.width;
    }

    public double getTotal()
    {
        if(inDemand == true)
        {
            return 2 * this.getArea();
        }
        else
        {
            return this.getArea();
        }
    }
    public static void setInDemand(boolean inDemand)
    {
        this.inDemand = inDemand;
    }




    public static void main(String[] args)
    {

        Rectangle rect = new Rectangle();
        rect.setInDemand(true);
        System.out.println(rect.getTotal());
    }


}
4

4 回答 4

2
 public static void setInDemand(boolean inDemand)
    {
        this.inDemand = inDemand;
    }

this在方法中是不允许的,static因为它引用了当前对象。假设您以静态方式调用此方法而不创建实例时的场景。这就是我的意思:

Rectangle.setInDemand(true);

是对此方法的合法调用,但不是在实例上而是使用类名。

于 2013-10-04T05:31:57.040 回答
1

inDemand被声明为一个static字段。具有该声明的任何字段或方法只能在静态上下文中引用。

最简单的做法是static从该布尔值和方法签名中删除,因为它的用法表明它是 object 的属性Rectangle

static且仅当它不需要是类本身的属性,但包含有关类的信息(即Integer.MAX_VALUE)或可用于生成该对象的实例(即Integer.valueOf(2))。

于 2013-10-04T05:30:01.693 回答
1

this 指的是当前正在执行的对象。静态方法不是对象的一部分,它们是类的一部分。所以你不能使用静态方法引用当前正在执行的对象

删除字段的静态修饰符

于 2013-10-04T05:30:13.163 回答
1

你不能这样做 this.inDemand 因为意味着对当前对象进行操作。由于它是静态的,因此您没有实例化对象。

于 2013-10-04T05:30:43.553 回答