我们很多时候会遇到一个类的成员需要用到另外的类的一些成员,这时候会有很多解决方法,例如传参或是声明内部类。但是在某些场合下他们都有弊端存在。传参不利于数据成员的管理,并且操作烦琐。内部类很好用,但是在类对象很多并且分布在很多类中时就不适用了。内部类适用于在只有一个类用到它,希望这个类把它封装起来的情况下。所以我们通常在事件响应中使用匿名内部类,因为事件响应过程的复用度不高,通常只响应一个事件而已。
经常使用的做法是索性把整个对象的引用作为另一个类的数据成员,所有访问对象成员的动作都可以通过这个对象的引用来完成。这样在逻辑上非常清楚,而且代码会更加方便,易读。
一个简单的例子(这个例子似乎用内部类会更合适)
//
: HoldRef.java
import java.awt. * ;
import java.awt.event. * ;
/** */ /**
* Holding Reference Test.
* Input two numbers and click the button to compute.
* @author nyzhl
*/
public class HoldRef ... {
public static void main(String[] args) ...{
new MyFrame();
}
}
class MyFrame extends Frame ... {
TextField tfNum1,tfNum2,tfRslt;
Label lblPlus,lblEqual;
Button btnCompute;
MyFrame() ...{
super("加法计算");
tfNum1 = new TextField(5);
tfNum2 = new TextField(5);
tfRslt = new TextField(7);
lblPlus = new Label("+");
lblEqual = new Label("=");
btnCompute = new Button("Compute");
//Construct a new object of class MyListener which holding the current object reference.
btnCompute.addActionListener(new MyListener(this));
setLayout(new FlowLayout());
add(tfNum1);
add(lblPlus);
add(tfNum2);
add(lblEqual);
add(tfRslt);
add(btnCompute);
pack();
setVisible(true);
}
}
/** */ /**
* Class who holds a reference of Class MyFrame.
*/
class MyListener implements ActionListener ... {
MyFrame mf;
MyListener(MyFrame mf) ...{
this.mf = mf;
}
public void actionPerformed(ActionEvent e) ...{
int num1 = Integer.parseInt(mf.tfNum1.getText());
int num2 = Integer.parseInt(mf.tfNum2.getText());
int rslt = num1 + num2;
mf.tfRslt.setText(rslt+"");
}
}
// /:~
import java.awt. * ;
import java.awt.event. * ;
/** */ /**
* Holding Reference Test.
* Input two numbers and click the button to compute.
* @author nyzhl
*/
public class HoldRef ... {
public static void main(String[] args) ...{
new MyFrame();
}
}
class MyFrame extends Frame ... {
TextField tfNum1,tfNum2,tfRslt;
Label lblPlus,lblEqual;
Button btnCompute;
MyFrame() ...{
super("加法计算");
tfNum1 = new TextField(5);
tfNum2 = new TextField(5);
tfRslt = new TextField(7);
lblPlus = new Label("+");
lblEqual = new Label("=");
btnCompute = new Button("Compute");
//Construct a new object of class MyListener which holding the current object reference.
btnCompute.addActionListener(new MyListener(this));
setLayout(new FlowLayout());
add(tfNum1);
add(lblPlus);
add(tfNum2);
add(lblEqual);
add(tfRslt);
add(btnCompute);
pack();
setVisible(true);
}
}
/** */ /**
* Class who holds a reference of Class MyFrame.
*/
class MyListener implements ActionListener ... {
MyFrame mf;
MyListener(MyFrame mf) ...{
this.mf = mf;
}
public void actionPerformed(ActionEvent e) ...{
int num1 = Integer.parseInt(mf.tfNum1.getText());
int num2 = Integer.parseInt(mf.tfNum2.getText());
int rslt = num1 + num2;
mf.tfRslt.setText(rslt+"");
}
}
// /:~