变量多态性的初始化

2023-12-21

假设您有以下代码

class A {
    int i = 4;

    A() { 
        print();
    }

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

class B extends A {
    int i = 2;              //"this line"

    public static void main(String[] args){
        A a = new B();
        a.print();
    }

    void print () {
        System.out.println(i);
    }
}

这将打印 0 2

现在,如果删除标有“此行​​”的行 代码将打印 4 4

  • 我的理解是如果没有int i=2;线,

A a = new B();将调用类 A,将 i 初始化为 4,调用构造函数,
这使得控制权print()中的方法class B,最后打印 4。

a.print()将会通知print()B 类中的方法,因为这些方法将在运行时绑定,这也将使用 A 类中定义的值,4。

(当然,如果我的推理有任何错误,请告诉我)

  • 但是,我不明白的是是否有 int i=2 。

为什么如果插入代码,第一部分(创建对象)会突然打印 0 而不是 4?为什么它不将变量初始化为 i=4,而是分配默认值?


它是Java中几种行为的组合。

  1. 方法重写
  2. 实例变量阴影
  3. 构造函数的顺序

我将简单地回顾一下您的代码中发生的情况,看看您是否理解。

从概念上讲,您的代码如下所示(跳过 main()):

class A {
    int i = 0; // default value

    A() { 
        A::i = 4;  // originally in initialization statement
        print();
    }

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

class B extends A {
    int i = 0;              // Remember this shadows A::i

    public B() {
        super();
        B::i = 2;
    }

    void print () {
        System.out.println(i);
    }
}

所以,当你原来的main(), 你打过电话了A a = new B();,它正在构建一个B,发生这种情况:

  • A::i and B::i都是默认值0
  • super(), which means A's constructor is called
    • A::i设置为 4
    • print()叫做。由于后期绑定,必然会B::print()
    • B::print()正在尝试打印B::i,仍然是 0
  • B::i设置为 2

然后当你打电话时a.print()在你的main(),它有界于B::print()正在打印B::i(此时为 2)。

因此你看到的结果

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

变量多态性的初始化 的相关文章

