Java 类:匿名类、嵌套类、私有类

2024-05-12

有人能解释一下Java中匿名类、嵌套类和私有类之间的区别吗?我想知道与每个相关的运行时成本以及每个编译器的方法,这样我就可以掌握哪个最适合用于例如性能(编译器优化的潜力)、内存使用以及其他 Java 编码人员的普遍可接受性。

我所说的匿名类是指那些以奇怪的 Java 方式在函数中声明为内联的类。这在 Swing 代码示例中经常出现,您可以在其中编写与其声明内联的按钮处理程序。我真的不喜欢匿名类,因为你会得到那些有趣的 MyClass$1.class 文件,而且当你发现你想让匿名类成为单例或需要它的句柄时,通常你必须重构,或者某物。我也不喜欢您在另一个函数调用过程中以刚刚编写的形式附加处理程序的方式。这让我感觉很奇怪。 :-)

私有类是您在文件底部完全在公共类声明之外编写的类。我更喜欢私有类,因为它们在其他语言中有意义,因为源文件和类之间没有很强的 1:1 关系。我没有那种奇怪的感觉,而且我知道(或者我认为我知道)Java 编译器将如何处理该类的声明。

嵌套类是写在公共类的波浪线内的类。我真的不知道嵌套类与其他两个类相比意味着什么。 :-)


