JavaEE-10-内部类(Java)

内部类定义:

  将一个类定义在另一个类里面,对里面那个类就称为内部类(内置类,嵌套类)

  主要分为四种:非静态内部类,静态内部类,匿名类,本地类

访问特点:

  1.内部类可以直接访问外部类的成员,包括私有成员;(这是内部类的最大优点)

  2.外部类要访问内部类的成员,必须要先建立内部类的对象。

   格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象

   举例:Outer.Inner oi = new Outer().new Inner();

  使用场所:一般用于类的设计:

    分析事物时,发现该事物描述中还有事物,而且这个事物还在访问被描述事物的内容。

    这时就是还有的事物定义成内部类来描述。

内部类的修饰符:

  1.如果内部类是静态的,相当于一个外部类,因此只能访问外部类的静态成员;

    访问方式:外部类名.内部类名 对象名 =new 外部类名.内部类名();

    举例:Outer.Inner oi = new Outer.Inner();

  2.如果内部类中定义了静态成员,该类也必须是静态的。

为什么内部类能直接访问外部类中成员呢?

  那是因为内部类持有了外部类的引用:外部类名.this。

  举例:System.out.println(Outer.this.num);//此时访问的num是外部类Outer的成员变量

 1 class Outer{
 2     public int num = 10;
 3     class Inner{
 4         public int num =20;
 5         public void show(){
 6             int num = 30;
 7             System.out.println(num);//就近原则,num=30
 8             System.out.println(this.num);//Inner类调用show方法,所以num=20
 9             System.out.println(Outer.this.num);//通过外部类名限制this对象,num=10
10         }
11     }
12 }
Class InnerClassTest{
  public static void main(String[] args){
    Outer.Inner oi = new Outer().newInner();
    oi.show();
  }
}

 

内部类在局部位置上只能访问局部中被final修饰的局部变量,如下例:

原因:因为局部变量会随着方法的调用完毕而消失,这个时候,局部对象并没有立马从堆内存中消失,还要使用那个变量。

   为了让数据还能继续被使用,就用final修饰,这样,在堆内存里面存储的其实是一个常量值。

 1 class Outer
 2 {
 3     int num = 3;
 4     void method()
 5     {
 6         final int x = 9;
 7         class Inner
 8         {
 9             void show()
10             {
11                 System.out.println("show ..."+x);
12             }
13         }
14         Inner in = new Inner();
15         in.show();
16     }
17 }
18 
19 class InnerClassDemo3 
20 {
21     public static void main(String[] args) 
22     {
23         new Outer().method();
24     }
25 }

匿名内部类:

  就是内部类的简写格式。(其实就是一个子类对象)

  (使用接口或者抽象类时,都必须创建一个子类,才能实现其方法。有时候为了快速使用,直接实例化一个抽象类,并“当场实现其抽象方法”,既然实现了抽象方法,那么就是一个新的类,只是这个类没有命名,称为“匿名类”)

  前提:内部类必须继承或者实现一个外部类或者接口。

  格式:new 父类or接口() {子类内容}

  使用场景:当函数参数是接口类型时,而且接口中的类型不超过三个,可以用匿名内部类作为实际参数进行传递。

  举例:

 1 class Outer
 2 {
 3     int num = 4;
 4     /*
 5     class Inner extends Demo //方式一
 6     {
 7         void show()
 8         {
 9             System.out.println("show ..."+num);
10         }
11     }
12     public void method()
13     {
14         new Inner().show();
15     }
16     */
17     public void method()//方式二
18     {
19         //new Inner().show();
20         new Demo()
21         {
22             void show()
23             {
24                 System.out.println("show ..."+num);
25             }
26         }.show();
27     }
28 }
29 
30 class InnerClassDemo4 
31 {
32     public static void main(String[] args) 
33     {
34         new Outer().method();
35     }
36 }

 

posted @ 2019-06-21 11:58  benon  阅读(207)  评论(0编辑  收藏  举报