java常用类:内部类
内部类
在一个类的内部再定义一个完整的类
-
编译后可生成独立的字节码文件。
-
内部类可以直接访问外部类的私有成员,而不破坏封装。
-
内部类可以为外部类提供必要的内部功能组件。
分类:
成员内部类
静态内部类
局部内部类
匿名内部类
成员内部类
-
在类的内部定义,与实例变量、实例方法同级别的类。
-
外部类的一个实例部分,创建内部类对象时,必须依赖外部类对象。
-
当外部类、内部类存在重名属性时,会优先访问内部类属性
-
成员内部类不能定义静态成员,但是可以定义静态常量
//外部类 public class Outer { //实例变量 private String name="zhnagsan"; private int age=20; //外部类访问成员内部类属性需要先创建一个成员内部类的对象 public void showInner(){ new Inner().show(); } //内部类 前面也可写修饰符 class Inner{ private String address="beijing"; private String phone="111"; //可以与外部类属性重名 private String name="lisi"; //静态常量 private static final String country="china"; //方法 public void show(){ //打印外部类的属性 System.out.println(Outer.this.name); System.out.println(age); //打印内部类的属性 //属性重名会优先访问内部类属性 System.out.println(name); System.out.println(address); System.out.println(phone); } } } //测试类 public class TestOuter { public static void main(String[] args) { Outer outer=new Outer(); Outer.Inner inner=outer.new Inner(); inner.show(); System.out.println("========="); outer.showInner(); } } //结果 //zhnagsan //20 //lisi //beijing //111 //========= //zhnagsan //20 //lisi //beijing //111
静态内部类
- 类的前面多了一个关键字static
- 不依赖外部类对象,可以直接创建或通过类名访问,可以声明静态成员
- 不能使用外部类的非static成员变量或者方法,只能直接访问外部类的静态成员(实例成员需要实例化外部类对象)
//外部类 public class Outer { //实例变量 private String name="zhnagsan"; private int age=20; //静态内部类 与外部类级别相同 static class Inner{ private String address="beijing"; private String phone="222"; //可以声明静态成员 private static int count=1000; public void show(){ //调用外部类的属性,要先创建外部类对象 System.out.println(new Outer().name); //调用静态内部类属性 System.out.println(address); System.out.println(Inner.count); } } } //测试类 public class TestOuter { public static void main(String[] args) { //直接创建静态内部类对象 Outer.Inner inner=new Outer.Inner(); inner.show(); } } //结果: //zhnagsan //beijing //1000
局部内部类
- 定义在外部类方法中,作用范围和创建对象范围仅限于当前方法
- 局部内部类访问外部类当前方法中的局部变量时,因无法保障变量的生命周期与自身相同,变量必须修饰为 final
- 局部内部类就像是方法里面的一个局部变量一样,是不能有 public、protected、private 以及 static 修饰符的,可以有final static静态常量
//外部类 public class Outer { //实例变量 private String name="zhnagsan"; public void show(){ //局部变量 String address="beijing"; //局部内部类:不能添加任何访问修饰符 class Inner{ //局部内部类的属性 private String phone="1000000"; public void show2(){ //访问外部类的属性 System.out.println(Outer.this.name); //访问内部类的属性 System.out.println(this.phone); //访问局部变量:jdk1.7要求变量时final,jdk1.8自动添加final System.out.println(address); } } //创建局部内部类对象 Inner inner=new Inner(); inner.show2(); } } //测试类 public class TestOuter { public static void main(String[] args) { Outer outer=new Outer(); outer.show(); } } //结果: //zhnagsan //1000000 //beijing
匿名内部类
-
没有类名的局部内部类(一切特征与局部内部类相同)
-
必须继承一个父类或实现一个接口
-
定义类、实现类、创建对象的语法合并,只能创建一个该类的对象。
-
优点:减少代码量
缺点:可读性较差
//接口 public interface USB { void service(); } //外部类 public class TestUSB { public static void main(String[] args) { //使用匿名内部类(相当于创建了一个局部内部类) USB usb=new USB() { @Override public void service() { System.out.println("连接电脑成功,风扇开始工作了。"); } }; usb.service(); } } //结果: //连接电脑成功,风扇开始工作了。

浙公网安备 33010602011771号