2012-01-16 73 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()時遞減該值。