首页 > 其他分享 >问:关于内部类,知道这些就够了~

问:关于内部类,知道这些就够了~

时间:2024-09-08 12:20:26浏览次数:10  
标签:部类 内部 静态 成员 就够 匿名 实例 关于

内部类是一种强大的特性,允许我们在一个类的定义中嵌套另一个类的定义。内部类提供了更好的封装性,可以将逻辑上相关的类组织在一起,并且可以直接访问外部类的成员。

一、成员内部类

成员内部类是定义在外部类中的非静态类。作为外部类的一个成员,它可以无条件地访问外部类的所有成员变量和方法,包括私有的。成员内部类依赖于外部类的实例,因此在创建成员内部类的实例之前,必须先存在外部类的实例。

代码示例

public class OuterClass {
    private int outerVariable = 10;

    class MemberInnerClass {
        void accessOuterMembers() {
            System.out.println("Outer variable: " + outerVariable);
        }
    }

    public static void main(String[] args) {
        OuterClass outer = new OuterClass();
        // 创建成员内部类的实例需要通过外部类实例来引用
        OuterClass.MemberInnerClass inner = outer.new MemberInnerClass();
        inner.accessOuterMembers(); // 输出:Outer variable: 10
    }
}

二、静态内部类

静态内部类是定义在外部类中的静态类。与成员内部类不同,静态内部类不依赖于外部类的实例。因此,它不能直接访问外部类的非静态成员,只能访问静态成员。静态内部类的创建无需外部类实例,可以直接通过类名来引用。

代码示例

public class OuterClass {
    private static int outerStaticVariable = 20;

    static class StaticInnerClass {
        void accessOuterMembers() {
            System.out.println("Outer static variable: " + outerStaticVariable);
        }
    }

    public static void main(String[] args) {
        // 静态内部类可以直接通过类名来创建实例
        OuterClass.StaticInnerClass inner = new OuterClass.StaticInnerClass();
        inner.accessOuterMembers(); // 输出:Outer static variable: 20
    }
}

三、匿名内部类

匿名内部类是没有名称的内部类,通常用于实现接口或继承某个类,同时只需要使用一次的情况下。匿名内部类可以在创建实例的同时进行类的定义,非常适合于快速的、一次性的任务。

代码示例

// 定义一个接口,包含一个无参无返回值的方法 doSomething  
interface MyInterface {    
    void doSomething();    
}    
  
// 外部类 OuterClass,包含 main 方法作为程序的入口点  
public class OuterClass {    
      
    public static void main(String[] args) {    
        // 使用匿名内部类来实现 MyInterface 接口  
        // 并重写 doSomething 方法  
        MyInterface myObj = new MyInterface() {    
            @Override    
            public void doSomething() {    
                // 在控制台输出一条消息,表明该方法被调用  
                System.out.println("Doing something in Anonymous Inner Class");    
            }    
        };    
          
        // 调用匿名内部类中重写的 doSomething 方法  
        myObj.doSomething(); // 控制台输出:Doing something in Anonymous Inner Class    
          
        // 假设我们有一个方法,该方法接受 MyInterface 类型的参数  
        // 我们可以将上面创建的匿名内部类对象作为参数传递  
        useMyInterface(myObj);  
    }  
      
    // 一个示例方法,接受 MyInterface 类型的参数,并调用其 doSomething 方法  
    public static void useMyInterface(MyInterface obj) {  
        obj.doSomething(); // 再次调用 doSomething 方法  
    }  
}

在示例中,创建了一个实现了MyInterface接口的匿名内部类,并立即创建了其实例。匿名内部类不仅可以实现接口,还可以继承其他类,但需要注意的是,Java不支持多重继承,因此匿名内部类只能继承一个类或实现一个接口。

内部类访问外部类成员的限制

成员内部类和匿名内部类可以自由地访问外部类的所有成员,包括私有的。但是静态内部类由于不依赖于外部类的实例,因此只能访问外部类的静态成员。

总结

特性/方面成员内部类(内部类1)静态内部类(内部类2)匿名内部类(内部类3)
定义位置在外部类内部,非静态在外部类内部,声明为static在方法或代码块内部,没有显式名称
与外部类的关系依赖于外部类实例不依赖于外部类实例通常依赖于外部类实例(如果在方法内部定义)
访问外部类成员可以访问所有成员(包括私有)只能访问静态成员可以访问所有成员(如果在方法内部定义)
创建方式通过外部类实例创建直接创建,无需外部类实例在定义时同时创建实例
功能提供与外部类紧密相关的功能提供与外部类相关但不依赖于外部类实例的功能快速实现接口或扩展类,常用于回调和事件处理
性能稍微有些性能开销,因为持有外部类引用较好的性能,不持有外部类实例引用可能有额外的性能开销,因为通常是一次性使用
适用场景当内部类需要访问外部类实例成员时当内部类不需要访问外部类实例成员时当需要快速实现接口且只使用一次时
优缺点优点:直接访问外部类所有成员;缺点:依赖外部类实例,可能导致内存泄漏优点:不依赖外部类实例,性能较好;缺点:只能访问静态成员优点:简洁,快速实现接口;缺点:一次性使用,可能增加代码复杂性

