1.类的五大成分之一,如果一个类定义在另一个类的内部,这个类就是内部类。
(1)成院内部类,类中的一个普通成员。
(2)静态内部类。有static修饰的内部类,外部类自己持有。
package com.lzk.test;
public class Outer {
private int age = 20;
private static String name = "lzk";
public static class Inner {
public String name;
public static String school;
public void test() {
// System.out.println(age);//报错 必须有对象进行访问
System.out.println(name);//lzk
}
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
(3)局部内部类,定义在方法块、代码块、构造器等执行体。
(4)匿名内部类,特殊的局部内部类,匿名指的是程序员不需要为这个类声明名字
这是之前调用cry,需要重写cry方法,有一个机制可以直接得到子类对象,使用这种方法可以更快创建子类对象进行调用。
public static void main(String[] args) {
// Animal dog = new Dog();
// dog.cry();
//1.new Animal 会把这个匿名内部类翻译成子类,然后立即创建一个对象出来。
Animal dog = new Animal() {
@Override
public void cry() {
System.out.println("Woof!");
}
};
dog.cry();
}
}
// class Dog extends Animal {
// @Override
// public void cry() {
// System.out.println("Woof!");
// }
// }
abstract class Animal{
public abstract void cry();
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
例子:
public class test {
public static void main(String[] args) {
Swimming s = new Swimming() {
@Override
public void swim() {
System.out.println("I can swim");
}
};
go(s);
}
public static void go(Swimming s){
System.out.println("-----swim-----");
s.swim();
}
interface Swimming{
void swim();
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
执行结果:
简化:
public class test {
public static void main(String[] args) {
// Swimming s = new Swimming() {
// @Override
// public void swim() {
// System.out.println("I can swim");
//
// }
// };
// go(s);
go(new Swimming() {
@Override
public void swim() {
}
});//把上边那一坨塞到()内
}
public static void go(Swimming s){
System.out.println("-----swim-----");
s.swim();
}
interface Swimming{
void swim();
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
2.内部类在开发中的真是使用场景
(1)可以更方便创建出一个子类对象
(2)匿名内部类通常最为一个参数传输给方法
看看就行了,GUI创建桌面图标的。
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class LoginExample {
public static void main(String[] args) {
// 创建主窗口
JFrame win = new JFrame("登录界面");
JPanel panel = new JPanel();
win.add(panel);
// 创建按钮
JButton btn = new JButton("登录");
panel.add(btn);
// 给按钮添加单击事件监听器
// btn.addActionListener(new ActionListener() {//这里就是匿名内部类
// @Override
// public void actionPerformed(ActionEvent e) {
// JOptionPane.showMessageDialog(win, "登录一下");
// }
// });
// 使用简化的Lambda表达式简化代码
btn.addActionListener(e -> JOptionPane.showMessageDialog(win, "登录一下"));
win.setSize(400, 400);
win.setLocationRelativeTo(null);
win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
win.setVisible(true);
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.