簡體   English   中英

如何從另一個類(java)訪問主類中的變量?

[英]How do I access variables from the main class from another class (java)?

我正在java中創建一個cookie clicker克隆來練習我的java技能,我有一個小問題,我有一些變量在main方法中聲明,我想從ActionListener類訪問。 以下是ActionListener類的一些示例代碼。 int變量(例如clicks,grandamaCost)和JTextFields(例如display,cpsDisplay)都在main方法中。 我想知道如何在main方法中訪問變量,以便此代碼可以在其他類中工作。 謝謝!

@Override
public void actionPerformed(ActionEvent e) {
    JButton b = (JButton) e.getSource();
    button(b.getText());
}

public void button(String input) {
    switch (input) {
        case "Cookie":
            clicks++;
            display.setText("Cookies: " + clicks + "");
            cpsDisplay.setText("CPS: " + cps);
            break;
        case "Buy grandma":
            if (clicks >= grandmaCost) {
                grandmas++;
                clicks = clicks - grandmaCost;
                grandmaCost = (int) ((.15 * grandmaCost) + grandmaCost);
                cps++;
            }
            display.setText("Cookies: " + clicks + "");
            prices[0].setText("$" + grandmaCost);
            cpsDisplay.setText("CPS: " + cps);
            break;
        case "Buy monkey":
            if (clicks >= monkeyCost) {
                monkeys++;
                clicks = clicks - monkeyCost;
                monkeyCost = (int) ((.15 * monkeyCost) + monkeyCost);
                cps = cps + 2;
            }
            display.setText("Cookies: " + clicks + "");
            prices[1].setText("$" + monkeyCost);
            cpsDisplay.setText("CPS: " + cps);
            break;
        case "Buy Teemo":
            if (clicks >= teemoCost) {
                teemos++;
                clicks = clicks - teemoCost;
                teemoCost = (int) ((.15 * teemoCost) + teemoCost);
                cps = cps + 3;
            }
            display.setText("Cookies: " + clicks + "");
            prices[2].setText("$" + teemoCost);
            cpsDisplay.setText("CPS: " + cps);
            break;
    }
}

}

你的變量應該是字段

字段在類的方法之外聲明,通常位於類聲明的正下方。 可以通過類的所有方法訪問字段。

也可以使用點運算符從其他類(除非它們是私有的)訪問它們。

  • 如果字段標有static ,則其類名用於引用它。
  • 如果字段不是靜態的,則使用其類的對象來引用它。

    public class Man {
        public String name; //this is a field
        public static String gender = "Male"; //this is a static field

        public Man(String newName) {
            name = newName; //assigns the value of a field from within a method
        }
    }

還有另一課......

public class Main {
    public static void main(String[] args) {
        Man bob = new Man("Bob");
        System.out.println(bob.name); //referenced from object, prints Bob
        System.out.println(Man.gender); //referenced from class name, prints Male
    }
}

要更好地控制字段的訪問權限,可以使用getter和setter 讀一讀!

public class ActionClass {
{
    private static int clicks;

   @Override
    public void actionPerformed(ActionEvent e) {
    clicks++;    
    }

      public static void setClicks(int c){
            clicks = c;
        }


       public static int getClicks(){
            return clicks;
        }

}


public class AnyClass {
{
    // now you have access to your clicks count .
    int clicks = ActionClass.getClicks();
    // set value of clicks
    ActionClass.setClicks(0);

}

在這里,我將舉例說明您的需求。 在這段代碼中,您只需要將要添加的任何內容設置為actionPerformed as static

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton; 

public class testJava implements ActionListener {

    protected static JButton b; // since this is static you can 
                                // now access it in other classes

    public static void main(String[] args) {



    }

    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub

        if(e.getSource() == b) {

            // do stuff here 

        }

    }

}

使用字段及其訪問方法。 這里有一個例子。

您必須使變量公共類變量而不是方法變量,從而增加變量的范圍和可見性。 像這樣:

public class ActionClass {
{
    public string MyPublicVariable = "woot";

    @Override
    public void actionPerformed(ActionEvent e) {


        ...
    }
}

更流行/推薦的方法是使用getter / setter而不是明確公開變量。 您可以通過公共方法訪問私有變量,如下所示:

public class ActionClass {
{
    @Override
    public void actionPerformed(ActionEvent e) {

        private string MyPublicVariable = "woot";

        public void setMyString(string newString){
            MyPublicVariable = newString;
        }

        public string getMyString(){
            return MyPublicVariable;
        }
    }
}

這樣,您可以更好地控制變量的設置。

您可以將主類實例引用傳遞給另一個類實例,或者注冊回調。 第一種方式

Class MainClass {
  private int mValue;
  public void init() {
     AnotherClass cla = new AnotherClass(this); 
  }
  public void setValue(int value) {mValue = value;}
  public int getValue(){return mValue;}
}

Class AnotherClass {
  private MainClass mMain;
  public AnotherClass(MainClass ref) {
     mMain = ref;
  }

  public void controlValue() {
     if (mMain != null) {
        mMain.setValue(1);
        mMain.getValue();
     }
  }
}

對於第二種方式1.聲明接口2.在主類3中實現此接口。將此實現注冊到另一個類。 4.在另一個類中獲取並設置值。

public interface ClassListener {
    public void setValue(int value);
    public int getValue();
}

public class MainClass implements ClassListener{

    private int mValue;

    public void registerListener() {
        AnotherClass cla = new AnotherClass();
        cla.registerListener(this);
    }

    @Override
    public void setValue(int value) {
        // TODO Auto-generated method stub
        mValue = value;
    }

    @Override
    public int getValue() {
        // TODO Auto-generated method stub
        return mValue;
    }
}

public class AnotherClass{

    private ClassListener mListener;

    public void registerListener(ClassListener listener) {
        mListener = listener;
    }

    public void controlValue() {
        if (mListener != null) {
            int value = mListener.getValue();
            mListener.setValue(++value);
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM