当前位置: 首页 > news >正文

Java学习------内部类

1. 定义

定义在一个类中的类

2. 使用时机

  • 当一个类需要用到另一个类,并且两个类的联系比较密切时就需要使用内部类
  • 内部类可以访问外部类的私有成员,这样可以将相关的类和接口隐藏在外部类的内部,提高封装性
  • 匿名内部类是没有名字的类,通常用于定义一个只使用一次的类

3. 分类

3.1 静态内部类

可以当做静态变量来看

//静态内部类
public class OuterClass{
	private static int i = 0;
	private int j = 100;
	public static void m1() {
		System.out.println("m1");
	}
	public void m2() {
		System.out.println("m2");
	}
	//静态内部类
	//四种访问控制权限修饰符在这里都可以使用
	private static class InnerClass {
		public void m3() {
			System.out.println(i); //可以访问
			System.out.println(j); //不可以访问
			m1(); //可以访问
			m2(); //不可以访问
		}
	}
}

注意点:无法直接访问外部类中实例变量和实例方法
如何使用: OuterClass.InnerClass oi = new OuterClass.InnerClass ();

3.2 实例内部类

可以当做实例变量来看

//实例内部类
public class OuterClass{
	private static int i = 0;
	private int j = 100;
	public static void m1() {
		System.out.println("m1");
	}
	public void m2() {
		System.out.println("m2");
	}
	//静态内部类
	//四种访问控制权限修饰符在这里都可以使用
	private class InnerClass {
		public void m3() {
			System.out.println(i); //可以访问
			System.out.println(j); //可以访问
			m1(); //可以访问
			m2(); //可以访问
		}
	}
}

注意点:可以直接访问外部类中所有的实例变量,实例方法,静态变量,静态方法
如何使用: OuterClass.InnerClass oi = new OuterClass().new InnerClass ();

3.3 局部内部类

可以当做局部变量来看

//局部内部类
public class OuterClass{
	private static int i = 0;
	private int j = 100;
	public void m1() {
		//局部变量
		int i = 11;
		//局部内部类
		class InnerClass {
			public void m2() {
				System.out.println(i); //可以访问
				System.out.println(j); //可以访问
			}
		}
		//new 对象
		InnerClass ic = new InnerClass();
		ic.m2();
	}
	public static void m3() {
		int i = 11;
		//局部内部类
		//这里的内部类的类名可以和上面相同的原因是属于局部,就和局部变量一样,出了大括号之后就没了
		class InnerClass {
			public void m2() {
				System.out.println(i); //可以访问
				System.out.println(j); //不可以访问
			}
		}
	}
}

注意点:

  • 局部内部类方外类外部的局部变量时,局部变量需要被final修饰
  • 不能使用访问权限控制符修饰,因为只是在局部访问,外部不需要访问,添加这些修饰符也没有什么用
  • 从JDK8开始,不需要手动添加final了,但JVM会自动添加

3.4 匿名内部类

特殊的局部内部类,没有名字,只可以使用一次

//匿名内部类
public class test {
    public static void main(String[] args) {
        Computer c = new Computer();
        c.conn(new Usb() {
            @Override
            public void read() {
                System.out.println("read");
            }

            @Override
            public void write() {
                System.out.println("write");
            }
        });
    }
}

class Computer {
    public void conn(Usb usb) {
        usb.read();
        usb.write();
    }
}

interface Usb {
    void read();
    void write();
}

相关文章:

  • 4G模组Air780EPM:解锁物联网时代的硬件接口奥秘!
  • 【eNSP实战】(续)一个AC多个VAP的实现—将隧道转发改成直接转发
  • 有了大模型为何还需要Agent智能体
  • Mysql-经典实战案例(3): pt-archiver 实现 MySQL 千万级大表分库分表(上)
  • 设计模式之外观模式:原理、实现与应用
  • 设备物联网无线交互控制,ESP32无线联动方案,产品智能化响应
  • OpenCV计算摄影学(23)艺术化风格化处理函数stylization()
  • 【Android Studio】解决遇到的一些问题
  • Vue3项目中可以尝试封装那些组件
  • SpringSecurity——如何实现验证码登录页面
  • 内存回收异常导致OOM的问题
  • Android中的Wifi框架系列
  • JS中的变量提升
  • OpenCV 图像双线性插值
  • 地球46亿年历史的“微观褶皱”
  • 六十天前端强化训练之第二十二天之React 框架 15天深度学习总结(大师版)
  • 节点编辑器STNodeEditor快速入门,流程图编程
  • 【USTC 计算机网络】第二章:应用层 - 应用层原理
  • postgresql 高版本pgsql备份在低版本pgsql中恢复失败,报错:“unsupported version”
  • 直线模组定位精度差的原因
  • 中国难以承受高关税压力?外交部:任何外部冲击都改变不了中国经济基本面
  • 沙发上躺赢又如何?告别冠军绝缘体的凯恩,要开始收割荣誉了
  • 美国中央情报局计划裁员1200人
  • “三桶油”一季度净赚966亿元:业绩分化加剧,有人欢喜有人愁
  • 涉嫌严重违纪违法,57岁证监会副主席王建军被查
  • 市场监管总局出手整治涉企乱收费,聚焦政府部门及下属单位等领域