修复静态方法问题
Fix Static Method issue
所以我对 Java 比较陌生,但我遇到了静态内容问题。第一,我不太确定静态的东西是什么,但我知道这很烦人,第二,我有这个 "Pong" 的小游戏,我一直在练习它,我正在尝试获得一个记分牌上升,但显示 Cannot make a static reference to the non-static method getScore()
下面是我的代码,任何建议都会有所帮助,因为我还是个菜鸟。
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class PongGame extends JComponent implements ActionListener, MouseMotionListener{
private int ballX = 385;
private int ballY = 285;
private int paddleOpX = 0;
private int paddleX = 0;
private int ballYSpeed = 1;
private int ballXSpeed = 1;
public Integer score = 0;
private static Timer t = null;
public static void main(String[] args){
JLabel scoreBoard = new JLabel(getScore().toString());
JFrame window = new JFrame("Hit the Damn Ball");
window.setLayout(new BorderLayout());
window.getContentPane().setBackground(new Color(0, 0, 0));
PongGame game = new PongGame();
window.add(game);
window.pack();
window.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
window.setLocationRelativeTo(null);
window.setVisible(true);
t = new Timer(5, game);
t.start();
window.addMouseMotionListener(game);
}
//set the size of window
public Dimension getPreferredSize(){
return new Dimension(800, 600);
}
@Override
protected void paintComponent(Graphics g){
g.setColor(new Color(110, 65, 13));
g.fillRect(paddleX, 510, 150, 15);
g.setColor(new Color(90, 0,0));
g.fillRect(paddleOpX, 90, 150, 15);
g.setColor(Color.WHITE);
g.fillOval(ballX, ballY, 30, 30);
}
@Override
public void actionPerformed(ActionEvent e) {
paddleOpX = (ballX+5);
ballX +=ballXSpeed;
ballY +=ballYSpeed;
if(ballX >= paddleX-30 && ballX <= (paddleX + 150) && ballY >= 480){
ballYSpeed = -ballYSpeed;
//ballYSpeed = -1;
setScore();
}
if(ballX >= paddleX-30 && ballX <= (paddleX + 150) && ballY > 480){
ballYSpeed = -ballYSpeed;
//ballYSpeed = 1;
setScore();
}
if(ballX >= paddleOpX-30 && ballX <=(paddleOpX + 150) && ballY <= 106){
ballYSpeed = ballYSpeed*-1;
}
if(ballY > 570){
ballXSpeed = 0;
ballYSpeed = 0;
t.stop();
System.out.println(score);
}
if(ballX >= 770){
ballXSpeed = -ballXSpeed;
//ballXSpeed = -1;
}
if(ballY <= 0){
ballXSpeed = 0;
ballYSpeed = 0;
t.stop();
System.out.println(score);
//ballYSpeed = 1;
}
if(ballX <= 0){
ballXSpeed = ballXSpeed*-1;
//ballXSpeed = 1;
}
repaint();
}
@Override
public void mouseDragged(MouseEvent e) {
}
@Override
public void mouseMoved(MouseEvent e) {
paddleX = e.getX()-75;
if(ballX >= paddleX-30 && ballX <= (paddleX + 150) && ballY == 480 ){
ballYSpeed = ballYSpeed-1;
ballXSpeed = ballXSpeed < 0 ? -2 : 2;
//ballYSpeed = 1;
}
repaint();
}
private void setScore(){
score++;
}
public Integer getScore(){
return score;
}
}
private void setScore()
方法不是 static
方法,您正试图从静态方法调用此方法,您必须将此方法设置为静态方法或使用以下方法调用此方法对象.
要创建 static
方法,您必须在方法语法中使用 static
修饰符。
private static void setScore(){
score++;
}
或
您必须创建 PongGame
class 的实例,然后调用该方法。
PongGame pg = new PongGame();
JLabel scoreBoard = new JLabel(pg.getScore().toString());
实例方法 getScore()
需要一个对象来调用该方法,因为它不是 static
,但您还没有。
将PongGame game = new PongGame();
移动到main
的第一行,然后更改
JLabel scoreBoard = new JLabel(getScore().toString());
至
JLabel scoreBoard = new JLabel(game.getScore().toString());
getScore() 需要它是静态的,因为你没有输入 "new",所以如果没有它的实例,它就无法计算。
JLabel scoreBoard = new JLabel(getScore().toString());
需要它,而您还没有将其声明为 "static"。
static 表示它只一次加载到内存中,一劳永逸
(这在某些情况下很有用(比如服务器上的 Web 方法 运行(可能内存不足)))。
简单的解决方案:创建一个实例并使用它。
getScore gs= new getScore()
或将其设为静态并将其用作
getScore.TosTring();
您需要在此之前实例化超类。
方法getScore()
不是static
(因为你没有把它声明为static
),所以它需要一个实例来调用。换句话说,您必须创建 class PongGame
:
的实例
public static void main(String[] args){
PongGame game = PongGame(...);
...
}
然后用它来调用方法:
game.getScore();
注意: static
方法在每个 class 中只存在一次,因此您不需要 class 的实例来称它为。另一方面,非static
方法需要调用一个实例。
所以我对 Java 比较陌生,但我遇到了静态内容问题。第一,我不太确定静态的东西是什么,但我知道这很烦人,第二,我有这个 "Pong" 的小游戏,我一直在练习它,我正在尝试获得一个记分牌上升,但显示 Cannot make a static reference to the non-static method getScore()
下面是我的代码,任何建议都会有所帮助,因为我还是个菜鸟。
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class PongGame extends JComponent implements ActionListener, MouseMotionListener{
private int ballX = 385;
private int ballY = 285;
private int paddleOpX = 0;
private int paddleX = 0;
private int ballYSpeed = 1;
private int ballXSpeed = 1;
public Integer score = 0;
private static Timer t = null;
public static void main(String[] args){
JLabel scoreBoard = new JLabel(getScore().toString());
JFrame window = new JFrame("Hit the Damn Ball");
window.setLayout(new BorderLayout());
window.getContentPane().setBackground(new Color(0, 0, 0));
PongGame game = new PongGame();
window.add(game);
window.pack();
window.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
window.setLocationRelativeTo(null);
window.setVisible(true);
t = new Timer(5, game);
t.start();
window.addMouseMotionListener(game);
}
//set the size of window
public Dimension getPreferredSize(){
return new Dimension(800, 600);
}
@Override
protected void paintComponent(Graphics g){
g.setColor(new Color(110, 65, 13));
g.fillRect(paddleX, 510, 150, 15);
g.setColor(new Color(90, 0,0));
g.fillRect(paddleOpX, 90, 150, 15);
g.setColor(Color.WHITE);
g.fillOval(ballX, ballY, 30, 30);
}
@Override
public void actionPerformed(ActionEvent e) {
paddleOpX = (ballX+5);
ballX +=ballXSpeed;
ballY +=ballYSpeed;
if(ballX >= paddleX-30 && ballX <= (paddleX + 150) && ballY >= 480){
ballYSpeed = -ballYSpeed;
//ballYSpeed = -1;
setScore();
}
if(ballX >= paddleX-30 && ballX <= (paddleX + 150) && ballY > 480){
ballYSpeed = -ballYSpeed;
//ballYSpeed = 1;
setScore();
}
if(ballX >= paddleOpX-30 && ballX <=(paddleOpX + 150) && ballY <= 106){
ballYSpeed = ballYSpeed*-1;
}
if(ballY > 570){
ballXSpeed = 0;
ballYSpeed = 0;
t.stop();
System.out.println(score);
}
if(ballX >= 770){
ballXSpeed = -ballXSpeed;
//ballXSpeed = -1;
}
if(ballY <= 0){
ballXSpeed = 0;
ballYSpeed = 0;
t.stop();
System.out.println(score);
//ballYSpeed = 1;
}
if(ballX <= 0){
ballXSpeed = ballXSpeed*-1;
//ballXSpeed = 1;
}
repaint();
}
@Override
public void mouseDragged(MouseEvent e) {
}
@Override
public void mouseMoved(MouseEvent e) {
paddleX = e.getX()-75;
if(ballX >= paddleX-30 && ballX <= (paddleX + 150) && ballY == 480 ){
ballYSpeed = ballYSpeed-1;
ballXSpeed = ballXSpeed < 0 ? -2 : 2;
//ballYSpeed = 1;
}
repaint();
}
private void setScore(){
score++;
}
public Integer getScore(){
return score;
}
}
private void setScore()
方法不是 static
方法,您正试图从静态方法调用此方法,您必须将此方法设置为静态方法或使用以下方法调用此方法对象.
要创建 static
方法,您必须在方法语法中使用 static
修饰符。
private static void setScore(){
score++;
}
或
您必须创建 PongGame
class 的实例,然后调用该方法。
PongGame pg = new PongGame();
JLabel scoreBoard = new JLabel(pg.getScore().toString());
实例方法 getScore()
需要一个对象来调用该方法,因为它不是 static
,但您还没有。
将PongGame game = new PongGame();
移动到main
的第一行,然后更改
JLabel scoreBoard = new JLabel(getScore().toString());
至
JLabel scoreBoard = new JLabel(game.getScore().toString());
getScore() 需要它是静态的,因为你没有输入 "new",所以如果没有它的实例,它就无法计算。
JLabel scoreBoard = new JLabel(getScore().toString());
需要它,而您还没有将其声明为 "static"。
static 表示它只一次加载到内存中,一劳永逸 (这在某些情况下很有用(比如服务器上的 Web 方法 运行(可能内存不足)))。
简单的解决方案:创建一个实例并使用它。
getScore gs= new getScore()
或将其设为静态并将其用作
getScore.TosTring();
您需要在此之前实例化超类。
方法getScore()
不是static
(因为你没有把它声明为static
),所以它需要一个实例来调用。换句话说,您必须创建 class PongGame
:
public static void main(String[] args){
PongGame game = PongGame(...);
...
}
然后用它来调用方法:
game.getScore();
注意: static
方法在每个 class 中只存在一次,因此您不需要 class 的实例来称它为。另一方面,非static
方法需要调用一个实例。