Java-内部类汇总

1.内部类概述

1-简介

类内部可既可定义成员变量和方法,也可定义另一个类。若在类Outer内部再定义一个类Inner,则Inner即为内部类(嵌套类),Outer即为外部类(宿主类)。

内部类可以有private与protected修饰(实现隐藏),内部类拥有外部类所有元素的访问权限。(depends)

内部类形式分布如下:
image

2-特点与说明

  1. 内部类仍是一个独立的类,编译后内部类会被编译成独立的.class文件,但前面冠以外部类类名和$。在编译成功后,会出现这样两个class文件:
    OuterClass.class
    OuterClass\$InnerClass.class(不含\)
  2. 内部类不能以普通方式访问。如果我们需要创建某个内部类对象,必须要利用外部类的对象通过.new来创建内部类: Outer.Inner oi = new Outer().new Inner();
  3. 内部类声明为静态的则仍只能访问外部类的静态成员变量。
  4. 外部类可直接通过内部类的类名访问内部类;外部类以外的其他类中则需通过内部类的完成类名访问内部类。
  5. 内部类不可与外部类重名。

2.实例内部类(未用static修饰的内部类)

特点
  • 调用方式 Outer.Inner oi = new Outer().new Inner();
  1. 外部类的静态方法和外部类以外的其他类中需通过外部类的实例创建内部类的实例。

  2. 实例内部类可访问外部类的所有成员(多层嵌套同理)。

  3. 外部类只能通过内部类的实例去访问内部类的成员。

     Inner inner = new Inner();
     inner.a++;
    
  4. 外部类实例与内部类实例为一对多对应关系。

  5. 实力内部类中不能定义static成员,除非同时使用final和static修饰。

3.静态内部类(static修饰的内部类)

实例代码
public class Outer {
    static class Inner {
        // 静态内部类
    }
}
特点:
  1. 创建静态内部类的实例时不需创建外部类的实例
    Outter.Inner inner = new Outer.Inner();
  2. 静态内部类可以定义静态成员和实例成员。外部类以外其他类需通过完成类名访问静态内部类中静态成员int b2 = Outer.Inner.b;,访问实例成员需通过静态内部类的实例来访问。
  3. 静态内部类可以直接访问外部类的静态成员,需通过外部类的实例访问外部类的实例成员。

4.局部内部类(再一个方法中定义的内部类)

特点
  1. 局部内部类和局部变量一样不能使用访问修饰符与static修饰符。
  2. 局部内部类只在当前方法中有效。
  3. 局部内部类中不能定义static成员
  4. 局部内部类中还可包含内部类,要求同上。
  5. 局部内部类中可访问外部类所有成员
  6. 局部内部类中只可访问当前方法中final类型的参数与变量,若要访问外部类中与方法成员中同名的成员可用Outer.this.Member访问

5.匿名内部类(匿名类)

匿名类指没有类名的内部类,必须在创建时使用new语句来声明类。

接口/继承类 实例 = new 接口/继承类(){
	//类的主体
};

//实例 Anony为接口
public Anony anony = new Anony(){
    public int getSum() {
        Outer.this.aa = 33;
        return aa + 22;
    }
}; //分号不可省!


//调用方式
Outer outer = new Outer();
System.out.println(outer.anony.getSum(3)); //通过外部类调用匿名类调用方法
实现方式
  1. 继承一个类,重写其方法
  2. 实现一个接口(多个),实现其方法
特点
  1. 匿名类和局部内部类一样可访问外部类的所有成员。若位于方法中同样的只能访问方法中final的局部变量和参数。
  2. 匿名类允许使用非静态代码块进行成员数实话操作。
  3. 匿名类的非静态代码块会在父类的构造方法之后被执行。
posted @ 2021-09-13 18:16  rttrti  阅读(74)  评论(0编辑  收藏  举报