一:内部类的讨论
(1)定义:所谓内部类就是在一个类内部进行其他类结构的嵌套操作。
(2)分类:成员内部类 局部内部类 匿名内部类 静态内部类.
(1)成员内部类:
-
class Super{ int a; public Super() {} public void name() {} class Sub{ int b; public Sub() {} public void name() {} } }
定义在类中和成员变量方法一共个位置的类,里面也有自己的属性和构造方法,成员方法,类似Super是人,这个Sub是心脏.
-
Super.Sub sub=new Super().new Sub();
获取这个内部类对象的语法为这样,Super.Sub可以看作这个Super的一个类属性,然后需要先new一个Super的对象再可以new一共Sub对象.
-
成员内部类可以直接调用外部类的属性和方法(包括私有和静态,静态方法直接调用,不需要使用类名调用).但当调用同名方法时,需要创建外部类的对象调用,不然默认使用自己的方法.
class Super{ int a; public Super() {} public void name() {System.out.println("Super name");} public static void m1() {} private void m2() {System.out.println("m2");} class Sub{ int b=a; public Sub() {} public void name() { new Super().name(); m1(); m2(); } } }
(2)局部内部类:
- 定义:定义在方法中的类,可以看成临时变量.
- 代码:
class Super{ int a; public Super() {} public void name() {System.out.println("Super name");} public static void m1() {} private void m2() {System.out.println("m2");} public void m3() { class Sub{ int b=a; public Sub() {} public void m1() { name(); m2(); } private void m2() { } } Sub sub=new Sub(); sub.m1(); } }
-
同样,局部内部类可以定义属性方法,也可以直接调用外部类的属性方法,但只能在m3方法里面创建对象使用.
(3)匿名内部类
- 定义:不声明类的名称,直接使用new 类名(){方法体}
- 代码:
HashSet<Integer> aHashSet=new HashSet<Integer>(); aHashSet.add(1); aHashSet.add(2); aHashSet.add(3); aHashSet.forEach(new Consumer<Integer>() { @Override public void accept(Integer t) { System.out.println(t); } });
这里使用HashSet通过forEach遍历时,使用了匿名内部类来实现.直接 new Consumer<>(){ 重写accept方法 } 这个匿名内部类有助于我们使用lambda表达式.
(4)静态内部类:
- 使用static来修饰的成员内部类
-
class Super{ static class Sub{ int a; public static void name() { } public void m1() { } private void m2() { } } public void m3() { Sub.name(); } }
定义的静态内部类还是可以定义成员和方法.调用其方法需要创建对象,但静态方法不用.