最终 var 更改值 JAVA

final var changes value JAVA

我不明白为什么我将 HEIGHT 和 WEIGHT 初始化为 32,在 Window() 中没问题,但在内部 class GamePanel 中它的值为 1 和 2,顺便说一句,SCALE 是 20在 Window()

public class Window extends JFrame {
    private final int SCALE;
    private final int WIDTH;
    private final int HEIGHT;

    public Window()
    {
        super("Snake");
        SCALE=20;
        WIDTH=32;
        HEIGHT=32;
        setSize(new Dimension(SCALE*WIDTH,SCALE*HEIGHT));
        setLocation(getWidth()/2,0);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        GamePanel gamePanel = new GamePanel();
        setContentPane(gamePanel);
        setVisible(true);
    }

    private class GamePanel extends JPanel {

        @Override
        public void paint(Graphics g) {
            g.setColor(Color.BLACK);
            g.fillRect(0,0,getWidth(),getHeight());
            drawGrid(g);
            System.out.println(SCALE);
            System.out.println(WIDTH);
            System.out.println(HEIGHT);
        }

        public void drawGrid(Graphics g)
        {
            //
        }

    }
}

WIDTH 和 HEIGHT 变量不属于您的 Window class。它们来自 java.awt.Image.ImageObserver 界面。

这里是我提到的界面内容

package java.awt.image;

import java.awt.Image;

public interface ImageObserver {

    public static final int WIDTH = 1;
    public static final int HEIGHT = 2;
    public static final int PROPERTIES = 4;
    public static final int SOMEBITS = 8;
    public static final int FRAMEBITS = 16;
    public static final int ALLBITS = 32;
    public static final int ERROR = 64;
    public static final int ABORT = 128;

    public boolean imageUpdate(Image image, int i, int i1, int i2, int i3, int i4);
}

你什么时候: private class GamePanel 扩展 JPanel

您正在扩展 JPanel,因此您也继承了它的所有 public/protected/package 变量。如果检查所有继承树:

JPanel <- JComponent <- 容器 <- 组件 <- ImageObserver

如果您查看 ImageObserver 源代码,您会发现:

public static final int WIDTH = 1;
public static final int HEIGHT = 2;

因为继承的变量优先于外部class。这就是显示的值。

因此考虑将它们作为参数传递以获得正确的值。