浅析理论:
一、内部类概念和分类 写在一个类的内部的类,称为内部类 根据内部类的位置分为三种: 1、静态内部类 2、成员内部类 3、局部内部类 二、各种内部类的实例化方式 注:静态内部类与成员内部类的访问控制权限和静态变量与成员变量类似 1、静态内部类 外部类.内部类 变量 = new 外部类.内部类(); 2、成员内部类 //成员内部类1 外部类.内部类 变量 = new 外部类().new 内部类(); //成员内部类2 外部类 变量 = new 外部类(); 外部类.内部类 参数2 = 变量. new 内部类(); 3、局部内部类 外部不能访问,仅能在所定义的方法中进行实例化 三、各种内部类对外部类的访问权限 1、静态内部类 静态内部类不能访问外部类的成员(成员变量或成员方法或成员常量) 2、成员内部类 可以访问外部类的一切,访问外部成员的写法是(外部类.this.xxx) 3、局部内部类 如果定义静态方法中,尽可以访问修饰为static的 如果定义在成员方法方法中,可以访问外部类的一切(外部类.this.xxx) 四、匿名内部类概念 没有类名的内部类,此类仅能被创建一次对象 五、匿名内部类语法 1、匿名继承一个类 new XXX(参数) { //类声明 } 2、匿名实现一个接口 new XXX() { //类声明,需要实现接口中的所有方法 } 六、内部类的用途 1、高内聚 让相关代码放到一块 2、权限控制 便于权限控制 3、匿名内部的用途 当你需要一个对象且仅需要一个的时候
浅析案例:
package com.gongxy; import java.util.Date; /** * @author gongyg * @date 2020/8/25 17:33 */ public class InnerTest { /* 静态匿名内部类 */ public static Date date = new Date(){ @Override public String toString() { return "123"; } }; String name; /* 成员内部类 */ class Inner1Test { } static String sex; /* 静态内部类 */ static class Inner2Test { } public void testMethod(){ /* 局部内部类 */ class Inner3Test { } /* 局部内部类实例化 */ Inner3Test inner3Test = new Inner3Test(); } }
package com.gongxy; import java.util.*; /** * @author gongyg * @date 2020/8/25 17:50 */ public class Demo { public static void main(String[] args) { /* 静态内部类实例化 */ InnerTest.Inner2Test inner2Test = new InnerTest.Inner2Test(); InnerTest innerTest = new InnerTest(); /* 成员内部类实例化 */ InnerTest.Inner1Test inner1Test = innerTest.new Inner1Test(); System.out.println(innerTest.date.toString()); List<String> list = new ArrayList<String>(); list.add("b"); list.add("c"); list.add("a"); System.out.println(list); /* 匿名类 */ Collections.sort(list, new Comparator<String>() { @Override public int compare(String a, String b) { return a.hashCode() - b.hashCode(); } }); System.out.println(list); } }