首页 > 编程语言 >Java中内部类的使用总结

Java中内部类的使用总结

时间:2024-01-21 18:34:09浏览次数:42  
标签:总结 部类 Java 内部 静态 成员 Main

 

参考文档:Java中内部类的使用总结-CJavaPy

1、非静态内部类

非静态内部类,也就是成员内部类,是定义在另一个类内部的非静态类。这种内部类与外部类之间有着密切的联系,它可以访问外部类的所有成员(包括私有成员),同时外部类也可以访问内部类的所有成员(包括私有成员)。

public class Main {
  private int outerValue = 100;
  public static void main(String[] args) {
    Main outer = new Main();
    Main.InnerClass inner = outer.new InnerClass();
    inner.display();
    System.exit(0); //success
  }

  class InnerClass {
      private int innerValue = 200;
         
      public void display() {
          System.out.println("Outer Value: " + outerValue); 
          //     访问外部类成员
          System.out.println("Inner Value: " + innerValue); 
          // 访问内部类成员
      }
  }
}

注意:同一个java源文件定义了多个类,它们之间是相互独立的,那种情况不是内部类。

2、静态内部类

Java中的静态内部类(Static Nested Class)是定义在另一个类内部的静态类。由于是静态的,这种内部类与外部类的实例无关,并且不能直接访问外部类的非静态成员和方法。可以访问外部类的静态成员,包括私有的静态成员。静态内部类的独立性使其成为实现与外部类相关但又可独立存在。静态内部类在Java中的应用场景包括逻辑分组(将相关的类组织在一起),封装(隐藏内部类的细节,保持外部类的清洁接口),以及减少内存占用(静态内部类不持有对外部类实例的引用)。它们在设计模式中也很有用。

public class Main {
 private static String staticVar = "外部静态变量";

    static class StaticNestedClass {
        public void display() {
            System.out.println("访问 outer class static variable: " + staticVar);
        }
    }

    public static void main(String[] args) {
        Main.StaticNestedClass nestedObject = new Main.StaticNestedClass();
        nestedObject.display();
    }
}

3、局部内部类

局部内部类(Local Inner Class)是定义在一个方法或任意作用域内的类。它对于实现复杂的逻辑非常有用,尤其是当这些逻辑仅在定义它的块内部需要时。局部内部类对外部完全隐藏,只能在定义它的作用域内被使用。局部内部类可以访问其外围方法的局部变量(Java 8之后,即使这些变量不是final的也可以访问)和外部类的所有成员。这些类不能有静态成员,因为它们与外部世界隔离。局部内部类主要用于实现那些仅在某个方法或作用域内使用的类,以及在需要实现或继承特定接口或类且其使用非常局限的情况下。

  使用示例:Java中内部类的使用总结-CJavaPy

4、匿名内部类

匿名内部类是一种没有名称的局部内部类。它们通常用于实现接口或继承某个类的同时,创建并实例化一个对象。匿名内部类对于编写事件监听器、实现回调等场景特别有用。匿名内部类是一种特殊的内部类,它没有具体的类名。这种类通常用于一次性使用的场景,如实现接口或继承某个类时。由于匿名内部类没有名称,因此在定义的同时会立即创建一个对象实例。这种类的主要优点是语法简洁,使代码更加清晰和简洁,尤其适用于事件处理(例如GUI编程中的事件监听器)和在方法调用中实现接口的情况。

匿名内部类可以访问外部类的所有成员,包括私有成员,以及定义它的方法内的final或effectively final局部变量。然而,匿名内部类不能定义静态成员、方法或类,并且由于缺乏具体的类名,它们也不能有构造方法。

  使用示例:Java中内部类的使用总结-CJavaPy

5、闭包和回调

闭包是一种编程概念,指的是一个函数及其引用的外部环境的组合。在Java中,闭包通常通过内部类实现。由于内部类可以访问其外部类的成员变量和方法,这使得它可以捕获并持有这些外部变量的状态,从而形成闭包。

 使用示例:Java中内部类的使用总结-CJavaPy