Java的内部类提供了一种强大的封装机制,允许我们将逻辑上紧密相关的类组织在同一个外部类中。不同类型的内部类(成员内部类、静态内部类、匿名内部类)有着不同的特性和使用场景。通过合理地使用内部类,可以编写出更加模块化和可维护的代码。

标签:部类,内部,静态,成员,就够,匿名,实例,关于
From: https://blog.csdn.net/li_guolin/article/details/141835390

相关文章

  • 关于CPP——Muduo库的使用
    目录 一、Moduo库是什么1.1Moduo库概念1.2Reactor模式 1.3Moduo库的原理二、Muduo库常见接口2.1 TcpServer类2.2 EventLoop类2.3 TcpConnection类 2.4 TcpClient类2.5 Buffer类 2.6 CountDownLatch类2.7 EventLoopThread类1.防止主线程阻......
  • 关于企业管理系统--MES系统和ERP系统
    对于一些制造业公司,对于生产车间和劳动力的管理需要系统化的管理制度和指标,并且在计算机系统上需要相关的一个集中式管理以及生产体系架构,MES系统和ERP系统旨在面向制造业企业车间的执行层和企业的资源进行一个统合管理,以提高企业的运营效率和管理水平一、MES系统1.1、什么是MES系......
  • 关于ST-CNN的算法详解
    ST-CNN(时空卷积神经网络)是一种结合了时间和空间维度信息处理的深度学习模型,它在多个领域,如交通流量预测、视频分析、动作识别等中都有广泛应用。以下是对ST-CNN算法的详细解析:一、基本概念ST-CNN通过结合卷积神经网络(CNN)和图卷积网络(GCN)的优势,能够同时捕捉数据的空间和时间特......
  • 关于卷积神经网络(CNN)的详解
    一、基本概念卷积神经网络(ConvolutionalNeuralNetworks,CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(FeedforwardNeuralNetworks,FNN),是深度学习的代表算法之一。它仿造生物的视觉机制构建,能够进行监督学习和非监督学习,广泛应用于图像识别、视频分析、自然语言处......
  • 关于HarmonyOS的学习
    day22一、DOM   +文档对象模型   +在DOM的世界里面,把所有的标记称之为节点,把标记的结构称之为DOM树   +告诉咱们标记在文档里面是以树形结构存在的   +节点分类    =>document文档节点    =>eLement标记节......
  • 关于HarmonyOS的学习
    day23一、DOM尺寸和位置1.只能获取到内联style属性的CSS样式中的宽和高,如果有,获取;如果没有,则返回空$('.box1').style.width$('.box1').style.height$'.box1').style.backgroundColor2.返回了元素大小,但没有单位,默认单位是px,如果设置了其他的单位,比如100em之类,返回出来的......
  • 关于HarmonyOS的学习
    day24一、事件流    +称之为DOM事件流,因为是事件肯定是绑定给DOM元素的    +咱们在页面里面给元素注册(绑定)了事件,那么事件和事件之间会进行传递,而事件传递是由规则的,把这个规则称之为事件流    +完整事件流     =>捕获阶段---事......
  • 关于HarmonyOS的学习
    day21一、window对象常用方法  //提示信息,带有确认和取消。如果确认返回的是true,取消返回的是false  //varres=confirm('你确定登录吗?')  //console.log(res)​  varbtn1=document.querySelectorAll('button')[0]  varbtn2=document.qu......
  • 关于Tailscale Subnet routers要说的
    国内的水文很多,Tailscale的部署就不说了。简单的都有讲到,但凡深度一点儿的只能找找外边儿的文章了。昨天刚给群晖装完Tailscale,打算着利用Subnetrouters功能来访问另外的2个子网。国内的水文在介绍这一段使用的时候是这样的:该文章提到:如果有多个网段添加,就多运行上面说到的......
  • 关于PMOS与NMOS电流公式的方向问题
    相关教材多提及NMOS,这里主要探讨PMOS电流方向的理解记忆。首先理解大信号下的公式:对于NMOS,可以发现ID与电压的参考方向为由D(G)+S-,一致则公式前无需负号。而对于PMOS,不妨将NMOS的推导过程视为一个传函,对于NMOS认为输入为电子,对于PMOS认为输入为空穴,则等效于认为在NMOS......