从java中的另一个类访问私有变量

时间:2011-11-01 06:32:50

标签: java oop

我希望我的意思是我的意思。 我有一个这样的课程:

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方法的类。

5 个答案:

答案 0 :(得分:3)

从另一个类访问私有变量的正确方法是使用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,则需要花费大量精力来展开您创建的耦合。

答案 1 :(得分:0)

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

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

为什么不通过setMainLabel公开mainlabel?

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

答案 2 :(得分:0)

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

所以对于第一堂课来说就像下面那样

sample.setMethod(mainlabel);

您使用setter方法在不同类中设置私有变量的假设是正确的。

答案 3 :(得分:0)

你的方法的问题是,如果MainClass改变了它的JLabel(通过创建一个新的),SampleClass仍然有一个旧的引用。您可以通过构造函数或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();

答案 4 :(得分:0)

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

public void setLabel(JLabel _label) {

mainlabel = _label;
}