回调是一种常见的编程模式,用于异步或事件驱动编程。回调通常是作为一个函数传递到另一个函数中,当特定事件或条件发生时,这个传递的函数被调用。在Java中,回调经常通过使用接口或抽象类以及内部类来实现。

使用示例:Java中内部类的使用总结-CJavaPy

标签:总结,部类,Java,内部,静态,成员,Main
From: https://www.cnblogs.com/tinyblog/p/17978132

相关文章

  • 中断机制小总结
    方法介绍publicvoidinterrupt()实例方法Justtosettheinterruptflag实例方法仅仅是设置线程的中断状态为true,发起一个协商而不会立刻停止线程publicstaticbooleaninterrupted()静态方法Thread.interrupted();判断线程是否被中断并清除当前中断状态(做了两件......
  • 前端js方法的书写顺序,比如有内部方法,外部方法,用户触发的动作方法,监听事件方法,等等,
    在前端JS开发中,通常的方法书写顺序如下:变量声明和初始化内部方法定义外部方法定义初始化函数事件监听方法定义用户触发的动作方法定义这个顺序的主要目的是提高代码的可读性和可维护性。按照这个顺序,可以使代码更加清晰、易于理解和修改。变量声明和初始化应该在前面,因为......
  • 关于死锁的一些总结
    死锁的问题历来是面试中常问的问题,可是在实际工作中可能几年都遇到不了一次这种问题.不知是幸运还是不幸,新进的这家公司刚去就遇到了两个很经典的死锁问题,这里分享一下排查和解决思路死锁的发生往往离不开多线程并发,我所遇到的两个场景分别是数据库的并发和代码层面的并......
  • Java中遍历方法对比
    DemopublicclassTest{publicstaticvoidmain(String[]args){test(10);test(100);test(1000);test(10000);}publicstaticvoidtest(intsize){//1.组装数组List<String>list=list(siz......
  • javascript中apply的用法
    javascript中apply的用法欧方2023-03-3118:30江苏在JavaScript中,apply方法和call方法类似,都是用于调用一个函数或方法,不同之处在于apply方法接受一个参数数组作为函数的参数列表。apply方法的语法如下:function.apply(thisArg,[argsArray])其中,t......
  • 线性DP简单总结
    线性DP简单总结动态规划原理可以用动态规划解决的问题,应具备三种条件:最优子结构(由小推大)无后效性(由过去推现在)子问题重叠(已经求解的子问题不必重复求解)动态规划构成“状态”“阶段”“决策”为动态规划三要素。最长上升子序列问题给定一个长度为\(n\)的序列\(A......
  • Java实现Excel导入和导出
    目录目录前言1.功能测试1.1测试准备1.2数据导入1.2.1导入解析为JSON1.2.2导入解析为对象(基础)1.2.3 导入解析为对象(字段自动映射)1.2.4导入解析为对象(获取行号)1.2.5导入解析为对象(获取原始数据)1.2.6 导入解析为对象(获取错误提示)1.2.7导入解析为对象(限制字段......
  • 0/1背包简单总结
    0/1背包简单总结问题:\(n\)件物品选择性放入载重为\(C\)的背包。第\(i\)件物品的重量为\(w[i]\),价值为\(v[i]\)。每个物品只有一件,你可以选择不放入背包,或者放入背包。请问该如何选择物品,在能保证物品总重量不超过背包载重的条件时,使物品的价值总和最大。解:设\(dp[i][j]\)表示......
  • 其他背包问题简单总结
    其他背包问题简单总结1.完全背包0/1背包问题:已知有第\(i\)个物品的重量\(w_{i}\),价值\(v_{i}\),以及背包的总容量\(W\)。设DP状态\(f_{i,j}\)为在只能放前\(i\)个物品的情况下,容量为\(j\)的背包所能达到的最大总价值。而完全背包,即是在\(0/1\)背包问题中,将一个物......
  • Java连接8.0版本以上的数据库
    一.连接数据库在使用Java连接8.0版本以上的数据库时,可以按照如下步骤:下载需要的包,本次教程中使用的是下面这个版本。该驱动网上有许多资源,可根据自己的需求下载。建立与数据库的连接单元在合适的包下新建"DButil.java"文件并输入如下代码:importjava.sql.Connecti......