Не могу создать несколько экземпляров класса в Java

Я пытаюсь создать несколько символов (квадратов) на экране, которые перемещаются случайным образом. Я уже создал класс CharMove, который создает квадрат и перемещает его случайным образом на экране. Однако я попытался создать несколько экземпляров этого класса в отдельном Java-файле, и был создан только 1 экземпляр. Что случилось?

Класс CharMove:

public class CharMove extends JPanel {
    public static int x = 250;
    public static int y = 250;

    public void paint(Graphics g) {
        Graphics pane = (Graphics2D) g;
        pane.setColor(Color.blue);
        pane.fillRect(x, y, 10, 10); 

    }

    public static void movement(int x, int y, JFrame frame) { 
        CharMove.x = x; 
                CharMove.y = y;
        while (true) {
            try {
                TimeUnit.SECONDS.sleep(1);
                CharMove.x = Getx(CharMove.x,frame); 
                CharMove.y = Gety(CharMove.y,frame);
                frame.repaint();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static int Getx(int a, JFrame frame) { 
        Random rn = new Random();
        int xnum = rn.nextInt(10)-5; 
        a += xnum; 
        System.out.println("x:" + a); 
        return a;
    } 
    public static int Gety(int b, JFrame frame){ 
        Random rn = new Random();
        int ynum = rn.nextInt(10)-5; 
        b += ynum; 
        System.out.println("y:" + b); 
        return b;
    } 
}

Мировой уровень

public static void main(String[] args) {
    JFrame game = new JFrame();
    game.setTitle("Matrix");
    game.setSize(500, 500);;
    game.getContentPane().setBackground(Color.white);
    game.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    game.setVisible(true);  
    CharMove char1 = new CharMove(); 
    CharMove char2 = new CharMove();
    game.add(char1);   
    game.add(char2);
    char1.movement(100,100,game); 
    char2.movement(250,250,game);
}

3 ответа

Решение

Однако я попытался создать несколько экземпляров этого класса в отдельном Java-файле, и был создан только 1 экземпляр.

Нет, вы создаете несколько экземпляров. Однако это не имеет никакого значения, потому что у вас нет состояния для каждого экземпляра. Ваши единственные поля это:

public static int x = 250;
public static int y = 250;

Это статические поля, что означает, что они не связаны с каким-либо конкретным экземпляром класса. Вы, вероятно, просто хотите удалить static Ключевое слово из объявлений. (Я бы также сделал поля приватными и предоставил бы общедоступные методы получения / установки, если это необходимо, но это другой вопрос.)

Вам также нужно будет превратить ваши статические методы в методы экземпляров - потому что они предназначены для воздействия на отдельные экземпляры, верно? В принципе, я думаю, что вы должны пересмотреть значение static через любую книгу / учебник, который вы используете для изучения Java. (Также пересмотрите соглашения об именах Java.)

Ваши x и y не являются переменными экземпляра, они являются статическими переменными. Таким образом, каждый экземпляр CharMove имеет одни и те же х и у

Попробуй это,

public class CharMove extends JPanel {
    private int x = 250;
    private int y = 250;

    public void paint(Graphics g) {
        Graphics pane = (Graphics2D) g;
        pane.setColor(Color.blue);
        pane.fillRect(x, y, 10, 10); 

    }

    public void movement(JFrame frame) { 
        while (true) {
            try {
                TimeUnit.SECONDS.sleep(1);
                this.x = CharMove.Getx(this.x,frame); 
                this.y = CharMove.Gety(this.y,frame);
                frame.repaint();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static int Getx(int a, JFrame frame) { 
        Random rn = new Random();
        int xnum = rn.nextInt(10)-5; 
        a += xnum; 
        System.out.println("x:" + a); 
        return a;
    } 
    public static int Gety(int b, JFrame frame){ 
        Random rn = new Random();
        int ynum = rn.nextInt(10)-5; 
        b += ynum; 
        System.out.println("y:" + b); 
        return b;
    } 
}

а также

public static void main(String[] args) {
    JFrame game = new JFrame();
    game.setTitle("Matrix");
    game.setSize(500, 500);;
    game.getContentPane().setBackground(Color.white);
    game.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    game.setVisible(true);  
    CharMove char1 = new CharMove(); 
    CharMove char2 = new CharMove();
    game.add(char1);   
    game.add(char2);
    char1.movement(game); 
    char2.movement(game)
}

Вы не должны использовать public static void movement() так как это не метод экземпляра (как следует из названия, он статический). На самом деле, ваш код не должен быть в состоянии скомпилировать в char1.movement(100,100,game);, Должен объявить это как метод экземпляра public void movement() вместо. На самом деле для остальной части метода, вы можете сделать это тоже так. Статическая работа без экземпляра класса.

Другие вопросы по тегам