JavaSE从0到1-DAY7-内部类(i)
Java 内部类学习笔记i一、为什么会有内部类核心作用内部类是写在外部类里面的类它的主要作用是逻辑封装把只属于外部类的辅助功能封装起来不暴露给外界访问权限内部类可以访问外部类的私有成员实现更细粒度的控制生活比喻想象一辆汽车外部类 Car汽车的品牌、颜色是公开的属性汽车的发动机内部类 Engine是内部的用户不需要直接接触发动机有自己的属性型号、功率但只有汽车内部才能使用它publicclassCar{StringcarName;// 外部类属性classEngine{// 内部类 - 只属于 CarStringengineName;intengineAge;}}二、内部类的分类分类定义位置特点成员内部类写在成员位置类体内需要外部类实例才能创建静态内部类写在成员位置 static修饰不需要外部类实例局部内部类写在方法内部作用域仅限该方法匿名内部类没有类名直接创建对象通常用于接口实现三、成员内部类详解3.1 什么是成员内部类写在成员位置的内部类属于外部类的成员。publicclassCar{StringcarName;classEngine{// 成员内部类StringengineName;}}3.2 成员内部类的访问权限重难点内部类能访问外部类的私有成员吗答案能✅publicclassCar{privateStringcarSecret这是秘密;// 私有属性classEngine{voidshowSecret(){System.out.println(carSecret);// ✅ 可以访问}}}为什么因为内部类和外部类是亲密关系编译后会生成两个.class文件它们在同一个包里内部类有特殊权限访问外部类的私有成员。外部类能访问内部类的私有成员吗答案不能❌publicclassCar{classEngine{privateStringengineSecret发动机秘密;}voidtest(){EngineenginenewEngine();System.out.println(engine.engineSecret);// ❌ 编译错误}}为什么因为内部类的私有成员就是私有的外部类也要尊重这个访问权限。四、成员内部类的实例化4.1 为什么成员内部类需要外部类实例生活比喻发动机内部类必须装在某一辆具体的汽车外部类实例上才有意义你不能说我要一个发动机必须说我要这辆红色汽车的发动机4.2 两种创建方式方式一在外部类内部创建推荐publicclassCar{classEngine{voidstart(){System.out.println(发动机启动);}}voidcreateEngine(){EngineenginenewEngine();// ✅ 直接创建engine.start();}}方式二在外部类外部创建CarcarnewCar();Car.Engineenginecar.newEngine();// ✅ 必须通过外部类实例engine.start();关键点car.new Engine()表示通过 car 这个实例来创建 Engine五、静态内部类详解重难点5.1 什么是静态内部类用static修饰的内部类。publicclassCar{staticclassEngine{// 静态内部类StringengineName;}}5.2 静态内部类 vs 成员内部类的本质区别特性成员内部类静态内部类是否依赖外部类实例✅ 依赖❌ 不依赖能否访问外部类的非静态成员✅ 能❌ 不能能否访问外部类的静态成员✅ 能✅ 能创建方式outer.new Inner()new Outer.Inner()5.3 生活比喻理解成员内部类就像汽车的发动机必须装在某一辆具体的汽车上发动机可以访问这辆车的所有信息包括私有的静态内部类就像汽车的设计图纸不属于某一辆具体的汽车设计图纸是通用的不需要依附于某辆车设计图纸只能看汽车的通用规格静态信息看不到某辆车的具体颜色5.4 代码对比publicclassCar{StringcarColor红色;// 非静态成员staticStringcarBrand宝马;// 静态成员// 成员内部类classEngine{voidtest(){System.out.println(carColor);// ✅ 能访问System.out.println(carBrand);// ✅ 能访问}}// 静态内部类staticclassWheel{voidtest(){// System.out.println(carColor); // ❌ 不能访问System.out.println(carBrand);// ✅ 能访问}}}5.5 创建方式对比// 成员内部类 - 需要外部类实例CarcarnewCar();Car.Engineenginecar.newEngine();// 静态内部类 - 不需要外部类实例Car.WheelwheelnewCar.Wheel();// 就像访问静态方法一样六、内部类访问外部类成员的方式当外部类和内部类有同名变量时publicclassCar{Stringname汽车;classEngine{Stringname发动机;voidtest(){System.out.println(name);// 发动机 - 内部类的System.out.println(this.name);// 发动机 - 内部类的System.out.println(Car.this.name);// 汽车 - 外部类的}}}记住Outer.this.变量名用来明确指向外部类的成员七、内部类的分类总结表内部类 ├── 成员内部类需要外部类实例 │ └── 可以访问外部类的所有成员 ├── 静态内部类不需要外部类实例 │ └── 只能访问外部类的静态成员 ├── 局部内部类定义在方法内 │ └── 作用域仅限该方法 └── 匿名内部类没有类名 └── 通常用于接口实现
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2475900.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!