2012-01-16 122 views
0

我如何从另一个类访问某些变量?例如,我有2个文件:从类到类的访问变量

Main.java

package keyboardgame; 

import java.applet.*; 
import java.awt.*; 
import java.awt.event.*; 

public class Main extends Applet implements KeyListener 
{ 

    private static final long serialVersionUID = 1L; 
    private static boolean keyboardRightPressed = false; 
    private static boolean keyboardLeftPressed = false; 
    private static boolean keyboardUpPressed = false; 
    private static boolean keyboardDownPressed = false; 

    int ballX = 20; 
    int ballY = 20; 
    int ballSpeed = 10; 

    public void init() 
    { 
     addKeyListener(this); 
    } 

    public void keyPressed(KeyEvent e) 
    { 
     int keyCode = e.getKeyCode(); 
     if(keyCode == KeyEvent.VK_RIGHT) 
     { 
      keyboardRightPressed = true; 
      ballX = ballX + ballSpeed; 
      repaint(); 
     } 

     if(keyCode == KeyEvent.VK_LEFT) 
     { 
      keyboardLeftPressed = true; 
      ballX = ballX - ballSpeed; 
      repaint(); 
     } 

     if(keyCode == KeyEvent.VK_UP) 
     { 
      keyboardUpPressed = true; 
      ballY = ballY - ballSpeed; 
      repaint(); 
     } 

     if(keyCode == KeyEvent.VK_DOWN) 
     { 
      keyboardDownPressed = true; 
      ballY = ballY + ballSpeed; 
      repaint(); 
     } 
    } 

    public void keyReleased(KeyEvent e) 
    { 
     int keyCode = e.getKeyCode(); 
     if(keyCode == KeyEvent.VK_RIGHT) 
     { 
      keyboardRightPressed = false; 
      repaint(); 
     } 

     if(keyCode == KeyEvent.VK_LEFT) 
     { 
      keyboardLeftPressed = false; 
      repaint(); 
     } 

     if(keyCode == KeyEvent.VK_UP) 
     { 
      keyboardUpPressed = false; 
      repaint(); 
     } 

     if(keyCode == KeyEvent.VK_DOWN) 
     { 
      keyboardDownPressed = false; 
      repaint(); 
     } 
    } 

    public void keyTyped(KeyEvent e) { 
    } 


    public void paint(Graphics g) 
    { 
     g.fillOval(ballX,ballY,20,20); 
     g.drawString("Right :"+keyboardRightPressed,0,10); 
     g.drawString("Left :"+keyboardLeftPressed,0,20); 
     g.drawString("Up :"+keyboardUpPressed,0,30); 
     g.drawString("Down :"+keyboardDownPressed,0,40);   
    } 

} 

KeyThread.java

package keyboardgame; 

public class KeyThread implements Runnable 
{ 

    public KeyThread(String s,int speed) 
    { 
     name = s; 
     time = speed; 
    } 

    public void run() 
    { 
     try 
     { 
      if(keyboardRightPressed == true) 
      { 
       ballX = ballX + 10; 
       ballY = ballY + 10; 
      } 
     } 
     catch(Exception e) 
     { 

     } 
    } 
} 

什么我想的是,从KeyThread.java是能够修改/增加/访问值从Main.java特别是

int ballX = 20; 
int ballY = 20; 

,所以我可以打电话给我的线程Main.java

Thread t5 = new Thread(new KeyThread("Moving Right", ballX = ballX + 1, 20)); 
t5.start(); 

我怎样才能做到这一点? 为什么它很难做到这一点?

+0

既然您是JAVA的新手,正如您在某些评论中所说的那样,您为什么不尝试JApplet,而不是从javax.swing包中取得Applet。这与来自java.awt包的Applet相比要好得多。问候 – 2012-01-17 12:39:32

回答

1

如果您声明变量public而不是private,则可以将它们引用为(例如)Main.ballX,但这通常是不好的做法。我们把事情组织起来,把不同的事情分开;如果我们开始在类B中使用类A的成员,那么类B对A有一个依赖关系,这会使得以后很难进行调试和维护。更好的办法是在Main中提供一个“getter”或“accessor”方法(例如getBallX()setBallX(int x)),这样可以使拥有的类(在这种情况下为Main)更好地控制其私有成员。

+0

我写主。和“ballX”不会出现(使用Eclipse),所以它肯定是错的......所以对于我的问题,推荐的方法是什么?我不太清楚它像清澈的水 – Master345 2012-01-16 20:54:16

2

为了调用对象的非静态方法,您需要一个类的实例。有关更多信息,请参见Objects

+0

我很难理解这一点......但我必须。我来自一个PHP/HTML类型的编程,这很容易,我试图用java来编写。希望我会做到:)) – Master345 2012-01-16 20:49:26

+0

@RowMinds,啊......一个OOP新手。那么,我建议你开始[这里](http://docs.oracle.com/javase/tutorial/java/concepts/index.html)。 G'luck! – mre 2012-01-16 20:57:14

+0

嘿,这不是那么糟糕,我实际上是从键盘上的全屏幕形式的球移动:)我只是不明白一些概念,对不起... – Master345 2012-01-16 21:08:40

1

此外,增加其他答案,如果一个频繁的任务将要增加/减少的值,因为它似乎是那么可能像adjustBallX(int x)这样的方法将是有价值的,所以你可以增加/每次不调用get()和set()时递减该值。