Java中的内部类
Java中在类的内部定义的类叫做内部类,而外面的类叫做外部类,内部类可以分为四种,分别是静态内部类,成员内部类,局部内部类,匿名内部类
静态内部类
在静态内部类中可以访问外部类的静态方法和静态变量,即使是private类型的。
静态内部类的实例化不需要依赖于外部类
1 public class OutClass {
2
3 private int a = 10 ;
4 private static int b = 100;
5 private static void show(){
6 System.out.println("show");
7 }
8 private void showMaker(){
9 System.out.println("showMaker");
10 }
11 public static class InnerClass{
12 int c = b - 20;
13 int d = a / b; //编译出错,静态内部类只能访问外部类的静态变量(包括private修饰的)
14 public static void main(String[] args) {
15 show();
16 showMaker(); //编译出错,静态内部类只能访问外部类的静态方法(包括private修饰的)
17 }
18 }
19 }
成员内部类
将静态内部类的static去掉就成了成员内部类,成员内部类不能定义静态方法和属性
成员内部类的实例化依赖于外部类的实例化
1 public class OutClass {
2
3 private int a = 10 ;
4 private static int b = 100;
5 private static void show(){
6 System.out.println("show");
7 }
8 private void showMaker(){
9 System.out.println("showMaker");
10 }
11 public class InnerClass{
12 int c = b - 20;
13 static int d = 10; //编译出错,成员内部类不允许定义静态变量
14 public static void slow(){ //编译出错,成员内部类不允许创建静态方法
15 System.out.println("low");
16 }
17 }
18 }
局部内部类是定义在代码块中的类,在java中运用的最少的就是局部内部类了。局部内部类不能被public,protected,private修饰
1 public void myInnerClass(){
2 class InnerClass{ //相当于局部变量,不能用public private protected修饰
3 private String name = "lily";
4 public void showInner(){
5 System.out.println(name;
6 }
7 }
8 }
匿名内部类
局部内部类没有类名不能extends,implements,class,没有构造函数,匿名内部类设计是为了让代码更加紧凑,但相对的代码的可读性下降了。比较常见的匿名内部类运用在GUI程序中。在没有lambda表达式之前我们创建线程的方式就是匿名内部类
1 new Thread(new Runnable() {
2 @Override
3 public void run() {
4
5 }
6 }).start();
匿名内部类需要注意的一些
1. 匿名内部类不能定义静态成员,方法和类
2. 匿名内部类不能是public protected private static
3. 匿名内部类不能有构造函数
4. 一个匿名内部类一定是跟在new后面的,这个匿名内部类必须继承一个类或者实现一个接口
5. 只能创建一个匿名内部类的实例