1.类的五大成分之一,如果一个类定义在另一个类的内部,这个类就是内部类。
(1)成院内部类,类中的一个普通成员。
public class test {
public static void main(String[] args) {
Outer.Inner inner = new Outer().new Inner();//先新建外部类,再新建内部类
inner.test();
}
}
public class Outer {
private int age = 20;
public class Inner {
public String name;
private int age = 18;
public static String school;
public void test() {
System.out.println(age);//18
System.out.println(Outer.this.age);//20
}
}
}
(2)静态内部类。有static修饰的内部类,外部类自己持有。
package com.lzk.test;
public class test {
public static void main(String[] args) {
Outer.Inner inner = new Outer.Inner();//先新建外部类,再新建内部类
inner.test();
}
}
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
}
}
}
(3)局部内部类,定义在方法块、代码块、构造器等执行体。
(4)匿名内部类,特殊的局部内部类,匿名指的是程序员不需要为这个类声明名字
public class test {
public static void main(String[] args) {
Animal dog = new Dog();
dog.cry();
}
}
class Dog extends Animal {
@Override
public void cry() {
System.out.println("Woof!");
}
}
abstract class Animal{
public abstract void cry();
}
这是之前调用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();
}
例子:
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();
}
}
执行结果:
简化:
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();
}
}
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);
}
}