欢迎访问宙启技术站
智能推送

Java函数的内部类和匿名类的使用示例

发布时间:2023-06-05 20:27:31

内部类和匿名类是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 函数中,内部类和匿名类可以用来简化代码的编写和提高程序的可读性,使得程序结构更加清晰和易于理解。在实际开发中,我们可以结合自己的需求来选择使用这些语法。