常用类第25天(内部类,成员内部类,静态内部类,局部内部类)

内部类

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

  1. 编译之后可生成独立的字节码文件
  2. 内部类可以直接访问外部类的私有成员而不破坏封装
  3. 可以为外部类提供必要的内部功能组件
    image
    内部类分类:成员内部类,静态内部类,局部内部类,匿名内部类

成员内部类

  • 在类的内部定义,与实例变量,实例方法同级别的类
  • 外部类的一个实例部分,创建内部类对象时,必须依赖外部类对象
    第一种写法:
//想访问另一个类的内部类,需要先实例化那个外部类
        Outer outer = new Outer();
        //然后通过实例化对象去实例化它的内部类
        Inner inner=outer.new Inner();

第二种写法:

//或者写成一步
        Inner inner=new Outer().new Inner();
  • 当外部类和内部类存在重名属性时,会优先访问内部类属性,如果想访问外部类的属性,语法如下
外部类名.this.属性

image

  • 成员内部类不能定义静态成员,但是可以包含静态常量

静态内部类

不依赖外部类对象,可直接创建或通过类名访问,可声明静态成员,静态内部类与外部类同等级
注意:只有内部类可以用static修饰
静态内部类访问外部类的话,需要先实例化外部类,然后才能调用外部类的属性
定义静态内部类,访问外部类属性需要实例化外部类.访问静态内部类属性可直接访问

public class Outer {
    private String name="张三";
    private int age=18;
    //静态内部类:和外部类相同
    static class Inner{
        private String address="深圳";
        private int phone=121;
        //静态成员
        private static int count=1000;

        public void show()
        {
            //静态内部类访问外部类的话,需要先实例化外部类
            Outer outer = new Outer();
            //然后才能调用外部类的属性
            System.out.println(outer.name);
            System.out.println(outer.age);
            System.out.println(address);
            //调用静态内部类的方法和属性
            System.out.println(address);
            System.out.println(phone);
            System.out.println(count);
        }

    }
}

实例化静态内部类

//可以直接创建静态内部类对象
        Outer.Inner inner = new Outer.Inner();
        //调用方法
        inner.show();

局部内部类

与局部变量类似,定义在方法中

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

    public void show() {
        //定义局部变量
        String address = "长沙";
        //局部内部类(不能加任何访问修饰符)
         class Inner {
             //局部内部类属性,不能包含static修饰的属性
            private String phone = "14132312";
            private String email = "dfsefse";
            //创建局部内部类的方法
            public void show2(){
                //可直接访问外部类的属性
                System.out.println(Outer.this.name);
                System.out.println(Outer.this.age);
                //访问内部类的属性
                System.out.println(phone);
                System.out.println(email);
                //访问局部变量
                System.out.println(address);
            }
        }
        //想要执行局部内部类的方法,需要在外部类方法中实例化局部内部类
        Inner inner = new Inner();
         inner.show2();
    }

}

使用:

Outer outer = new Outer();
        outer.show();
posted @   不再犹豫27  阅读(39)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示