当前位置:首页>笔记分享>Java笔记>JavaSE——内部类

JavaSE——内部类

内部类分为成员内部类、静态内部类、局部内部类、匿名内部类

概念:在一个类的内部再定义一个完整的类

特点:

  • 编译之后可生成独立的字节码文件
  • 内部类可直接访问外部类私有成员,而不破坏封装
  • 可为外部类提供必要的内部功能组件

Outer$Inner.class Outer.class

// 身体
class Body{
  // 头部
  class Header{
    // 也会生成class文件
  }
}

1.成员内部类

  • 在类的内部定义,与实例变量、实例方法同级别的类
  • 外部类的一个实例部分,创建内部类对象时,必须依赖外部类对象
  • 当外部类、内部类存在重名属性时,会优先访问内部类属性
  • 成员内部类里不能定义静态成员、可以包含静态常量(final)
// 外部类
public class Outer{
  //实例变量
  private String name = "张三";
  private int age = 20;
  //内部类
  class Inner{
    private String address = "北京";
    private String phone = "110";
    private String name = "李四";

    //方法
    public void show(){
      //打印外部类属性 此时有重名属性name
      System.out.println(Outer.this.name); // 张三
      System.out.println(age);
      //打印内部类中的属性
      System.out.println(name); // 李四
      System.out.println(address);
      System.out.println(phone);
    }
  }
}

// 测试类
public class Test{
  public static void main(String[] args){
    // 创建外部类对象
    Outer outer = new Outer();
    // 创建内部类对象
    Inner inner = outer.new Inner();

    //一步到位
    Inner inner = new Outer(.new Inner();

    inner.show();
  }
}

2.静态内部类

  • 不依赖外部类对象,可直接创建或通过类名访问,可声明静态成员
// 外部类
public class Outer{
  //实例变量
  private String name = "xxx";
  private int age = 20;

  // 静态内部类,和外部类相同
  static class Inner{
    private String address = "上海";
    private String phone = "111";
    // 静态成员
    private static int count = 1000;

    //方法
    public void show(){
      // 调用外部类的属性
      // 1. 先创建外部类对象
      Outer outer = new Outer();
      // 2. 调用外部类对象的属性
      System.out.println(outer.name);
      System.out.println(outer.age);
      // 调用静态内部类的属性和方法
      System.out.println(address);
      System.out.println(phone);
      // 调用静态内部类的静态属性
      System.out.println(Inner.count);
    }
  }
}

// 测试类
public class Test{
  public static void main(String[] args){
    // 直接创建静态内部类对象
    Outer.Inner inner = new Outer.Inner();

    inner.show();
  }
}

3.局部内部类

  • 定义在外部类方法中,作用范围和创建对象范围仅限于当前方法
  • 局部内部类访问外部类当前方法中的局部变量时,因无法保障变量的生命周期与自身相同,变量必须修饰为final
  • 限制类的使用范围
// 外部类
public class Outer{
  //实例变量
  private String name = "刘德华";
  private int age = 35;

  //方法
  public void show(){
    // 定义局部变量
    String address = "sz";

    // 局部内部类:注意不能加任何访问修饰符
    class Inner{
      private String phone = "11234";
      private String email = "ldh@qq.com";

      public void show2(){
        // 访问外部类的属性
        System.out.println(name); // 相当于 Outer.this.name
        System.out.println(age);
        // 访问内部类的属性
        System.out.println(this.phone);
        System.out.println(this.email);

        // 访问局部变量 jdk1.7要求必须常量final、jdk1.8自动添加final

      }
    }
    // 创建局部内部类对象
    Inner inner = new Inner();
    inner.show2();
  }
}

// 测试类
public class Test{
  public static void main(String[] args){
    // 创建外部类对象
    Outer outer = new Outer();

    outer.show();
  }
}

4.匿名内部类

  • 没有类名的局部内部类(一切特征都与局部内部类相同)
  • 必须继承一个父类或者实现一个接口
  • 定义类、实现类、创建对象的语法合并,只能创建一个该类的对象
  • 优点:减少代码量
  • 缺点:可读性较差
// 使用匿名内部类优化(相当于创建了一个局部内部类)
Usb usb = new Usb(){ // Usb为一个接口
  @Override
  public void service(){
    System.out.println("连接电脑成功,fan开始工作")
  }
};
usb.service();

给TA打赏
共{{data.count}}人
人已打赏
Python基础Python笔记

Python面向对象的三大特征

2021-9-29 16:05:18

Java笔记笔记分享

JavaSE——常用类

2021-9-6 0:29:55

文章低部广告位代码
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
购物车
优惠劵
有新私信 私信列表
搜索