首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么我的超类的字段在这里被初始化?

这个问题是关于Java编程语言中的类和对象初始化的问题。在Java中,当一个类被加载时,它的静态字段会被初始化,而实例字段则在创建类的对象时被初始化。如果你在子类中没有看到超类的字段被初始化,可能是因为这些字段是静态的,或者它们在超类的构造函数中被初始化。

以下是一些可能的原因和解决方案:

  1. 静态字段:如果超类的字段是静态的,那么它们会在类被加载时被初始化。这意味着,当你创建第一个类的对象时,静态字段会被初始化。如果你没有看到这些字段被初始化,可能是因为你还没有创建任何对象。
  2. 构造函数中的初始化:在Java中,构造函数是用于初始化对象的。如果超类的字段在超类的构造函数中被初始化,那么这些字段将在创建对象时被初始化。如果你没有看到这些字段被初始化,可能是因为你还没有创建任何对象。
  3. 子类构造函数:如果子类有自己的构造函数,那么超类的构造函数可能不会被调用,从而导致超类的字段没有被初始化。为了解决这个问题,你可以在子类的构造函数中显式调用超类的构造函数,例如:super();
  4. 初始化顺序:如果你的类有多个构造函数,并且它们调用了不同的超类构造函数,那么初始化顺序可能会导致问题。为了解决这个问题,你可以确保所有构造函数都调用相同的超类构造函数,或者使用初始化块来确保字段被正确初始化。

总之,如果你在子类中看不到超类的字段被初始化,可能是因为这些字段是静态的,或者它们在超类的构造函数中被初始化。你可以检查你的代码,确保你正确地调用了超类的构造函数,并且在初始化顺序方面没有问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

构造方法、初始化块以及字段初始化顺序

多构造函数 初始化块 ​ 如果一个中既有初始化块,又有构造方法,同时还设定了字段初始值,谁说了算?...,在实际开发中不要这样写代码,应该尽量保证一个字段初始化一次! ​...如果使用上面定义,思考一下代码输出结果: public static void main(String[] args) { InitializeBlockClass obj = new...} 规律(字段初始化顺序) 执行成员定义时指定默认值或初始化块,到底执行哪一个要看哪一个“排在前面”。 执行构造函数。...初始化块不接收任何参数,而且只要一创建对象,它们就会被执行。因此,适合于封装那些“对象创建时必须执行代码”。