有人能解释一下Java中匿名类、嵌套类和私有类之间的区别吗?

  • 匿名类例如是 Runnable 类

    new Thread(new Runnable() {
        public void run() {
            ...
        }
    }.start();
    
  • 嵌套类看起来像

    class SomeClass {
    
        ...
    
        class NestedClass {
            ....
        }
    }
    
  • 私有类(您将其称为“完全在公共类声明之外的文件底部编写的类”)实际上是包作用域的类。你can'tprivate类前面的修饰符,除非它是嵌套的!

我想知道与每个相关的运行时成本以及每个编译器的方法,这样我就可以掌握哪个最适合用于例如性能(编译器优化的潜力)、内存使用以及其他 Java 编码人员的普遍可接受性。

我怀疑这些方法之间是否存在任何性能差异。为什么?因为每种方法最终都会被编译成一个或多或少的“常规”类。 (“或多或少”是因为在某些情况下会生成访问方法,但它没有副作用,而且很可能由 JIT 内联。)

这段代码:

public class TestOuter {

    int fieldOuter;
    public void methodOuter() {
    }

    class TestInner {
        int fieldInner;
        public void methodInner() {
        }
    }
}


class TestPackage {

    int fieldPackage;
    public void methodPackage() {
    }

}

被编译成:

$ javap -c TestOuter$TestInner
Compiled from "TestOuter.java"
public class TestOuter extends java.lang.Object{
int fieldOuter;

public TestOuter();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

public void methodOuter();
  Code:
   0:   return

}

$ javap -c TestOuter
Compiled from "TestOuter.java"
public class TestOuter extends java.lang.Object{
int fieldOuter;

public TestOuter();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

public void methodOuter();
  Code:
   0:   return

}

$ javap -c TestPackage
Compiled from "TestOuter.java"
class TestPackage extends java.lang.Object{
int fieldPackage;

TestPackage();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

public void methodPackage();
  Code:
   0:   return

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 类:匿名类、嵌套类、私有类 的相关文章

随机推荐

  • Strapi v4 使用补丁包自定义页面

    我想用我的自定义文本更改登录页面内的文本 我做了一些改变node modules strapi admin src pages AuthPage components Login BaseLogin js 在编辑该文件之前 我安装patch
  • 使用 Selenium for C# 登录 Facebook

    我一直在使用 Selenium C 框架并尝试进行 facebook 登录 但没有任何运气 这是我到目前为止得到的 基于这篇文章 使用 Selenium 测试 Facebook Connect 应用程序 https stackoverflo
  • UIView 内的 UIButton 目标操作

    我有一个习惯UIView我创建了一个UIButton 在该视图中 我有以下代码 func setupViews menuControlButton addTarget self action toggleButton forControlE
  • 在Python中整齐地绘制PMF

    有没有一个库可以帮助我在 python 中整齐地绘制样本的概率质量函数 如下所示 通过matplotlib pyplot的stem模块 matplotlib pyplot stem args kwargs from matplotlib p
  • 如何从一组重叠的圆计算多边形集?

    这个问题是一些计算细节的扩展这个问题 https stackoverflow com questions 1667310 combined area of overlapping circles 假设有一组 可能重叠的 圆 并且希望计算这组
  • PyQt5 的 OpenGL 模块和版本控制问题(调用不正确的 _QOpenGLFunctions_(ver))

    我一直在努力得到PyQt5 helloGL 示例代码 https github com baoboa pyqt5 blob master examples opengl hellogl py编译 当我尝试构建解决方案时 我得到 Traceb
  • Perl 单元测试只针对模块,而不针对程序吗?

    我在网上找到的文档和我拥有的书 Perl测试 或者说或者建议 Perl 的单元测试通常是在创建模块时完成的 这是真的 有没有办法使用单元测试实际程序Test More和表兄弟姐妹 当然 您可以使用测试脚本测试 更多 http search
  • 全日历与 UTC 和本地日期的混淆

    我确实让 fullcalendar 正常初始化 所以它代表当前日期 午夜 gt 午夜 1 天 1 小时时段 我从其他一些数据源获取带有时间戳的数据 格式为 YYYY MM DD HH mm 作为字符串传输 无时区信息 因此 我将该字符串转换
  • 如何安全地将 CGFloat 降低或提高到 int?

    我经常需要在地板或天花板上安装CGFloat to an int 用于计算数组索引 我永远看到的问题floorf theCGFloat or ceilf theCGFloat 是浮点不准确可能会带来麻烦 那如果我的CGFloat is 2
  • seaborn 箱线图的子图

    我有一个像这样的数据框 import seaborn as sns import pandas as pd pylab inline df pd DataFrame a one one two two one two one one one
  • React Native 中 fontAwesome 图标的圆形轮廓

    我想使用 fontAwesome 图标 使其位于圆圈的中间 我想将它用作一个图标项 我读到我们可以将它与圆形图标一起使用并将其放置在其中 但我无法使其工作 import IconFA from react native vector ico
  • 如何拆分 data.frame -> 将合并应用于子集 -> 合并到 data.frame 中

    我真的不知道如何在不使用 for 循环的情况下实现这一目标 x lt c a b c d gt x 1 a b c d data lt data frame x c a b a b c a a b c d name c one one tw
  • 异步方法中的异常未被捕获

    下面的代码没有捕获我的OperationCancelEException 它是通过调用抛出的ct ThrowIfCancellationRequested public partial class TitleWindow Window IA
  • 单击 btn 而不触发 div 单击未按预期工作

    代码沙盒 https codesandbox io s currying breeze depdc9 file package json https codesandbox io s currying breeze depdc9 file
  • 基于 MS Bot Framework 中的响应分支对话框/表单

    我们正在尝试使用 MS Bot Framework 但尚未完全弄清楚如何实现此场景 我们有一个 LUIS 对话框 类型 它工作正常并且经过适当的培训 以常见的三明治为例 LUIS 意图寻找的基本内容是用户询问订单状态 如果问题中提供了订单号
  • getJson问题,它返回未定义

    大家好 我有这个代码 var temp if method 1 temp Words val get the words from textbox else getJSON http localhost mine test js funct
  • 2 个 SVG 路径的交集

    我需要检查两个 SVG Path 元素是否相交 检查边界框与 getBBox 太不准确了 我目前正在做的是迭代两条路径 getTotalLength 然后检查是否有两个点 getPointAtLength 是平等的 下面是一个片段 但正如您
  • 使用 SQL 确定子网掩码的 cidr 值

    我想找到一种方法来执行 SQL 查询 该查询将计算存储在数据库中的子网掩码的 cidr 位表示 例如 我在数据库中存储了 255 255 255 0 或其十进制值 4294967040 我想通过查询进行选择并返回 24 表示 我已经执行了类
  • Angular 2 路由器使用 Observable 进行解析

    Angular 2 RC 5 发布后引入了路由器解析 Here https angular io docs ts latest guide router html resolve guard使用 Promise 演示了示例 如果我使用 Ob
  • Java 类:匿名类、嵌套类、私有类

    有人能解释一下Java中匿名类 嵌套类和私有类之间的区别吗 我想知道与每个相关的运行时成本以及每个编译器的方法 这样我就可以掌握哪个最适合用于例如性能 编译器优化的潜力 内存使用以及其他 Java 编码人员的普遍可接受性 我所说的匿名类是指