Java面向对象-内部类详解

目录

概述

使用场景和作用

分类

静态内部类

成员内部类(非静态)

局部内部类

匿名内部类(重点)

概述

常见使用形式

真实使用场景


概述

  • 内部类就是定义在一个类里面的类,可以理解为里面的类是寄生,外部的类是宿主

使用场景和作用

  • 当一个事物的内部还有一个部分需要一个完整结构进行描述,而这个内部的完整结构又只为外部事物服务,那么内部这个完整结构就可以用内部类来设计
  • 内部类通常可以方便访问外部类的成员,包括私有的成员
  • 内部类提供更好的封装性,内部类本身就可以用private protected等修饰,封装性可以做更多控制

分类

静态内部类、成员内部类、局部内部类、匿名内部类

静态内部类

  • 有static修饰,属于外部类本身
  • 它的特点和使用和普通的类完全一样,类有的成分它都有,只不过它在一个类的里面而已
  • 创建对象的格式:外部类名.内部类名 = new 外部类名.内部类构造器()

  • 访问扩展

静态内部类中可以直接访问外部类的静态成员,外部类的静态成员只有一份,可以被共享访问

静态内部类中不可以直接访问外部类的实例成员,外部类的实例成员必须用外部类的对象间接访问

成员内部类(非静态)

  • 无static修饰,属于对象
  • JDK16之前,成员内部类中不可以定义静态成员,JDK16开始可以定义静态成员
  • 创建对象的格式:外部类名.内部类名 对象名 = new 外部类构造器.new 内部类构造器();

  • 访问扩展

成员内部类中可以直接访问外部类的静态成员,外部类的静态成员只有一份可以被共享

成员内部类中的实例方法可以直接访问外部类的实例成员,因为必须要先有外部类对象才能有成员内部类对象

  • 面试题

代码参考

注意:在成员内部类中访问所在外部类对象,格式:外部类名.this

局部内部类

  • 放在方法、代码块、构造器等执行体中
  • 类文件名:外部类$N内部类.class

这些代码仅仅是便于理解,了解即可,实际开发很少用到局部内部类,写这种代码会被骂的噢~

匿名内部类(重点)

概述

  • 本质上是一个没有名字的局部内部类,定义在方法中、代码块中等
  • 作用:方便创建子类对象,最终目的为了简化代码编写
  • 格式

下面我画了一张图来解释匿名内部类是咋来的

  • 特点总结:

匿名内部类是一个没有名字的内部类

匿名内部类写出来就会产生一个匿名内部类的对象

匿名内部类的对象类型相当于是当前new的那个类型的子类类型

上述代码中蓝色区域就相当于一个老虎对象

常见使用形式

  • 匿名内部类作为方法的实际参数进行传输

案例需求:某个学校需要让老师、学生、运动员一起参加游泳比赛

首先要定义一个接口代表游泳,然后本来是要定义老师、学生、运动员实现类来实现游泳这个接口,但是我们可以直接定义匿名内部类来完成游泳

public class Test2 {
    public static void main(String[] args) {
        Swimming s = new Swimming() {
            @Override
            public void swim() {
                System.out.println("学生在游泳");
            }
        };
        go(s);
        System.out.println("-------------------");
        Swimming t = new Swimming() {
            @Override
            public void swim() {
                System.out.println("老师在游泳");
            }
        };
        go(t);
        System.out.println("-------------------");
        Swimming y = new Swimming() {
            @Override
            public void swim() {
                System.out.println("运动员在游泳");
            }
        };
        go(y);
    }

    //学生、老师、运动员可以一起参加比赛
    public static void go(Swimming s){
        System.out.println("开始了!");
        s.swim();
        System.out.println("结束了!");
    }
}

//前提是必须会游泳->接口
interface Swimming{
    void swim();
}

在开发中代码也可以这样简化,以上面的案例为例,将蓝色部分直接替换为go中的s,这只是稍微简化了一点点,以后还可以简化为1行~以后再说

真实使用场景

  • 给按钮绑定点击功能

涉及到GUI图形化编程,先不用理解,下面图上代码就是写了一个登陆界面和登录按钮,但是登录按钮点击之后没有任何反应,所以我们就要用匿名内部类对它绑定一个点击的监听事件

以下代码中蓝色区域就是匿名内部类,调用addActionListener方法对btn这个按钮对象进行监听

重写的方法内部自己设计,我这边代码的意思就是点击按钮跳出一个窗口提示“你是猪!”

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
 * @Author: ttong
 * @Description:GUI图形化编程理解匿名内部类使用场景
 */
public class Test3 {
    public static void main(String[] args) {
        //1.创建窗口
        JFrame win = new JFrame("登录界面");
        JPanel panel = new JPanel();//定义一个桌布
        win.add(panel);//把桌布添加到桌子上
        //2.创建一个按钮对象
        JButton btn = new JButton("登录");

        //注意:绑定点击功能
        btn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(win,"你是猪!");
            }
        });

        //3.把按钮对象添加到桌布展示
        panel.add(btn);

        //4.展示窗口
        win.setSize(400,300);//设置宽和高,宽400高300
        win.setLocationRelativeTo(null);//设置居中显示
        win.setVisible(true);
    }
}

总结:在开发中,匿名内部类不是我们主动去定义的,而是当有需求的时候才会写,使用匿名内部类可以使得代码简化

  • 23
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值