为什么 C# 构造函数行为与 Java 不同,反之亦然?

2024-03-14

给定这个 Java 代码,输出0 and 4:

class A{
   A() {  print();   }
   void print() { System.out.println("A"); }
}

class B extends A{
   int i =   Math.round(3.5f); 
    
   public static void main(String[] args){
      A a = new B();
      a.print();
   }
   void print() { System.out.println(i); }
}

使用相同的 C# 代码,输出4 and 4

using System;

class A{
   internal A() {  print();   }
   virtual internal void print() { Console.WriteLine("A"); }
}

class B : A{
   int i =  (int) Math.Round(3.5f); 
    
   public static void Main(string[] args){
      A a = new B();
      a.print();
   }
   override internal void print() { Console.WriteLine(i); }
}

虽然我发现在Java上输出应该是4和4,但在Java上答案实际上是0和4。然后我用C#试了一下,答案是4和4

是什么赋予了? Java的基本原理是,在构造B期间,A仍在初始化(因此,如果Java说A仍在初始化,则我假设B仍在初始化),因此默认值应该为0。因此Java中的输出为0和4。

为什么 C# 构造函数行为与 Java 不同,反之亦然?


发生这种情况是因为构造函数中对象初始化的顺序不同。

Java 中发生了什么:

  • (空,隐式)调用 B 的构造函数
  • A 的超类构造函数被调用(打印 0,因为 i 未初始化)
  • 我已初始化after超类构造函数
  • print() 被调用(打印 4)

C# 中发生了什么:

  • (空,隐式)调用 B 的构造函数
  • 我已初始化before调用超类构造函数
  • A 的超类构造函数被调用(打印 4,因为 i 已经初始化)
  • print() 被调用(打印 4)

两者都没有对错之分——只是编译器如何排序构造操作的不同。就我个人而言,我认为 Java 顺序稍微更符合逻辑,因为对我来说,在子类初始化发生之前完全构造超类是有意义的。

无论哪种方式,因为逻辑可能变得非常复杂,所以我建议您通常避免在对象构造期间调用虚拟方法。

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

