如何从另一个类(java)访问主类的变量?

Posted

技术标签:

【中文标题】如何从另一个类(java)访问主类的变量?【英文标题】:How do I access variables from the main class from another class (java)? 【发布时间】:2013-10-25 08:04:42 【问题描述】:

我正在 java 中制作一个 cookie clicker 克隆来练习我的 java 技能,我有一个小问题,我有在我想从 ActionListener 类访问的 main 方法中声明的变量。这是来自 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;
    

【问题讨论】:

【参考方案1】:

您的变量应该是fields。

字段是在类的方法之外声明的,通常位于类声明的正下方。类的所有方法都可以访问字段。

它们也可以使用点运算符从其他类(除非它们是私有的)访问。

如果一个字段标有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
    

为了更好地控制字段的访问,您可以使用getters and setters。读一读!

【讨论】:

【参考方案2】:
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);

【讨论】:

【参考方案3】:

在这里,我将举一个例子来说明你所需要的。在此代码中,您只需将要添加到actionPerformed 的任何内容设置为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 

        

    


【讨论】:

【参考方案4】:

您必须将变量设为公共类变量而不是方法变量,从而增加变量的范围和可见性。像这样:

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;
        
    

这样,您可以更好地控制变量的设置。

【讨论】:

【参考方案5】:

使用字段及其访问器方法。一个例子here。

【讨论】:

【参考方案6】:

您可以将主类实例引用传递给另一个类实例,或注册回调。 第一种方式

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);
        
    

【讨论】:

以上是关于如何从另一个类(java)访问主类的变量?的主要内容,如果未能解决你的问题,请参考以下文章

子类如何访问父类

如何从另一个类访问mysql数据库中的变量?

如何从另一个文件中的外部类访问变量

java中关于内部类的一些总结

从另一个类访问 MainWindow 类成员

如何在c#中访问另一个类中的一个类的私有函数?