Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从java中的其他类访问私有变量_Java_Oop - Fatal编程技术网

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

从java中的其他类访问私有变量,java,oop,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());

我希望我是认真的。 我有一门课是这样的:

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;
    }
}
还有其他类似的课程:

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

您可以使用Java反射来访问私有变量并更改值

为什么不通过setMainLabel公开mainlabel

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

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

即:

// getter
public JLabel getMainLabel() { 
    return mainlabel;
}

// setter
public void setMainLabel(JLabel mainLabel) {
    this.mainlabel = mainLabel;
}
但是,直接返回私有数据是一种不好的做法,它允许外部代码修改您的私有状态。通常,您应该返回私有数据的副本,这样外部代码就不会弄乱类的内部。但是,如果您需要外部代码来调用私有数据上的方法,那么您可能应该在类中提供操作方法,而不是直接公开私有数据


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

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

第一节课的情况如下

sample.setMethod(mainlabel);

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

您的方法的问题是,如果MainClass更改了它的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
}
main.getLabel();
每当需要访问MainClass的标签时,调用其getter方法:

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

public SampleClass(MainClass main)
{
    this.main = main;
    // do stuff
}
main.getLabel();

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

public void setLabel(JLabel _label) {

mainlabel = _label;
}

反射可以做到这一点,但这将是一个黑客