[从Java中的其他类访问私有变量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[从Java中的其他类访问私有变量相关的知识,希望对你有一定的参考价值。

我希望我说的是我的话。我有一堂这样的课:

public class MainClass extends JFrame
    private JLabel mainlabel;
    private SampleClass sample=new SampleCalss();

    public void intital()
        mainlabel=new JLabel("Main");
        sample.setMethod(getLabel());
        //
        //some code
        //
        add(mainlabel); 
    

    public static void main()
        intital();
    

    public JLabel getLabel()
        return mainlabel;
    

和其他类似的类:

public class SampleClass extends JFrame
    private JButton button=new JButton("Change");
    private JLabel sLabel;

    public SampleClass()
        //somecode
        //
        button.addActionListener(new ActionListener()
            public void actionPerformed(ActionEvent e)
                sLabel.setText("Sample text set");
            
        );
        add(jButton);
    

    public void setMethod(JLabbel l)
        sLabel=l;
    

这是访问mainlabel并从其他类更改其值的正确方法(在此示例代码中,在SampleClass类中)是否有更好的解决方案?请注意,MainClass是具有main方法的类。

答案

从另一个类访问私有变量的正确方法是使用getter和setter方法。否则,您应该将该变量设为公共。

即:

// getter
public JLabel getMainLabel()  
    return mainlabel;


// setter
public void setMainLabel(JLabel mainLabel) 
    this.mainlabel = mainLabel;

但是,直接返回私有数据是一种不好的做法-允许外部代码修改您的私有状态。通常,您应该返回私有数据的副本,以使外部代码不会与类的内部混乱。但是,如果您需要外部代码来调用私有数据上的方法,那么您可能应该在类中提供操作方法,而不是直接公开私有数据。

您可能确实想要在您的主类中创建类似setText()getText()的方法,然后在setText()上调用getText()mainlabel方法。但是,您需要注意这一点,因为您可能倾向于复制类中JLabel定义的每个方法。这将使您的类及其使用者与JLabel实现紧密地结合在一起。如果您将来选择用其他方式替换JLabel,则将需要大量工作才能解开已创建的耦合。

另一答案

在类中,可以使用私有变量,而无需显式调用私有变量的getter方法。

所以像下面这样的头等舱

sample.setMethod(mainlabel);

并且您关于使用setter方法在different类中设置私有变量的假设是正确的。

另一答案

方法的问题是,如果MainClass更改了它的JLabel(通过创建一个新的JLabel),SampleClass仍然具有对旧JLabel的引用。您可以通过构造函数或setter方法为SampleClass提供对MainClass的引用:

public class SampleClass extends JFrame
private JButton button=new JButton("Change");
private MainClass main;

public SampleClass(MainClass main)

    this.main = main;
    // do stuff

并且每当您需要访问MainClass的标签时,请调用其getter方法:

main.getLabel();
另一答案

您可以使用Java Reflection访问私有变量并更改值。

http://download.oracle.com/javase/tutorial/reflect/member/fieldValues.html

为什么不通过setMainLabel公开mainlabel?

public void setMainLabel(JLabel mainLabel) 
    this.mainlabel = mainLabel;

另一答案

创建一个允许访问私有变量的增变方法

public void setLabel(JLabel _label)

mainlabel = _label;

以上是关于[从Java中的其他类访问私有变量的主要内容,如果未能解决你的问题,请参考以下文章

从 C++ 中的类访问私有变量

仍然可以从 C# 中的另一个类访问私有变量

如何从 C# 中的另一个私有类调用私有类变量

如何访问其子类中的类的私有变量?

需要解释:Java中的私有访问修饰符

ES6 class类中定义私有变量