内部类
常用类总体学习目标
- 内部类
- Object类
- Object类常用方法
- 包装类
- String类
- BigDecimal类
内部类
分类
- 成员内部类
- 静态内部类
- 局部内部类
- 匿名内部类
概念
在一个类的内部再定义一个完整的类
特点:
-
编译之后可以生成独立的字节码文件
-
内部类可以直接访问外部类的私有成员,而不破坏封装
-
可为外部类提供必要的内部功能组件
成员内部类
-
在类的内部定义,与实例变量、实例方法同级别的类
-
外部类的一个实例部分,创建内部类对象时,必须依赖外部类对象
- Outer out = new Outer();
- Inner in = out .new Inner();
-
当外部类、内部类 存在重名属性时,会优先访问内部类属性
-
成员内部类不能定义静态成员(可以包含静态成量)
-
package com.kind.chapter_1; //头部 public class Body { // 身体 private String name; class Header{ public void show(){ System.out.println(name); } } }
-
package com.kind.chapter_1; //外部类 public class Outer { // 实例变量 private String name = "张三"; private int age = 20; // 内部类 class Inner{ private String address ="北京"; private String phone ="110"; // 属性和外部类的属性相同 如果想访问外部类 外部类名字.+this.+属性 private String name = "李四"; private static final String country = "中国"; // 方法 public void show(){ // 打印外部类的属性 System.out.println(Outer.this.name); System.out.println(age); // 打印内部类的属性 System.out.println(address); System.out.println(phone); } } }
-
package com.kind.chapter_1; public class TestOuter { public static void main(String[] args) { 创建外部类对象 // Outer outer = new Outer(); 创建内部类对象 // Outer.Inner inner = outer.new Inner(); // 一步到位 Outer.Inner inner = new Outer().new Inner(); inner.show(); } }
静态内部类
- 不依赖外部类对象,可直接创建或通过类名访问,可声明静态成员
- 只能直接访问外部类的静态成员(实例成员需实例化外部类对象)
Outer.Inner inner = new Outer.Inner();
inner.show();
- 关键词static 只有静态内部类才能使用 一般类不使用
局部内部类
-
定义在外部类方法中,作用范围和创建对象仅限于当前方法
-
局部内部类访问外部类当前方法中的局部变量时,因无法保障变量的生命周期与自身相同,变量必须修饰为final。
-
限制类的使用范围:只能在当前的方法中使用
-
public class Outer { private String name = "成龙"; private int age = 18; public void show(){ // 定义局部变量 String address = "深圳"; // 局部内部类: 注意不能加任何访问修饰符 class Inner{ private String phone= "123456789"; private String email= "chenglong@qq.com"; // 不能有静态 但是可以加final 变成静态常量(特殊) // private final static int count= 2000; private void show2(){ // 访问外部类的属性 System.out.println(name); System.out.println(age); //非静态可以访问 要是变成静态属性 就要new对象访问 // 访问内部类 System.out.println(phone); System.out.println(email); // 访问局部变量 :JDK 1.7 要求变量必须是常量 final 1.8之后 会自动添加final System.out.println(address); } } // 创建局部类对象 Inner inner = new Inner(); inner.show2(); } }
-
package com.kind.chapter_3; public class TestOuter { public static void main(String[] args) { Outer outer = new Outer(); outer.show(); } }
匿名内部类
-
没有类名的局部内部类(一切特征都与局部内部类相同)
-
必须继承一个父类或者实现一个接口
-
定义类,实现类,创建对象的语法合并,只能创建一个该类的对象
-
优点:减少代码量
-
确定:可读性较差
-
package com.kind.chapter_4; public class TestUsb { public static void main(String[] args) { // 创建接口类型的变量 // Usb usb = new Mouse(); // usb.service(); // 局部内部类 // class Fan implements Usb{ // @Override // public void service() { // System.out.println("连接电脑成功,风扇开始工作"); // } // } // 使用局部内部类来创建对象 // Usb usb = new Fan(); // usb.service(); // 使用匿名内部类来优化(相当于创建了一个局部内部类) Usb usb = new Usb() { @Override public void service() { System.out.println("连接电脑成功,风扇开始工作"); } }; usb.service(); } }
-
package com.kind.chapter_4; //接口 public interface Usb { // 服务 void service(); }
-
package com.kind.chapter_4; public class Mouse implements Usb{ @Override public void service() { System.out.println("连接电脑成功,鼠标开始工作了"); } }