从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;
}
反射可以做到这一点,但这将是一个黑客