概述
- 内部类是在一个类的内部定义的一个类
- 内部类可以分为四种:成员内部类、局部内部类、匿名内部类、静态内部类
- 内部类可以通过private、protected修饰符很好的实现隐藏
- 内部类可以访问外部类所有成员
- 外部类不能直接访问内部类成员,需先建立内部类的对象后访问
⭐️成员内部类
-
成员内部类属于外部类的示例成员,可以通过public、default、protected、private修饰
-
在成员内部类中要访问外部类的成员应采用 外部类.this.成员变量/方法 的形式
-
创建成员内部类的实例化之前要先创建外部类对象,然后使用 外部类名.内部类名 实例 = 外部类实例名.new 内部类() 的形式创建内部类的对象
-
一般定义格式:
class Outer{ ...//外部类 class Inner{ ...//内部类 } }
-
使用示例:
class Outer{ private int data; void print(){ System.out.println("外部类打印"); Inner i = new Inner(); System.out.println("外部类数据:"+data+";内部类数据:"+i.data); } class Inner{ private int data; void print(){ System.out.println("内部类打印"); System.out.println("内部类数据:"+data+";外部类数据:"+Outer.this.data); } Inner() { data = 888; } } Outer() { data = 666; } } public class Test { public static void main(String[] args) { Outer o = new Outer(); Outer.Inner i = o.new Inner(); o.print(); i.print(); } }
-
输出:
外部类打印 外部类数据:666;内部类数据:888 内部类打印 内部类数据:888;外部类数据:666
⭐️匿名内部类
-
匿名内部类是没有名称的内部类,没有办法去引用它们。必须在创建时作为new语句的一部分来声明并创建它们的实例。
-
匿名内部类必须继承一个类或者实现一个接口。父类或接口的抽象方法匿名内部类必须去实现它。
-
匿名内部类中不能存在任何静态成员或方法。
-
格式为 new 接口名/父类名() {类体}
-
示例:
interface A{ //接口A abstract void print(); } class B{ //父类B void print(){ System.out.println("B类打印"); } } class Outer{ A a = new A(){ public void print(){ System.out.println("匿名类打印"); } }; Outer() { a.print(); new B().print(); } } public class Test { public static void main(String[] args) { Outer o = new Outer(); } }
-
输出:
匿名类打印 B类打印
静态内部类
-
静态内部类和成员内部类相比多了一个static修饰符。它与类的静态成员变量一般,是不依赖于外部类的。
-
因为是静态的,因此不需要外部类实例化即可使用。可以访问外部类的静态成员和静态方法。但是于此同时,静态内部类中也无法访问外部类的非静态成员。
-
访问外部类的成员直接以 外部类.成员变量/方法 的形式访问。
-
静态内部类对象的创建 外部类.内部类 类名 = new 外部类.内部类()
-
示例
class Outer{ private static int data; static class Inner{ Inner() { System.out.println("data:"+Outer.data); } } static{ data = 666; } } public class Test { public static void main(String[] args) { Outer o = new Outer(); Outer.Inner i = new Outer.Inner(); } }
-
输出:
data:666
局部内部类
-
局部内部类存在于方法中。
-
局部内部类和成员内部类的区别在于局部内部类的访问权限仅限于该方法。虽然可以引用方法内成员变量,但该成员必须声明为 final
-
局部内类不允许使用访问权限修饰符和static修饰符。
-
示例:
class Outer{ void show(final int a,final int aa){ class Inner{ void print(){ System.out.println(a+"的平方是"+aa); } } new Inner().print(); } } public class Test { public static void main(String[] args) { int a = 6; Outer o = new Outer(); o.show(a,a*a); } }
-
输出:
6的平方是36
❤️ 本回完!❤️ ❤️ ❤️