内部类

声明: 本文主要作为作者的复习笔记,由于作者水平有限,难免有错误和不准确之处,欢迎读者批评指正.

内部类

将一个类定义在另一个类的内部,这种类称之为内部类;

  1. 内部类的设计也属于封装的一种,封装体现的保护性和易用性在内部类上仍然适用;
  2. 现实生活中的内部类:
    发动机类和汽车类的关系,发动机就嵌套在汽车的内部;
  3. 根据内部类定义的位置以及关键字,一共分为四种内部类: 成员内部类、静态内部类、方法内部类、匿名内部类;
  4. 匿名内部类是Lambda表达式的前身,Lambda表达式其实就是一个匿名内部类的简化写法;

成员内部类

直接定义在一个类的内部,不加任何修饰符,这种内部类称为成员内部类;

  1. 直接在*.java源文件中定义的类称为外部类/普通类;
  2. 成员内部类的使用原则: 类比外部类的成员方法/属性; 成员内部类必须依赖外部类对象产生,先要产生外部类对象,才能产生成员内部类对象; 要产生一个发动机对象,必须先得有汽车对象,然后产生发动机对象;
  3. 关于成员内部类的实例化:
    a. 在外部类的内部进行实例化,就和普通类的产生一模一样;
    b. 在外部类的外部产生内部类的对象 => 前提是内部类在外部可见的才能创建;
    语法:
    外部类.内部类 内部类引用名称 = new 外部类().new 内部类();
  4. 成员内部类和他的外部类可以方便的互相访问彼此的私有域(这是内部类存在的最大价值与意义),内部类可以直接调用外部类的私有域(因为创建内部类对象会传入一个外部类的对象),外部类必须通过内部类的对象来调用其私有域;
  5. 在成员内部类中不能定义任何的静态域,可以访问外部类的静态域(JDK16之后放开了在成员内部类中定义静态域);
  6. 内部类可以使用private进行封装,对外部完全隐藏;
  7. 内部类和外部类不是继承关系,也不是简单的包含关系,内部类定义在外部类之中,需要依赖外部类存在;

静态内部类

直接定义在外部类之中,使用关键字static修饰,称为静态内部类;

  1. 静态内部类就和普通类一样,只不过是定义在一个类的内部而已,不需要依赖外部类对象; 例如汽车里的手机支架和汽车本身没什么关系,放在哪里都可以,只不过当前放在汽车里面;
  2. 成员内部类的使用有很多限制,反而静态内部类的使用更加灵活,因此应用更加广泛;
  3. 关于静态内部类的使用:
    a. 在外部类的内部创建静态内部类对象: 和普通类完全相同;
    b. 在外部类的外部创建静态内部类的对象,不需要依赖外部类对象,前提是静态内部类要在当前创建位置可见;
    语法:
    外部类.内部类 内部类引用 = new 外部类.内部类();
  4. 由于在静态内部类中不依赖外部类对象,因此产生静态内部类时,没有产生外部类对象; 静态内部类可以拥有自己的成员域,但是由于没有传入外部类对象,因此必须显示通过外部类对象访问外部类的成员域;
  5. 无论哪种内部类,内外部类的私有权限,都是可见的! private对于内部类和其嵌套的外部类来说,都是可见的;
  6. 静态内部类可以直接访问外部类的私有静态属性,成员属性需要通过外部类的对象调用; 外部类可以通过内部类的对象来访问内部类的私有域(静态|非静态)都可以;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内部类是指在一个类的内部定义的另一个类。内部类可以访问外部类的私有成员,而不需要使用访问器或者公共方法。 Java中有四种类型的内部类:成员内部类、局部内部类、匿名内部类和静态内部类。下面分别介绍它们的写法。 1. 成员内部类 成员内部类是定义在外部类的成员位置上的类,它可以访问外部类的所有成员,包括私有成员。 ```java public class OuterClass { private int outerField; public class InnerClass { private int innerField; public void setOuterField(int value) { outerField = value; } public void setInnerField(int value) { innerField = value; } } } ``` 2. 局部内部类 局部内部类是定义在方法或代码块内部的类,它只能在定义它的方法或代码块中使用。 ```java public class OuterClass { private int outerField; public void method() { int localVariable = 0; class InnerClass { private int innerField; public void setOuterField(int value) { outerField = value; } public void setInnerField(int value) { innerField = value; } public void setLocalVariable(int value) { localVariable = value; // 局部变量必须是 final 或 effectively final } } InnerClass inner = new InnerClass(); inner.setOuterField(1); inner.setInnerField(2); inner.setLocalVariable(3); } } ``` 3. 匿名内部类 匿名内部类是没有名字的内部类,它通常用来实现接口或继承某个类。 ```java public class OuterClass { public void method() { Runnable runnable = new Runnable() { @Override public void run() { System.out.println("Hello, world!"); } }; Thread thread = new Thread(runnable); thread.start(); } } ``` 4. 静态内部类 静态内部类是定义在外部类内部的 static 类,它只能访问外部类的静态成员。 ```java public class OuterClass { private static int outerStaticField; public static class InnerClass { private int innerField; public void setOuterStaticField(int value) { outerStaticField = value; } public void setInnerField(int value) { innerField = value; } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值