为什么 C# 构造函数行为与 Java 不同,反之亦然? 的相关文章

  • java:如何设置全局线程ID?

    是否有可能为线程设置唯一ID 在分布式系统中 线程是在许多不同的机器上创建的 例如通过 RMI 我需要它来创建日志消息 根据我的研究 我知道可以使用 log4j mdc ndc 来完成 但只能在单线程中完成 我的问题是 在创建线程时必须设置
  • 有界通配符相关的编译器错误

    我想知道这段代码有什么问题 Map 但我试图说得更具体 这个问题在这个旧的 Apache 线程 ht
  • 为什么 .Net 框架指南建议您不要使用 ref/out 参数?

    显然 他们很 混乱 这是认真的原因吗 你还能想到其他的吗 你见过有多少开发人员并不真正理解 ref out 吗 我在真正需要的地方使用它们 但在其他地方则不然 它们通常仅在您想有效返回两个或多个值时才有用 在这种情况下它至少值得thinki
  • Java 泛型:将 Object o 的类与 进行比较

    假设我有以下课程 public class Test
  • 如何在不同的班级中启动和停止计时器?

    我想测量从传入 HTTP 请求开始到应用程序到达某个点的时间 这两个时间点都位于不同的类中 我将如何启动和停止这些不同类别的计时器 我没有看到使用 MeterRegistry 中的 命名 计时器的方法 我该怎么办呢 您可以使用 AOP 如下
  • Math.Sin、Math.Cos 和 Math.Tan 精度以及正确显示它们的方法

    我正在用 C 编写一个计算器 textBoxResult是一个文本框 我在其中显示数字 recount是以度为单位获取角度并以弧度为单位返回的函数 我的角度是从texBoxInput public double recount int nu
  • Java 空值检查

    我有一个thread1 if object null object play 和另一个thread2可以写null into object随时参考 我将同时运行这些线程 我知道thread2可以重写object后参考null检查并会抛出Nu
  • 将字符串转换为字符并按降序排序(ascii)

    我正在创建一个程序 该程序将使用户输入整数 一个接一个 存储在数组中并按降序显示整数 该程序还要求用户输入一个字符串 使用以下命令将其转换为字符string toCharArray 我已经正确地按降序显示整数 问题是我不知道如何按降序显示字
  • 为什么我在这段代码中不断得到两个相同的随机值? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么我的随机数生成器在 C 中不是随机的 https stackoverflow com questions 932520 why does it appear that my random num
  • Java XML 解析器添加不必要的 xmlns 和 xml:space 属性

    我在 Windows 10 上使用 Java 11 AdoptOpenJDK 11 0 5 2019 10 15 我正在解析一些旧版 XHTML 1 1 文件 这些文件采用以下一般形式
  • Docker 不遵循构建目录中的符号链接

    我正在对一个应用程序进行 Docker 化 其中涉及通过 Clang 将二进制文件与其他 C 文件链接 我们维护二进制文件的符号链接版本 因为它们在整个代码库中使用 我的 Docker 构建目录包含整个代码库 包括源文件以及这些源文件的符号
  • 使用 C# 和 .NET Core 在 AWS Cognito 用户池中进行用户管理

    如何使用 C 和 NET Core 3 x 管理 AWS Cognito 用户池中的用户 在文档中找不到有关它的任何内容 Attilio Gelosa 的原创文章 我写这篇文章是希望对其他人有帮助 我必须阅读一页又一页的文档 并从 AWS
  • Eclipse 在单独的窗口中打开代码

    我正在 eclipse 中编程 在两个显示器设置上运行 在其中一台显示器上 我只获得了项目资源管理器和编辑器作为自定义透视图 而在另一台显示器上 我获得了其他工具 例如控制台 调试 任务 变量 断点等 例如 当我单击任务视图中的任务时 这将
  • Spring Boot中服务接口类的用途

    我的问题是关于接口类的使用 我对 Spring 还很陌生 所以如果这过于简单 请耐心等待 首先 当您可以在 BoxService 中声明 find all 时 这里拥有 IBoxService 接口有什么意义 其次 在控制器中如何使用IBo
  • PARITY_NONE 是 C++ Windows 中的关键字吗?

    我正在使用 boost 编写一个串行库 并且我有一个枚举 enum parity t PARITY NONE PARITY ODD PARITY EVEN 我收到如下错误 错误 1 错误 C2059 语法错误 我无法弄清楚问题是什么 然后我
  • 在标准 C 中将 int 转换为 string

    我是 C 新手 我正在寻找一个可以调用函数进行转换的示例int串起来 我发现itoa但这不是标准 C 的一部分 我还发现sprintf str d aInt 但问题是我不知道所需的 str 的大小 因此 我如何传递输出字符串的正确大小 有多
  • 删除Java中重载的方法

    有2个重载方法 这些方法中的每一个都将一种类型的列表转换为不同类型的列表 但第一种方法使用比较器 class SomeClass public static
  • 如何正确地将十六进制转义添加到字符串文字中?

    当你有C语言的字符串时 你可以在里面直接添加十六进制代码 char str abcde a b c d e 0x00 char str2 abc x12 x34 a b c 0x12 0x34 0x00 这两个示例在内存中都有 6 个字节
  • 使用 Crypto++ 和 .NET 的 CFB 模式下的 TripleDES

    我正在尝试使用 TripleDES 使用 C 应用程序获得相同的结果 该应用程序具有Crypto https www cryptopp com 和 NET应用程序使用三重DESCryptoServiceProvider https msdn
  • 频繁插入已排序的集合

    我已经对集合 列表 进行了排序 并且我需要始终保持其排序 我目前在我的集合上使用 List BinarySearch 然后在正确的位置插入元素 我也尝试过在每次插入后对列表进行排序 但性能不可接受 有没有一种解决方案可以提供更好的性能 也许

