Java函数的内部类和匿名类的使用示例
内部类和匿名类是Java函数中常用的语法,用于简化代码的编写和提高程序的可读性。内部类是指在一个类的内部定义另一个类,而匿名类则是一种在声明时就创建实例的类。本文将分批介绍Java中内部类和匿名类的使用示例。
一、内部类的使用示例
1. 成员内部类
成员内部类是在一个类的内部定义的另一个类,它拥有外围类实例的引用,可以进行访问。下面是一个示例:
public class OuterClass {
private int num = 10;
private class InnerClass {
public void print() {
System.out.println("num = " + num);
}
}
public void display() {
InnerClass inner = new InnerClass();
inner.print();
}
public static void main(String[] args) {
OuterClass outer = new OuterClass();
outer.display();
}
}
在这个示例中,InnerClass 是 OuterClass 的一个成员内部类,在 display() 方法中创建了一个 InnerClass 实例,并调用其 print() 方法输出 num 值。在 main() 方法中创建 OuterClass 实例,并调用其 display() 方法输出 num 值。
2. 局部内部类
局部内部类是定义在方法内部或作用域内的类,仅在定义它的方法或作用域中有效,并且不能有 public、protected、private 和 static 等访问修饰符。下面是一个示例:
public class OuterClass {
private int num = 10;
public void display() {
class InnerClass {
public void print() {
System.out.println("num = " + num);
}
}
InnerClass inner = new InnerClass();
inner.print();
}
public static void main(String[] args) {
OuterClass outer = new OuterClass();
outer.display();
}
}
在这个示例中,InnerClass 是 display() 方法中的局部内部类,并且在这个方法中创建了 InnerClass 的一个实例 inner,并调用其 print() 方法输出 num 值。在 main() 方法中创建 OuterClass 实例,并调用其 display() 方法输出 num 值。
3. 匿名内部类
匿名内部类是一种没有名称的局部内部类,并且直接在语句中创建实例。下面是一个示例:
public class OuterClass {
public void display(Object obj) {
new Thread() {
public void run() {
System.out.println("Object is " + obj);
}
}.start();
}
public static void main(String[] args) {
OuterClass outer = new OuterClass();
outer.display("Java匿名内部类");
}
}
在这个示例中,我们在 display(Object obj) 方法中创建了一个匿名内部类。这个类继承了 Thread 类并重写了其 run() 方法,创建实例并启动线程,输出 obj 的值。在 main() 方法中创建 OuterClass 实例,并调用其 display(Object obj) 方法。
二、匿名类的使用示例
匿名类是一种在声明时就创建实例的类,并且没有类名。下面是一些使用匿名类的示例:
1. 列出目录中的所有文件
import java.io.File;
import java.util.Arrays;
import java.util.Comparator;
public class ListFiles {
public static void main(String[] args) {
File dir = new File(".");
File[] files = dir.listFiles(new Comparator<File>() {
public int compare(File f1, File f2) {
if (f1.isDirectory() && !f2.isDirectory()) {
return -1;
} else if (!f1.isDirectory() && f2.isDirectory()) {
return 1;
} else {
return f1.getName().compareTo(f2.getName());
}
}
});
for (File file : files) {
System.out.println(file);
}
}
}
在这个示例中,我们使用匿名类实现了 Comparator 接口,并重写了其中的 compare() 方法。这个方法用于比较两个 File 类型的对象,如果 个对象是目录而第二个对象不是,就返回 -1,否则返回 1,用来对目录和文件进行排序。在 main() 方法中,使用这个比较器对文件进行排序,并输出所有文件的名字。
2. 响应按钮的点击事件
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class ButtonDemo {
private JFrame frame;
private JPanel panel;
public ButtonDemo() {
frame = new JFrame();
panel = new JPanel();
JButton button = new JButton("Click Me");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("Button clicked.");
}
});
panel.add(button);
frame.add(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
new ButtonDemo();
}
}
在这个示例中,我们创建了一个窗口和一个面板,然后在面板中添加了一个按钮,并通过匿名类实现了 ActionListener 接口。这个接口用来监听按钮的点击事件,一旦按钮被点击,就会调用 actionPerformed() 方法,输出一条消息。
总结
在 Java 函数中,内部类和匿名类可以用来简化代码的编写和提高程序的可读性,使得程序结构更加清晰和易于理解。在实际开发中,我们可以结合自己的需求来选择使用这些语法。
