java中有两种类的实现方式,可以有效地优化程序代码。一个称为内部类,一个称之为匿名类。
我们以关闭窗口为例子简单说明一下两者的区别。
可以看出,这段程序比前两段更为简洁,不必定义MyFrame,甚至不必定义MyWindowAdapter!我们不用担心外部的类访问该匿名类,而且没有失去程序的可读性。
(四)总结
1. 内部类和匿名类相比外部类,可以有效地优化程序。
2. 内部类和匿名类不能写得太长,否则将失去程序的可读性。
3. 内部类和匿名类可以访问包装类(外嵌类)的成员变量和方法。
4. 匿名类一定是内部类,它一定跟在new后面,没有类名。
5. 匿名类中没有构造方法,不可以声明static成员变量和static方法。
我们以关闭窗口为例子简单说明一下两者的区别。
(一)不使用内部类和匿名类
package Test;
import javax.swing.*;
import java.awt.event.*;
public class Test {
public static void main(String[] args) {
new MyFrame("MyFrame");
}
}
class MyFrame extends JFrame {
public MyFrame(String title) {
super(title);
setLayout(null);
setBounds(100, 100, 400, 300);
setVisible(true);
this.addWindowListener(new MyWindowAdapter(this));
}
}
class MyWindowAdapter extends WindowAdapter {
MyFrame myFrame = null;
public MyWindowAdapter(MyFrame myFrame) {
this.myFrame = myFrame;
}
public void windowClosing(WindowEvent e) {
myFrame.setVisible(false);
System.exit(0);
}
}
可以看出,这样的定义是比较麻烦的。首先,要声明一个类,名字是MyWindowAdapter;其次,在外部的MyWindowAdapter类中还必须要加上MyFrame这个成员变量。这样做的结果不仅麻烦,而且很容易导致有其他的类与该类重名,出错几率极大。
(二)使用内部类
package Test;
import javax.swing.*;
import java.awt.event.*;
public class Test {
public static void main(String[] args) {
new MyFrame("MyFrame");
}
}
class MyFrame extends JFrame {
public MyFrame(String title) {
super(title);
setLayout(null);
setBounds(100, 100, 400, 300);
setVisible(true);
this.addWindowListener(new MyWindowAdapter());
}
class MyWindowAdapter extends WindowAdapter {
public void windowClosing(WindowEvent e) {
setVisible(false);
System.exit(0);
}
}
}
可以看出,这一小段程序的代码要比上个程序要简单一些,我们不必定义MyFrame这个成员了。为了避免外部的其它类调用该类,还可以将MyWindowAdapter类声明为private类型。但是内部类还必须要声明一个类名MyWindowAdapter,我们很可能会误用它,这是我们不想看到的。
(三)使用匿名类
package Test;
import javax.swing.*;
import java.awt.event.*;
public class Test {
public static void main(String[] args) {
new MyFrame("MyFrame");
}
}
class MyFrame extends JFrame {
public MyFrame(String title) {
super(title);
setLayout(null);
setBounds(100, 100, 400, 300);
setVisible(true);
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
setVisible(false);
System.exit(0);
}
});
}
}
可以看出,这段程序比前两段更为简洁,不必定义MyFrame,甚至不必定义MyWindowAdapter!我们不用担心外部的类访问该匿名类,而且没有失去程序的可读性。
(四)总结
1. 内部类和匿名类相比外部类,可以有效地优化程序。
2. 内部类和匿名类不能写得太长,否则将失去程序的可读性。
3. 内部类和匿名类可以访问包装类(外嵌类)的成员变量和方法。
4. 匿名类一定是内部类,它一定跟在new后面,没有类名。
5. 匿名类中没有构造方法,不可以声明static成员变量和static方法。