随机推荐

  • 如何在 celery task.apply_async 中使用优先级

    我有一个testcelery 中的队列 我为它定义了一个任务 celery app task queue test ignore result True def priority test priority print priority 它
  • playOrm 基本设置 + playOrm 成熟度 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • LSB 中是否有 RPM 文件命名约定?

    RPM 是 LSB 中的包格式 但 LSB 是否强制 RPM 的任何命名标准 类似于 http www rpm org max rpm ch rpm file format html http www rpm org max rpm ch
  • cdata-section-elements 不工作

    我试图通过设置全局参数在通过 XSLT 使用 Saxon HE v9 7 0 14 生成的 xml 文件中设置密码 密码可以包含任何字符 因此需要将其放在CDATA部分 我试图通过设置来实现这一点cdata section elements
  • 删除表格单元格的边框

    我知道这是一个愚蠢的问题 但我似乎完全忘记了该怎么做 我有一个 HTMLtable我想删除所有单元格周围的所有边框 以便整个表格周围只有一个边框 我的代码如下所示 table border 1 width 500 tr th h1 Your
  • Silverlight 3 替代 FileVersionInfo.GetVersionInfo

    在 Silverlight 3 0 应用程序中 我想使用程序集文件版本 http msdn microsoft com en us library system reflection assemblyfileversionattribute
  • 从 History api 接收的步骤数据与 google fit 不匹配

    我希望在我的应用程序中计算 google fit 步数 因为我使用的是 google 提供的 History api 我发现从历史 API 接收的步骤与 google fit 不匹配 即使我使用了 google 提供的相同代码 下面是我的代
  • 创建一个包含 JSONObject Android 中所有键的数组

    您好 我想创建一个 JSONObject 中所有键的数组 我的理解 如果我错了 请纠正我 是我需要将 JSONObject 转换为 Map 然后从中创建一个数组 有人知道如何做到这一点吗 无需转换JSONObject到 Map 然后创建一个
  • Node exceljs读取文件

    所以根据官方文档我应该能够使用以下方式读取Excel文档 read from a file var workbook new Excel Workbook workbook xlsx readFile filename then funct
  • ggplot2 +facet_:某些方面的反转轴?

    我想将三个子图组合成一个图 而分面将是一种自然的方法 然而 使用反转的 x 轴 这些子图之一会更容易 更自然地阅读 而我想不理会其他子图 有没有办法使用facet grid 或facet wrap 来完成此任务 我考虑过的另一种选择是 gr
  • 如何在flutter webview中打开应用程序链接?

    在 Flutter 中 我使用 flutter网页视图插件 https pub dartlang org packages flutter webview plugin启动一个 url 例如 flutterWebviewPlugin lau
  • Sizzle 和 document.querySelectorAll 有什么区别

    据我所知 嘶嘶声和querySelector querySelectorAll是 CSS 选择器 那么 加载 Sizzle 和执行以下操作有什么区别 Sizzle my CSS query and document querySelecto
  • 我如何在 Capybara 中测试页面是否*未*重新加载(JavaScript onClick 拦截已起作用)?

    我用的是水豚 黄瓜和恶作剧 我正在测试附加到表单提交按钮的 JavaScript 函数 该函数旨在捕获提交事件并阻止它 在后台执行 AJAX 请求 使用和不使用 AJAX 页面最终看起来都是一样的 但 AJAX 方法要快得多 并且不会中断浏
  • 开始一项新活动

    我正在使用 Xamarin 我想启动一个名为 AutoLinkActivity 的新活动 这是我的代码 using System using Android App using Android Content using Android R
  • Java 示例代码示例 youtube data api v3 和授权方法作为 api 密钥

    我是 google api 的新手 为 YouTube 频道创建项目 我已经为该项目创建了 api 并生成了 api 密钥 在项目上启用 Youtube api 我到处都能获得 OAUTH 授权的代码示例 但无法找到任何用于使用 api K
  • 平衡设计原则:单元测试

    我正在编写 Bananagrams 的模拟 目前 我有一个GameMaster维护公共片段集合的类 这deal Player 方法向该玩家分发一定数量的棋子 我想为此编写单元测试 然而 此时我没有吸气剂 因此无法检查对象的状态 为什么不添加
  • “lxd”与 lxc/docker 有何不同?

    问题 lxd 如何在容器内提供完整的操作系统功能 而不仅仅是单个进程 它与 lxc docker 包装器有什么不同 是不是类似于用docker supervisor wrapper脚本启动一个容器 在一个容器中包含多个进程 换句话说 我可以
  • 使用加密密码连接到 gmail(使用 imap 和 javamail)

    我正在尝试使用一个简单的java程序连接到gmail 像这个 https harikrishnan83 wordpress com 2009 01 24 access gmail with imap using java mail api
  • 如何使用带有角度的离子框架制作apk文件

    我在本地目录中创建了简单的应用程序 该应用程序名称是 Ionic Chat master 我怎样才能把它变成apk文件 我已经使用 git 尝试了以下命令 但对我不起作用 npm install g cordova cordova buil
  • 为什么 C# 构造函数行为与 Java 不同,反之亦然?

    给定这个 Java 代码 输出0 and 4 class A A print void print System out println A class B extends A int i Math round 3 5f public st