随笔 - 402  文章 - 1 评论 - 20 阅读 - 113万
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

在类中再定义一个类,则将在类中再定义的那个类称为内部类;

内部类可分为成员内部类、局部内部类、匿名类

1、成员内部类

在内部类中可以随意使用外部类的成员方法以及成员变量,尽管这些类成员被修饰为private;

但内部类的成员只有在内部类的范围之内是可知的,不能被外部类使用

内部类的对象实例化操作必须在外部类

使用this关键字获取内部类与外部类的引用

复制代码
public class TheSameName{
    private int x;
    private class Inner{
        private int x=9;
        public void doit(int_x){
            x++;  //调用的是形参x
            this.x++;   //调用内部类的变量x
            TheSameName.this.x++;    //调用外部类的变量x
        }
   }
}
复制代码

2、局部内部类

复制代码
interface OutInterface2{
}
class OuterClass3{
    public OutInterface2  doit(final String x){
        class InnerClass2 implements OutInterface2{
            InnerClass2(String s){
                s=x;
                System.out.println(s);
            }
        }
        return new InnerClass2("doit");
    }
}
复制代码

内部类被定义在了doit()方法内部,内部类InnerClass2是doit()方法的一部分,并非OuterClass3类中的一部分,所以在doit()方法的外部不能访问该内部类,但是该内部类可以访问当前代码快的常量以及外部类的所有成员。

3、匿名内部类

匿名类的所有实现代码都需要在大括号之间进行编写

return new A(){
    ...//内部类体
};

 

匿名内部类没有名称,实质上这种内部类的作用就是创建一个实现于OutInterface2接口的匿名类的对象:

复制代码
class OuterClass4{
    public OutInterface2 doit(){
        return new OutInterface2(){
            private int i=0;
            public int getValue(){
                return i;
            }
        };  //这个分号并不是代表定义内部类结束的标识,而是代表创建OuterInterface2引用表达式的标识
    }
}
复制代码

4、静态内部类

在内部类前添加修饰符static,这个内部类就变成静态内部类了;

一个静态内部类中可以声明static成员,但是在非静态内部类中不可以声明静态成员;

静态内部类不可以使用外部类的非静态成员;

5、内部类的继承

复制代码
public class OutputInnerClass extends ClassA.ClassB{ //继承内部类ClassB
    public OutputInnerClass(ClassA a){
        a.super();
    }
}
class ClassA{
    class ClassB{
    }
}
复制代码

在某个类继承内部类时,必须硬性给予这个类一个带参数的构造方法,并且该构造方法的参数为需要继承内部类的外部类的引用,同时在构造方法中使用a.super()语句,这样才能为继承提供了必要的对象引用。

posted on   chamie  阅读(404)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示