• Java内部类


    目录

    概念:

    基本语法:

    局部内部类

    匿名内部类:

     匿名内部类的最佳使用场景:

    成员内部类

    6.外部其他类 访问 成员内部类

     第一种:直接new一个外部类,在利用该对象new一个内部类

    第二种:在外部类中提供一个方法,返回一个内部类实例

    静态内部类

    分组:


    概念:

    一个类的内部又完成的嵌套了另一个类结构,被嵌套的类称为内部类,嵌套其他类的类成为外部类。内部类最大的特点就是可以直接访问私有属性,并且可以体现类与类之前的包含关系。

    基本语法:

    局部内部类

    说明:局部内部类是定义在外部类的局部位置,比如方法中,并且有类名、

    1.可以直接访问外部类的所有成员,包含私有的

    2.不能添加访问修饰符以为它的地位就是一个局部变量,局部变量不可以添加访问修饰符。但是可以使用final修饰,因为局部变量也可以使用final

    3.作用域:仅仅在定义它的方法或代码块中

    4.局部内部类 访问 外部类的成员【直接访问】

    5.外部类 访问 局部内部类的成员

    访问方式:创建对象,再访问(注意:必须在作用域内)

     6.外部其他类 不能访问 局部内部类(因为局部内部类地位是一个局部变量)

    7.如果外部类和局部内部类的成员重名时,默认遵循就近原则,如果想访问外部类的成员,则可以使用(外部类名.this.成员)去访问(第一点的那个图的右边红框就是演示示例

    匿名内部类:

    非常重要!!!!!!

    说明:匿名内部类是定义在外部类的局部位置,比如方法中,并且没有类名

    本质是类,是一个内部类,没有名字(在系统内部),同时还是一个对象

    1.匿名内部类的基本语法

    new 类或接口(形参列表) {

            类体

    }

     调用一个实现IA接口的类,并只使用一次

    接口的匿名内部类

    1. class Outer04 {//外部类
    2. private int n1 = 10;//属性
    3. public void method() {//方法
    4. IA tiger = new IA() {
    5. @Override
    6. public void cry() {
    7. System.out.println("老虎叫唤...");
    8. }
    9. };//这本身是条语句,分号不能少
    10. tiger.cry();
    11. }
    12. }
    13. interface IA {//接口
    14. public void cry();
    15. }

    下面的匿名内部类名字了解即可

    其实该内部类可以认为是

    1. class xxxx implements IA {
    2. @Override
    3. public void cry() {
    4. System.out.println("老虎叫唤...");
    5. }
    6. }

    其中xxxx是【外部类名+$+数字】

    发现创建两个不同的匿名内部类时,匿名内部类的类名中的数字时从小到大依次递增的

    匿名内部类既是一个类的定义,同时它本身也是一个对象,因此从语法上看,它即有定义类的特征,又有创建对象的特征。

    1. public class AnonymousInnerClassDetail {
    2. public static void main(String[] args) {
    3. Outer05 outer05 = new Outer05();
    4. outer05.f1();
    5. }
    6. }
    7. class Outer05 {
    8. private int n1 = 99;
    9. public void f1() {
    10. //创建一个基于类的匿名内部类
    11. Person person = new Person("tom") {
    12. @Override
    13. public void hi() {
    14. System.out.println("匿名内部类重写了 hi方法 n1=" + n1 +
    15. " 外部内的n1=" + Outer05.this.n1);
    16. System.out.println("Outer05.this hashcode=" + Outer05.this);
    17. }
    18. };
    19. person.hi();//动态绑定
    20. }
    21. }
    22. class Person {//类
    23. private String name;
    24. public Person(String name) {
    25. this.name = name;
    26. }
    27. public void hi() {
    28. System.out.println("Person hi()");
    29. }
    30. public void ok() {
    31. System.out.println(name);
    32. }
    33. public void say(String str) {
    34. System.out.println(str);
    35. }
    36. }

     3.可以直接访问外部类的所有成员,包含私有的

    4.不能添加访问修饰符,以为它的地位就是一个局部变量

    5.作用域:仅仅在定义它的方法或代码块中

    6.匿名内部类 访问 外部类成员【访问方式:直接访问】

    7.外部其他类 不能访问 匿名内部类(因为匿名内部类地位是一个局部变量)

    8.如果外部类和匿名内布列的成员重名时,匿名内部类访问的话,默认遵循就近原则,如果想访问外部类的成员,则可以使用(外部类名.this.成员)去访问

     匿名内部类的最佳使用场景:

    作为实参传入方法

    经典案例:

     

    成员内部类

    说明:成员内部类是定义在外部类的成员位置,并且没有static修饰

    1.可以持节访问外部类的所有成员,包含私有的

    2.可以添加任意访问修饰符,以为它的地位就是一个成员

     

    3.作用域,和外部类的其他成员一样,为整体类体,在外部类的成员方法

    4.成员内部类 访问 外部类【访问方式:直接访问】

    5.外部类 访问 内部类【访问方式:创建对象,再访问】

    6.外部其他类 访问 成员内部类

     第一种:直接new一个外部类,在利用该对象new一个内部类

    第二种:在外部类中提供一个方法,返回一个内部类实例

     

    7.如果外部类和内部类的成员重名时,内部类访问的话,默认遵循就近原则,如果想访问外部类的成员,则可以使用(外部类名.this.成员)去访问

    静态内部类

    说明:静态内部类是定义在外部类的成员位置,并且有static修饰

    1.可以直接访问外部类的所有静态成员,但是不能直接访问非静态成员(可以创建一个对象访问)

    2.可以添加任意访问修饰符,因为它的位置就是一个成员

    3.作用域:同其他的成员,为整体类体

    4.静态内部类 访问 外部类【访问方式:直接访问所有静态成员】

    5.外部类 访问 静态内布列【访问方式:创建对象,再访问】

    外部类方法中

     6.外部其他类 访问 静态内部类

    第一种方式

     

    第二种方式

    也可以使用非静态方法,就是让static去掉,这里不演示了

     

    7.如果外部类和内部类的成员重名时,内部类访问的话,默认遵循就近原则,如果想访问外部类的成员,则可以使用(外部类名.this.成员)去访问

    分组:

    局部内部类、匿名内部类

    成员内部类、静态内部类

  • 相关阅读:
    抖音短视频矩阵系统多账号矩阵源头开发源码分享
    【前端】解决Bootstrap3与Bootstrap4同时使用的CSS冲突问题
    使用vite打包时候遇到的坑
    leetcode:1323. 6 和 9 组成的最大数字(python3解法)
    GitLab多人开发步骤
    【网络编程】第一章 网络基础(协议+OSI+TCPIP+网络传输的流程+IP地址+MAC地址)
    鸿鹄工程项目管理系统 Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统
    HyperLynx(四)差分传输线模型
    合封芯片科普,合封技术的实用性
    【Flink】
  • 原文地址:https://blog.csdn.net/qq_63918780/article/details/125384265