Не могу создать несколько экземпляров класса в 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()
вместо. На самом деле для остальной части метода, вы можете сделать это тоже так. Статическая работа без экземпляра класса.