Why does it wants the method to be static?

I am building my first game, relying heavily on various tutorials and guides on the Java website, and I have come across a problem. In my game engine, I want to call the Player.update() method, but it says it has to be static (cannot make static reference to non-static method) However, the method calling it is not static. Can anyone tell me why it requires it to be static? It doesn't require the only other method in Update to be static.

package Main;

import java.awt.*;
import java.awt.RenderingHints;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;

import javax.swing.JPanel;

import Graphics.Assets;
import Sprites.Player;

@SuppressWarnings("serial")
public class Game extends JPanel
implements Runnable, KeyListener{

//TEST CODE
private int x = 0;
private int y = 0;
private int dY = 1;
private int dX = 1;

public void moveBall() {
    x = x + dX;
    y = y + dY;

    if(x > WIDTH - 28) {
        dX = -1;
    }
    if(y > HEIGHT) {
        dY = -1;
    }
    if(x < 0) {
        dX = 1;
    }
    if(y < 10) {
        dY = 1;
    }
}

//dimensions
public static final int WIDTH = 400;
public static final int HEIGHT = 300;
public static final int SCALE = 2;

//game thread
private Thread thread;
private boolean running;
private int FPS = 60;
private long targetTime = 1000 / FPS;

//image
private BufferedImage image;
private Graphics2D g;

//Constructor
public Game () {
    super();
    setPreferredSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));
    setFocusable(true);
    requestFocus();
}

public void addNotify() {
    super.addNotify();
    if(thread == null) {
        thread = new Thread(this);
        addKeyListener(this);
        thread.start();
    }
}

private void init () {
    image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);

    g = (Graphics2D)image.getGraphics();

    running = true;
    Assets.init();
}

public void run() {

    init();

    long start;
    long elapsed;
    long wait;

    //game loop
    while(running){
    start = System.nanoTime();

    update();
    draw(g);
    drawToScreen();

    elapsed = System.nanoTime() - start;

    wait = targetTime - elapsed / 1000000;
    if(wait < 0) wait= 5;

    try {
        Thread.sleep(wait);
    }
    catch(Exception e) {
        e.printStackTrace();
    }
    }
}

private void update() {
    moveBall();
    Player.update();
}
private void draw(Graphics g2d) {
    super.paint(g2d);
    Graphics2D g = (Graphics2D) g2d;
    g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
    g.drawString("Hello", x, y);
}
private void drawToScreen() {
    Graphics g2 = getGraphics();
    g2.drawImage(image, 0, 0, WIDTH * SCALE, HEIGHT * SCALE, null);
    g2.dispose();
}



public void keyPressed(KeyEvent e){}

public void keyReleased(KeyEvent e){}

public void keyTyped(KeyEvent e){}

}

That is the main code. Now for the Player class.

package Sprites;

import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import Main.Game;
import Graphics.*;


public class Player extends Creature implements KeyListener{

private int dir;

public Player(Game game, float x, float y) {
    super(game, x, y, Creature.DEFAULT_CREATURE_WIDTH, Creature.DEFAULT_CREATURE_HEIGHT);
    dir = 0;
}

public void update() {
    getInput();
    move();

}

private void getInput() {
    xMove = dir;
}

public void render(Graphics g) {
    g.drawImage(Assets.player, (int) (x), (int) (y), width, height, null);
}

public void keyPressed(KeyEvent e) {

    if(e.getKeyCode()  == KeyEvent.VK_A)
        dir = -1;
    if(e.getKeyCode() == KeyEvent.VK_D)
        dir = 1;
    else dir = 0;
}

public void keyReleased(KeyEvent e) {

    if(e.getKeyCode()  == KeyEvent.VK_A)
        dir = 0;
    if(e.getKeyCode() == KeyEvent.VK_D)
        dir = 0;
}

public void keyTyped(KeyEvent e) {  
}

}

Jon Skeet
people
quotationmark

Look at your method call:

Player.update();

That's calling it as if it's a static method - on the type, rather than on an instance of the type. Which player do you want to update? You don't seem to have any instances of it... you should almost certainly be creating an instance of Player within Game, and saving a reference to it.

people

See more on this question at Stackoverflow