目录
内部类
概念:
在一个类的内部定义的类称为内部类
为了完成某一些功能只在某个具体的外部类中使用,其他地方不再需要,这时可以将此功能定义在一个内部类中,而不需要单独的创键一个类
代码
package com.ffyc.javagui.innerclass;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
public class A {
private int num;
//类B,只为在类A中完成某种操作,其他类中不需要,那么我们就可以将这些功能定义在一个内部类中
class B{
public void test(){
System.out.println(num);
}
}
public static void main(String[] args) {
/*//对集合进行迭代的迭代器,就是ArrayList中的一个内部类
Iterator<Object> iterator = new ArrayList<>().iterator();
iterator.next();*/
/*//对HashMap进行迭代的entrySet也是一个内部类
new HashMap<>().entrySet();*/
}
}
/*//不叫内部类
class B{
}*/
运行
运行成功后将会创建一个如图的内部类class文件
特点:
内部类仍然是一个独立的类,在编译之后内部类会被编译成独立 的.class文件,但是前面冠以外部类的类名和$符号。
内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否为 private 的。例如在服务器端创建一个内部类Thread,进行监听
匿名内部类:
匿名内部类是一种特殊的局部内部类,它是通过匿名类实现接口。
有一些功能只被使用一次,那么就没必要创建一个类,在java中提供了一个匿名的类,用来实现接口/继承抽象类。
在哪儿使用,在哪直接new。 例如new 接口/抽象类 这个都不是创建接口的对象,而是创建了一个匿名内部类对象。
是java对内部类进行的一种语法上的简化
new 接口名称/抽象类名称() {
重写抽象方法;
}
代码
package com.ffyc.javagui.listener;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Demo1Frame extends JFrame {
JTextField jTextField;
public Demo1Frame() throws HeadlessException {
//添加标题
this.setTitle("欢迎登录");
//设置宽高
this.setSize(300, 300);
//自定义坐标位置
this.setLocation(200, 400);
//水平垂直居中
this.setLocationRelativeTo(null);
//关闭窗口时退出程序
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置禁止窗口设置拖拽调整大小
this.setResizable(false);
//创建一个面板
JPanel jPanel = new JPanel();
JTextField jTextField = new JTextField(15);
JButton jButton = new JButton("登录");
jPanel.add(jTextField);
jPanel.add(jButton);
//把面板添加到窗口上
this.add(jPanel);
//让窗口显示,放在设置的最后一行
this.setVisible(true);
//为组件添加事件处理程序
//jButton.addActionListener(new A());
//jButton.addActionListener(new B());
//new 接口 创建一个匿名内部类,是为了简化语法
jButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(jTextField.getText());
}
});
}
//内部类 为了完成事件监听,我们单独创建了一个类来完成监听的功能
class B implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
jTextField.getText();
}
}
public static void main (String[] args) {
//创建了一个窗口对象
new Demo1Frame();
}
}
内部类意义:
1.实现封装
将只有在某个类中使用的功能定义在内部中,并可以使用不同访问权限修饰控制.
2.实现多继承
java是不支持多继承的,可以通过内部类实现多继承。
多继承有一个致命性的缺陷, 容易出现钻石继承结构。