  • 日期语句之间的 JPQL SELECT [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我想将此 SQL 语句转换为等效的 JPQL SELECT FROM events WHERE events date BETWE
  • Java 枚举与创建位掩码和检查权限的混淆

    我想将此 c 权限模块移植到 java 但是当我无法将数值保存在数据库中然后将其转换为枚举表示形式时 我很困惑如何执行此操作 在 C 中 我创建一个如下所示的枚举 public enum ArticlePermission CanRead
  • 为 java 游戏创建交互式 GUI

    大家好 我正在创建一个类似于 java 中的 farmville 的游戏 我只是想知道如何实现用户通常单击以与游戏客户端交互的交互式对象 按钮 我不想使用 swing 库 通用 Windows 看起来像对象 我想为我的按钮导入自定义图像 并
  • 动态选择端口号?

    在 Java 中 我需要获取端口号以在同一程序的多个实例之间进行通信 现在 我可以简单地选择一些固定的数字并使用它 但我想知道是否有一种方法可以动态选择端口号 这样我就不必打扰我的用户设置端口号 这是我的一个想法 其工作原理如下 有一个固定
  • org.apache.hadoop.security.AccessControlException:客户端无法通过以下方式进行身份验证:[TOKEN,KERBEROS] 问题

    我正在使用 java 客户端通过 Kerberos 身份验证安全访问 HDFS 我尝试打字klist在服务器上 它显示已经存在的有效票证 我收到的异常是客户端无法通过以下方式进行身份验证 TOKEN KERBEROS 帮助将不胜感激 这是一
  • Pig Udf 显示结果

    我是 Pig 的新手 我用 Java 编写了一个 udf 并且包含了一个 System out println 其中的声明 我必须知道在 Pig 中运行时该语句在哪里打印 假设你的UDF 扩展了 EvalFunc 您可以使用从返回的 Log
  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • 来自 dll 的 Java 调用函数

    我有这个 python 脚本导入zkemkeeperdll 并连接到考勤设备 ZKTeco 这是我正在使用的脚本 from win32com client import Dispatch zk Dispatch zkemkeeper ZKE
  • 无法创建请求的服务[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]-MySQL

    我是 Hibernate 的新手 我目前正在使用 Spring boot 框架并尝试通过 hibernate 创建数据库表 我知道以前也问过同样的问题 但我似乎无法根据我的环境找出如何修复错误 休眠配置文件
  • 像 Java 这样的静态类型语言中动态方法解析背后的原因是什么

    我对 Java 中引用变量的动态 静态类型和动态方法解析的概念有点困惑 考虑 public class Types Override public boolean equals Object obj System out println i
  • 如何对不同的参数类型使用相同的java方法?

    我的问题 我有 2 个已定义的记录 创建对象请求 更新对象请求 必须通过实用方法进行验证 由于这两个对象具有相同的字段 因此可以对这两种类型应用相同的验证方法 现在我只是使用两种方法进行重载 但它很冗长 public record Crea
  • Python 3:将字符串转换为变量[重复]

    这个问题在这里已经有答案了 我正在从 txt 文件读取文本 并且需要使用我读取的数据之一作为类实例的变量 class Sports def init self players 0 location name self players pla
  • Cucumber 0.4.3 (cuke4duke) 与 java + maven gem 问题

    我最近开始为 Cucumber 安装一个示例项目 并尝试使用 maven java 运行它 我遵循了这个指南 http www goodercode com wp using cucumber tests with maven and ja
  • 在 C 中初始化变量

    我知道有时如果你不初始化int 如果打印整数 您将得到一个随机数 但将所有内容初始化为零似乎有点愚蠢 我问这个问题是因为我正在评论我的 C 项目 而且我对缩进非常直接 并且它可以完全编译 90 90 谢谢 Stackoverflow 但我想
  • 干净构建 Java 命令行

    我正在使用命令行编译使用 eclipse 编写的项目 如下所示 javac file java 然后运行 java file args here 我将如何运行干净的构建或编译 每当我重新编译时 除非删除所有内容 否则更改不会受到影响 cla
  • 如何使用mockito模拟构建器

    我有一个建造者 class Builder private String name private String address public Builder setName String name this name name retur
  • 在java中为组合框分配键

    我想添加一个JComboBox在 Swing 中这很简单 但我想为组合中的每个项目分配值 我有以下代码 JComboBox jc1 new JComboBox jc1 addItem a jc1 addItem b jc1 addItem
  • 如何将双精度/浮点四舍五入为二进制精度?

    我正在编写对浮点数执行计算的代码的测试 不出所料 结果很少是准确的 我想在计算结果和预期结果之间设置一个容差 我已经证实 在实践中 使用双精度 在对最后两位有效小数进行四舍五入后 结果始终是正确的 但是usually四舍五入最后一位小数后
  • CamcorderProfile.videoCodec 返回错误值

    根据docs https developer android com reference android media CamcorderProfile html 您可以使用CamcorderProfile获取设备默认视频编解码格式 然后将其
  • 双枢轴快速排序和快速排序有什么区别?

    我以前从未见过双枢轴快速排序 是快速排序的升级版吗 双枢轴快速排序和快速排序有什么区别 我在 Java 文档中找到了这个 排序算法是双枢轴快速排序 作者 弗拉基米尔 雅罗斯拉夫斯基 乔恩 本特利和约书亚 布洛赫 这个算法 在许多数据集上提供

随机推荐

  • ASP.NET Web Api - 使用分块传输编码时,框架不会将 JSON 转换为对象

    我在 Android 中有一个 http 客户端 将 HTTP PUT 请求发送到使用 C 和 ASP NET WebApi 框架实现的 REST api 只要 JSON 字段与 C 类中的属性匹配 框架就应该能够神奇地将 JSON 转换
  • Firebase sendPasswordResetEmail 在 React 中不起作用

    我尝试使用 firebase 创建网络应用程序的密码重置选项 其他 firebase 选项工作正常 例如 GoogleLogin 和电子邮件注册 但是当我尝试时sendPasswordResetEmail它返回以下错误 类型错误 fireb
  • 最好的 Python GIS 库? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Laravel Passport - 测试密码授予

    我使用 Laravel 5 7 和 Passport 为第一方客户端创建 API 我有一个登录表单 它接受用户的电子邮件和密码并将两者发送到自定义 LoginController 然后 LoginController 创建一个 oAuth
  • NSPredicate 不适用于字典数组

    我有一个 NSPredicate 其格式如下 Status CONTAINS cd shipped 我有一个字典数组 这是一个例子 Category Category 4 Comp Category 4 Depth 02 Grade New
  • 具有空间数据的 3D 交互式曲面图

    我想创建一个湖泊深度的交互式 3D 表面图 最好使用plotly or rgl图书馆 我已经从一个中提取了我的数据SpatialLinesDataFrameGauss Krueger EPSG 31468 CRS 中的等高线 即公制单位 现
  • 2010 年 .NET Compact Framework 是否更新?

    这个问题 net 紧凑框架 4 0 https stackoverflow com questions 245566 net compact framework 4 0 在VS 2010发布之前就问过这个问题 答案基本上都是说等待发布 现在
  • 请求的资源node.js上不存在Access-Control-Allow-Origin标头[重复]

    这个问题在这里已经有答案了 我在尝试通过 ajax 请求与我的 node js 服务器通信时遇到问题 我已经这样配置我的服务器 var allowCrossDomain function req res next res header Ac
  • 无法从 xml 定义中找到 Activity 中的 onClick 方法

    我试图将一个函数链接到 AndroidStudio 中按钮的 onClick 属性 但由于某种原因 系统无法识别我编码的方法 有趣的是 当我用 Java 编写代码时 它可以正常工作 在 Kotlin 中则不然 我更新了 Kotlin 并检查
  • ul 左侧​​的浮动图像忽略边距/填充

    我有一个段落 后面是一个无序列表 其中有几个列表项 我还有一个图像浮动在其左侧 我遇到的问题是列表项边距 填充与该图像重叠 我希望图像旁边的项目符号按应有的方式缩进 这是一个测试 http testing gorocketfuel com
  • 包含 std::string 的 memset 结构

    我有一个庞大的结构 其中整个内容是标量变量 枚举和标量数组 基于堆栈 但一个 std string 变量除外 现在 这是我的问题 我可以将结构的整个大小设置为 0 就像我会的那样 如果它只是所有标量 或者 std string 在那里是不可
  • 速记类构造函数字段初始化

    我忍不住觉得有一种简写方法可以写成这样 public abstract class MessageBase public String Destination Sender Uid public MessageBase String des
  • 在 F# 中实现受限数字类型的习惯用法/实践?

    假设需要一种数值数据类型 其允许的值落在指定范围内 更具体地说 假设要定义一个最小值为 0 最大值为 5000 的整数类型 这种情况在很多情况下都会出现 例如在对数据库数据类型 XSD 数据类型等进行建模时 在 F 中对此类类型进行建模的最
  • android 在将数据插入数据库之前检查重复值

    String new recorded lastname a lastname record to database Cursor cursor db rawQuery SELECT lastname FROM people null if
  • 如何在 C 中一次清除多个位?

    我如何将所有这些简化为一行 REG BITA REG BITB REG BITC REG BITD REG BITE 您可以使用 按位或 运算符 REG BITA BITB BITC BITD BITE
  • 如何从 Map> 创建 Multimap

    我没有找到这样的多重映射构造 当我想这样做时 我会迭代映射 并填充多重映射 还有其他办法吗 final Map
  • NSOutlineView 组间距

    我正在开发 NSOutlineView SourceList 并希望用我自己的样式替换当前样式 以便更好地查看我的应用程序 我已经使用自定义 NSTableViewRows 更改了默认标题和内容单元格 这很好用 但现在我可以看到组之间有一个
  • 在 WebView 中禁用邮寄地址的自动链接

    android WebView 将自动检测 html 中的邮寄地址 并允许您单击它来启动地图 有没有办法在不更改本机代码的情况下禁用此功能 我可以在 html 标记中添加一些内容或取消 javascript 事件来防止这种情况发生吗 如果我
  • Angular 6 / 在 tsconfig.lib.json 中声明库的路径

    我正在尝试配置路径Angular 6库 我已经成功配置了以前的 Angular 项目的路径 这是我以前的应用程序的工作原理tsconfig json file compilerOptions baseUrl src paths class
  • 变量多态性的初始化

    假设您有以下代码 class A int i 4 A print void print System out println A class B extends A int i 2 this line public static void