52920
  • 为什么要创建一个不能实例化

    摄影:产品经理 感谢小何上等牛肉 当我们创建一个Python 初始化时,一般代码这样写: class People: def __init__(self, name): self.name...但如果有一天,你发现写了这样一个: class People: def say(self): print(f'叫做:{self.name}') def __new...一个不能初始化,有什么用? 这就要引入我们今天讨论一种设计模式——混入(Mixins)。 Python 由于多继承原因,可能会出现钻石继承[1]又叫菱形继承。...为了保留多继承优点,但又摒除缺点,于是有了混入这种编程模式。 Mixins 是一个 Python ,它只有方法,没有状态,不应该被初始化。它只能作为父继承。...: 本质上,混入写法与普通继承没有什么区别。

    3.4K10

    String为什么设计为不可变

    . */ private final char value[]; } String值是保存在value数组中,并且是private final修饰 private修饰,表明外部是访问不到...value,同时子类也访问不到,当然String不可能有子类,因为final修饰了 final修饰,表明value引用是不会被改变,而value只会在String构造函数中被初始化,而且并没有其他方法可以修改...value数组中值,保证了value引用和值都不会发生变化 final关键字作用有如下几种 final修饰时,表明这个不能继承 final修饰方法,表明方法不能重写 final修饰变量,如果是基本数据类型变量...,则其数值一旦在初始化之后便不能改变;如果是对象类型变量,只能保证它引用不变,但对象内容是可以改变 在Java中数组也是对象,数组即使final修饰,内容还是可以改变 所以我们说String...this : new String(value, beginIndex, subLen); } 为什么String设置为不可变? 字符串常量池 字符串常量池可以节省大量内存空间。

    52610

    Java中String能否继承?为什么

    不能继承,因为String有final修饰符,而final修饰是不能继承。...{ // 省略...  } final修饰符用法: 1.修饰   当用final修饰一个时,表明这个不能继承。...final成员变量可以根据需要设为final,但是要注意final所有成员方法都会被隐式地指定为final方法。 ? 2.修饰方法   使用final修饰方法原因有两个。...注:一个private方法会隐式地指定为final方法。...3.修饰变量   对于final修饰变量,如果是基本数据类型变量,则其数值一旦在初始化之后便不能更改;如果是引用类型变量,则在对其初始化之后便不能再让其指向另一个对象。

    1.9K60

    为什么使用不了了?

    【分析】:这个错误比较明显,图中将“TestClass2”写在了 “TestClass1”中,在使用中是不允许出现嵌套,否则就是我们常说”,必须杜绝这样编程失误。...错误情况2 在同一项目中使用“TestClass2”这个时出现错误。 【分析】:“TestClass1”中只有一个方法,没有其他,所以不存在“情况。...仔细观察,发现Program 命名空间为 “thinger.com” ,而“TestClass1”命名空间为 “thinger.com.cn”,两者命名空间不一致。...解决方案 将名改为 “TestClass1”即可。 错误情况4 在调用库中“TestClass”这个时出现错误。 【分析】:无法调用库中时,可能是由于没有在项目中将库引用进来。...在解决方案下找到要添加引用库,点击确定,将库引用进来。  最后在代码中引用库,问题解决。

    70230

    硬核Java工程师分享,什么是Java?为什么要做Java,是如何学习Java

    除此之外,Java 还有一些比较特别的概念,比如面向对象特性,其中有、接口等概念。为什么 Java 要引入这些东西呢,其实就是想让使用者更好地进行设计、抽象和编程。...Java核心技术 说完基本知识之后,想你也会好奇,Java里经常提到一些集合是干嘛呢,因为在现实生活中有很多场景,需要用到集合,比如说一个用户名列表,你要怎么存呢?...为什么要选择Java 最近有一些小伙伴问我,为什么当初选择走Java这条路,为什么不做C++、前端之类方向呢,另外还有一些声音:研究生不是应该去做算法方向么,本科生不就可以做开发了吗,为什么还要读研呢...,就可能安排到研发岗位,这也是身边很多同学亲身经历。...比如讲基础数据类型,int、double、float分别占用几个字节,我们压根不知道为什么要这么分,讲面向对象、和接口,更是一脸懵逼。

    99200

    为什么校招面试中“线程与进程区别”老是问到?该如何回答?

    除此之外,推荐看一下阮一峰一篇博客:进程与线程一个简单解释,用图解释十分生动形象。 为什么这个问题是面试高频? 既然这个问题是面试当中会被经常问到,所以我去网上找一个答案,背出来不就好了。...我们来分析一下为什么众多面试官老是问这个问题,他应该并不是想听到一个对书本上概念重复。 那么,他究竟想考什么?...在这里插入图片描述 通过上图,方便我们了解并记忆: 进程与进程之间相对独立 进程可以包括几个或者上百个线程在运行。...在这里插入图片描述 同理,上图我们知道线程包含: 栈(堆栈):主线程main函数、进行函数调用参数和返回地址、局部变量等内容都会被压入栈内 PC(Program Couner):程序计数器,PC指针指向代码所在内存地址...总结 总之,如果上述内容你都了解,那肯定是不怕问到(大佬,请收下膝盖);如果看了此篇文章之后,你能答出个大概,相信面试官也会放过你,毕竟,我们也真的不是背书机器。

    1.1K30

    初中生写库、框架惊到了!年近40表示压力山大……

    接下来为大家介绍主角的确是初中生,他们写库,框架所涉及到知识点并,不,少! 不知道在座各位程序员看后会作何感想? 下图是这位初中大佬GitHub主页。 ?...当我找到这位初中程序猿个人博客,点开“关于”,赫然写着南通市通州区实验中学……后生可畏啊! ? 闲话少说,步入正题。以下是这位大佬写库、框架。...还提供了完整工具集,包括CLI等等。Container化管理,符合PSR标准,十分简化,并且是 Event-Driven。...他介绍到:“NonDB前身是XDO和xdb,是一个非关系型文档数据库(但是旧版xdb是关系型)。同样,他前身是小学开始开发,最初版用一个周末完成,那时代码写得很皮,自己都看不懂了。” ?...NonDB完全符合PSR标准,注释完备,接口开放,底层Driver上层Sorter, Dumper, Checker都可以注册为自己。 性能很高,默认LocalDriver是JSON存储

    53430

    【Kotlin】初始化 ① ( 成员属性 | Kotlin 自动为成员字段生成 getter 和 setter 方法 | 手动设置成员 getter 和 setter 方法 | 计算属性 )

    文章目录 一、Kotlin 自动为成员字段生成 getter 和 setter 方法 二、手动设置成员 getter 和 setter 方法 三、计算属性 一、Kotlin 自动为成员字段生成 getter...和 setter 方法 ---- 定义 Kotlin , 在 中 定义成员属性 , 会自动生成 getter 和 setter 方法 ; 在 Kotlin 中定义如下 , 在其中定义两个字段...结果 如下 : 二、手动设置成员 getter 和 setter 方法 ---- Kotlin 会为 每个 成员属性 生成一个 field , getter , setter ; field...hello.name) hello.name = "Jack" println(hello.name) } 执行结果 : Tomy Jackyy 三、计算属性 ---- 如果 Kotlin ...某个属性 是 通过计算得到 , 可以 在该属性 getter 和 setter 方法中进行计算设置或获取结果 , 不使用 field 属性 ; 下面的 age 属性就是通过计算得到属性值 , 每次获取都是

    1.8K20

    面试官:告诉为什么static和transient关键字修饰变量不能序列化?

    一、写在开头在上一篇学习序列化文章中我们提出了这样一个问题:“如果在对象中,有些变量并不想序列化应该怎么办呢?”...当时给回答是:不想序列化变量我们可以使用transient或static关键字修饰;transient 关键字作用是阻止实例中那些用此关键字修饰变量序列化;当对象反序列化时, transient...当时没有解释具体为什么static和transient 关键字修饰变量就不能序列化了,这个问题实际上在很多大厂面试中都可能会被问及。我们今天在这篇中进行解释吧。...四、总结好啦,今天针对为什么static和transient关键字修饰变量不能序列化进行了一个解释,下次大家在面试时候再被问道就可以这样回答啦,不过,还有的BT面试官会问transient关键字修饰变量真的不能序列化吗...正在参与2024腾讯技术创作特训营最新征文,快来和我瓜分大奖!

    15520

    为什么Java中成员变量不能重写?成员变量在Java中能够重写么?不会重写成员变量,而是隐藏成员变量访问隐藏域方法

    这篇文章讨论了Java面向对象概念中一个基本概念--Field Hiding(成员变量隐藏) 成员变量在Java中能够重写么?...Paste_Image.png 按照我们已有的多态概念,第二个应该是输出sub才对,但却输出了super。这是为什么呢?...意思就是: 在一个中,子类中成员变量如果和父成员变量同名,那么即使他们类型不一样,只要名字一样。父成员变量都会被隐藏。在子类中,父成员变量不能简单用引用来访问。...而是,必须从父引用获得父隐藏成员变量,一般来说,我们不推荐隐藏成员变量,因为这样会使代码变得难以阅读。...其实,简单来说,就是子类不会去重写覆盖父成员变量,所以成员变量访问不能像方法一样使用多态去访问。

    3.5K40

    java多态理解和底层实现原理剖析

    对于构造函数而言,java虚拟机总是直接在初始化时调用初始化方法,并确保这个过程是线程安全,并不会对外提供任何字节码指令来调用构造方法。...invokespecial指令对于super方法调用,会动态搜寻当前,找到离得最近中该方法实现,因此super方法调用是个例外,对于其他情况而言,都采用是静态绑定。...实例变量同理,例如: CockerSpaniel继承了父Dog,父提供了一个wagCount实例字段,可以看到此时wagCount在父Dog和子类CockerSpaniel实例字段表中索引都是...方法表中只会存储非私有的实例方法,静态方法不会出现在这里,因为他们是静态绑定,不需要在方法表间接指向。私有方法和实例初始化方法也不需要在这里出现,因为他们也是静态绑定。...---- 接口方法调用为什么不能利用方法表快速定位 当通过接口引用来访问实例方法时,符合引用解析为直接引,但是直接引用不能保证得到方法表偏移量,因为无法保证是子类自己实现了接口还是实现接口,那么接口方法在方法表中出现顺序就无法确定下来

    79520

    最近遇到10个Java面试问题

    在这里,最好方法是尽可能多地了解这些集合类型,因为各种问题几乎是取之不尽。 4. Object 有哪些方法? 这是一个很常见问题,用来确定你对基本知识熟悉程度。...为了线程安全,避免使用同步;字符串是隐式线程安全。 4、字符串在Java加载器中使用,不可变性提供了正确加载器加载安全性。例如,考虑一个您试图加载java.sql实例。...连接,但引用更改为myhacking。连接,可以对数据库执行不需要操作。 5、因为String是不可变,所以它hashcode会在创建时缓存,不需要再次计算。...diamond问题反映了为什么不允许在Java中进行多次继承。如果有两个具有具有特定方法共享,那么它将在两个子类中被重写。...2、使所有字段都是私有的,这样就不允许直接访问。 3、不要为变量提供setter方法 4、让所有可变字段成为final,这样它值只能赋值一次。 5、通过执行深度复制构造函数初始化所有字段

    67230

    .NET Core中延迟单例另一种写法【.NET Core和.NET Frameworkbeforefieldinit差异】

    1.BeforeFieldInit是什么    前段时间在反编译代码时无意间看到在中有一个BeforeFieldInit特性,处于好奇心态查了查这个特性,发现这是一个关于字段初始化时间特性【提前初始化字段...x和一个静态方法GetStr方法,在这里需要关注是静态字段x初始化时机 static void Main(string[] args) { Console.WriteLine("Main...可以看到静态成员字段初始化是在最开始,那么为什么会这样呢,我们将代码反编译IL后会发现在中具有一个beforefieldinit特性, .class private auto ansi beforefieldinit...BeforeFieldInit详细讲解,在这里也不过多介绍, 2.取消BeforeFieldInit加载   那么该怎么取消beforefieldinit特性呢,其实很简单,只需要在中加入一个静态构造函数即可...当然,这种创建单例也是有缺点,当中还有其它静态字段或属性时,并且在外部进行了调用,那么此时也会初始化此属性 class Program { static void Main(string[

    70440

    JVM 类型生命周期学习

    (5)当初始化某个子类时(某个初始化时,要求它累已经初始化了) (6)当虚拟机启动时表名为启动(即含有main()方法那个) 装载 装载阶段由三个基本动作组成,要装载一个类型,JAVA...在前面的章节中描述过,动态连接过程包括通过保存在常量池中符号引用查找引用、接口、字段以及方法,把符号引用替换成直接引用。...(3)确保在类型和类型之间没有不兼容方法声明(比如两个方法拥有相同名字,参数再数量、顺序、类型上都相同,但是返回类型不同)这里需要在子类初始化初始化。...初始化 一个包含两个步骤: 1、如果累存在直接的话,且直接还没有初始化,就先初始化直接。 2、如果累存在一个初始化方法,就执行此方法。...当初始化一个直接时候,也就是包含这两个步骤。因此,第一个初始化永远是Object,然后主动使用继承树上所有总是在子类之前初始化

    42230

    Spring中眼见为虚 @Configuration 配置

    一、前言 在这里不得不感慨Spring代码完善与优秀,从之前看源码迷迷糊糊到现在基本了解Spring部分源码后,愈来愈发现Spring开发者思虑之周全! 之前说过学习源码目的在哪?...相信有不少同学,张口就说一次,对,没错,但是为什么呢?当时对这里问题深深感到自我怀疑!甚至一度怀疑自己java基础,明明这里调用了另外一个方法,但是为什么没有进行两次实例化呢?...问了很多同事、朋友,他们只知道这样写是没有问题!但是具体原因不知道!为什么呢?我们带着这个问题往下看! 三、你看到配置是真的配置吗?...非CGLIB)是否实现BeanFactoryAware?...$$beanFactory属性,这个属性就是在这里赋值

    1.2K20

    静态初始化块即将纳入ES2022,我们先一睹为快

    Ron Buckton 提出 ECMAScript 提案 "静态初始化块"已进入第四阶段,计划纳入ECMAScript 2022。...为了建立一个实例,在JavaScript中有两个结构: 字段:创建(可选择初始化)实例属性。 构造函数:在 setup 完成之前执行代码块。 对于静态部分设置,我们只有静态字段。...ECMAScript建议为引入静态初始化块,大致上,它对静态作用就像构造函数对实例作用。 1.为什么我们需要静态块?...3.详情 静态块具体内容相对来说是合乎逻辑(相比之下,实例成员规则更为复杂): 每个可以有一个以上静态块。 静态块执行是与静态字段初始化执行交错进行。...静态成员在子类静态成员之前被执行。

    19620
    领券