Java中的内部类

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. 只能创建一个匿名内部类的实例

posted @ 2019-09-22 22:16  丁茜萌萌哒  阅读(179)  评论(0编辑  收藏  举报