内部类就是定义在一个类里面的类。
- public class People{
- // 内部类
- public class Heart{
- }
- }
场景:当一个事物的内部,还有一个部分需要一个完整的结构进行描述时。
内部类通常可以方便访问外部类的成员,包括私有的成员。
内部类提供了更好的封装性,内部类本身就可以用private ,protectecd等修饰,封装性可以做更多控制。
- public class A{
- // 静态成员内部类
- public static class B{
- }
-
- }
静态内部类创建对象:
外部类名.内部类名 对象名 = new 外部类名.内部类构造器;
例如:
- //外部类
- public class Out {
- public static class In{//内部类
- private String name;
- private int age;
- public static String cname;
-
- public In(String name, int age) { //内部类的有参构造器
- this.name = name;
- this.age = age;
- }
-
- public In() { //内部类的无参构造器
- }
-
- //get 、 set 方法
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public int getAge() {
- return age;
- }
-
- public void setAge(int age) {
- this.age = age;
- }
-
- public static String getCname() {
- return cname;
- }
-
- public static void setCname(String cname) {
- In.cname = cname;
- }
- }
-
- }
- public class test {
- public static void main(String[] args) {
- Out.In a = new Out.In();
- a.setName("香克斯");
- a.setAge(40);
- System.out.println(a.getName()+" "+a.getAge());
-
- }
- }
*
静态内部类中可以直接访问外部类的静态成员
静态内部类中不可以直接访问外部类的实例成员
无static修饰,属于外部类的对象。
- public class Outer {
- // 成员内部类
- public class Inner {
- }
- }
成员内部类创建对象:
外部类名.内部类名 对象名 = new 外部类构造器.new 内部类构造器();
例如:
- //外部类
- public class Out {
- public class In{
- private String name;//内部类
- private int age;
- private static String cname; //成员内部类中可以有静态成员变量
-
- public static void eat(){ //成员内部类中可以有静态方法
-
- }
-
- public In(String name, int age) { //有参构造器
- this.name = name;
- this.age = age;
- }
-
-
- public In() {//无参构造器
-
-
- }
- //get、 set方法
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public int getAge() {
- return age;
- }
-
- public void setAge(int age) {
- this.age = age;
- }
-
- public String getCname() {
- return cname;
- }
-
- public void setCname(String cname) {
- this.cname = cname;
- }
- }
-
- }
- public class test {
- public static void main(String[] args) {
- Out.In i = new Out().new In();
- i.setName("路飞");
- System.out.println(i.getName());
- }
- }
*
静态内部类中可以直接访问外部类的静态成员
静态内部类中可以直接访问外部类的实例成员
- //外部类
- public class Out {
- private int a = 10; //外部类对象 访问时 外部类名.this.对象
-
- public class In { //内部类
- private int b = 20; //成员内部类的对象变量 访问使用this关键字
-
- public void print() {
- int c = 30;
- System.out.println(c);//输出30
- System.out.println(this.b);//输出20
- System.out.println(Out.this.a);//输出10
- }
-
- }
- }
局部内部类放在方法、代码块、构造器等执行体中。
局部内部类的类文件名为: 外部类$N内部类.class。
本质上是一个没有名字的局部内部类。
作用:方便创建子类对象,最终目的是为了简化代码编写。
格式:
- new 类|抽象类名|或者接口名() {
- 重写方法;
- };
例如:
- abstract class F{ //定义父类抽象类
- abstract void eat();
- }
- public class test {
- public static void main(String[] args) {
- F a = new F() {
- @Override //重写
- void eat() {
- System.out.println("很能吃");
- }
- };
- a.eat();
- }
- }
*
匿名内部类是一个没有名字的内部类,同时也代表一个对象。
匿名内部类产生的对象类型,相当于是当前new的那个的类型的子类类型。
如:
某个学校需要让学生参加游泳比赛
常规写法 有子类:
- /*
- 游泳接口
- */
- public interface Swimming {
- void swim();
- }
- public class test {
- public static void main(String[] args) {
- Swimming s = new Student();
- goSwimming(s);
- }
-
- // 定义一个方法让所有角色进来一起比赛
- //需求:goSwimming方法
- public static void goSwimming(Swimming s) {
- System.out.println("开始");
- s.swim();
- System.out.println("结束");
- }
- }
-
- class Student implements Swimming{
-
- @Override
- public void swim() {
- System.out.println("学生游泳比赛");
- }
- }
匿名内部类的写法:
- /*
- 游泳接口
- */
- public interface Swimming {
- void swim();
- }
- public class test {
- public static void main(String[] args) {
- Swimming s = new Swimming() {
- @Override
- public void swim() {
- System.out.println("学生游泳比赛");
- }
- };
- goSwimming(s);
-
- }
-
- // 定义一个方法让所有角色进来一起比赛
- //需求:goSwimming方法
- public static void goSwimming(Swimming s) {
- System.out.println("开始");
- s.swim();
- System.out.println("结束");
- }
- }
运行是以回调形式:

匿名内部类可以作为一个对象,直接传输给方法。
使用匿名内部类的案例:
通过GUI编程 理解匿名内部类的使用
- import javax.swing.*;
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
-
-
- public class test {
- public static void main(String[] args) {
- //创建窗口
- JFrame windo = new JFrame("登录界面");
-
- //定义一个桌布
- JPanel panel = new JPanel();
- windo.add(panel);
-
- //创建一个按钮对象
- JButton button1 = new JButton("登录");
-
- //使用匿名内部类
- button1.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent actionEvent) {
- //提示框
- JOptionPane.showMessageDialog(windo, "点击了一下");//监听对象并输出
-
- }
- });//监听器和接口对象
-
-
- //将按钮对象添加到桌布对象中
- panel.add(button1);
- //设置窗口大小
- windo.setSize(300, 400);
- //展示窗口
- windo.setVisible(true);
- //窗口居中
- windo.setLocationRelativeTo(null);
- }
- }
