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

使用超级()-constructor时,不会初始化空的最终字段

使用超级()-constructor时,不会初始化空的最终字段。

超级()-constructor是JavaScript中的一个特殊方法,用于在子类的构造函数中调用父类的构造函数。当使用超级()-constructor时,它会执行父类的构造函数,但不会初始化空的最终字段。

最终字段是指在类中声明的没有初始值的字段。在父类的构造函数中,如果没有为最终字段赋值,它们将保持未定义的状态。当子类使用超级()-constructor调用父类的构造函数时,父类的构造函数不会初始化这些最终字段,而是将它们保持为未定义。

这种行为可能会导致一些问题,因为在子类中使用这些最终字段时,它们可能会导致错误或异常。为了避免这种情况,我们应该在子类的构造函数中手动初始化这些最终字段,以确保它们具有适当的值。

以下是一个示例代码,演示了使用超级()-constructor时不会初始化空的最终字段的情况:

代码语言:txt
复制
class Parent {
  constructor() {
    this.finalField;
  }
}

class Child extends Parent {
  constructor() {
    super();
    console.log(this.finalField); // 输出 undefined
  }
}

const child = new Child();

在上面的代码中,Parent类有一个最终字段finalField,它在构造函数中没有被初始化。Child类继承了Parent类,并在构造函数中使用超级()-constructor调用了父类的构造函数。当我们创建Child类的实例时,finalField的值将为undefined,因为父类的构造函数没有为它赋值。

为了解决这个问题,我们可以在Child类的构造函数中手动初始化finalField,如下所示:

代码语言:txt
复制
class Child extends Parent {
  constructor() {
    super();
    this.finalField = 'initialized';
    console.log(this.finalField); // 输出 'initialized'
  }
}

const child = new Child();

在上面的代码中,我们在Child类的构造函数中为finalField赋了一个初始值。这样,当我们创建Child类的实例时,finalField的值将为'initialized',而不是undefined。

总结: 使用超级()-constructor时,不会初始化空的最终字段。为了避免最终字段的未定义问题,我们应该在子类的构造函数中手动初始化这些字段。

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

相关·内容

【Java 虚拟机原理】Java 类中类加载初始化细节 ( 只使用类中常量加载类不会执行到 ‘初始化‘ 阶段 )

( 验证 , 准备 , 解析 ) 阶段 , 就可以完成常量池初始化 , 即使没有执行 初始化 这个步骤 , 也不影响使用类中常量值 ; 在 连接 准备 阶段 , 为 普通 静态变量 进行 默认赋值...静态代码块 没有被执行 , 说明 类加载 流程中 , " 初始化 " 步骤 , 没有被执行 ; 找到 Student.class 字节码文件 , 然后使用 javap -v -Student.class...; 出于最大限度性能优化考虑 , 如果不使用该类其它值 , 就不会执行 " 初始化 " 阶段 ; 因此这里不会调用 静态代码块 中代码 ; Constant pool: #10 = Integer...18 三、数组加载示例 ---- 对数组进行创建操作 , 如创建了一个对象数组 , 此时不会加载该对象对应类 , 只会为其在内存分配空间 ; 创建数组 , 触发是 Student...[] 数组类型 类加载初始化 , 但是不会触发 Student 类初始化操作 ; 如果调用数组中元素 , 就需要初始化 Student 类 ; Student 类 : public class

3.6K20

反射笔记

5.初始化某个类子类。当初始化某个类子类,该子类所有父类都会被初始化。 6.直接使用java.exe命令来运行某个主类。当运行某个主类,程序会先初始化该主类。...java编译器会在编译直接把这个类变量出现地方替换成它值,因此即使程序使用该类变量,也不会导致该类初始化。...类主动使用被动使用和类初始化时机:         当使用ClassLoader类loadClass()方法来加载这个类,该方法只是加载该类,并不会执行该类初始化。...当使用Fields,Methods或Constructors来设置或获取字段,调用方法,或创建和初始化类实例,会执行访问检查(对于public,默认(包)访问,受保护和私有成员)。...以这种方式设置最终字段只有在反序列化或重建具有空白最终字段实例才有意义,才能使其可用于程序其他部分访问。

44510

Java反射原理

这四条字节码指令,如果类型没有进行过初始化,则需要先触发其初始化阶段。...除此之外,所有引用类型方式都不会触发初始化,称为被动引用。...被动引用不会导致初始化,但往往也是需要加载,我们举一些例子: 使用类加载器loadClass()方法,不做类初始化工作 类型.class字面量 子类访问父类静态字段(不会导致子类初始化,会导致父类初始化...使用此方法有效地绕过了编译异常检查,否则该检查将由编译器执行。...* 如果此对象表示一个接口,则此方法返回该接口及其所有超级接口字段。 * 如果此Class对象表示数组类型,原始类型或void,则此方法返回长度为0数组。

6.4K40

JavaScript 类完整指南

2.初始化constructor() constructor(param1,param2,...) 是类中初始化实例特殊方法。在这里你可以设置字段初始值或针对对象进行任何类型设置。...使用封装类的人仅涉及该类提供公共接口,而不会耦合到该类实现细节。 当实现细节被更改时,考虑封装性类更易于更新。 使用私有字段是隐藏对象内部数据一种好方法。...每次使用字段,都必须保留前缀 #:不管是声明、读取还是修改。...4.2 Getter 和 Setter getter 和 setter 模仿常规字段,但是对如何访问和修改字段有更多控制。 在尝试获取字段执行 getter,而在尝试设置值使用 setter。...使用静态方法,要记住两个简单规则: 静态方法 可以访问 静态字段 静态方法 无法访问 实例字段。 让我们创建一个静态方法来检测是否已经使用了具有特定名称 User。

97420

TypeScript 官方手册翻译计划【十二】:类

TypeScript 不会分析在构造器中调用方法以检测初始化语句,因为派生类可能会重写这些方法,导致初始化成员失败。...如果你坚持要使用除了构造器之外方法(比如使用一个外部库填充类内容)去初始化一个字段,那么你可以使用确定赋值断言运算符 !...根据 JavaScript 定义,类初始化顺序是: 初始化基类字段 执行基类构造器 初始化派生类字段 执行派生类构造器 这意味着,因为基类构造器执行时候派生类字段尚未进行初始化,所以基类构造器只能看到自己...因此,在进行诸如单元测试这样操作,访问私有字段会比较容易,但缺点就是这些字段是“弱私有的”,无法保证严格意义上私有性。...最终字段将会获得这些修饰符: class Params { constructor( public readonly x: number, protected

2.6K10

3分钟学设计模式(创建型):1、单例模式

当完成字段赋值,判断则不为,但如果21与24指令交换了顺序,那么字段不为对象并没初始化。...内部类实现 懒汉式实现在使用到实例成员才创建,那么除了像上面一样获取时候进行判来进行延迟创建,其实对于Java来说还有另一种方式就是内部类. public class Single{ private...: 外部类可以访问内部私有成员 类被加载不会加载其中内部类,只有内部类被访问使用时才加载 那么这样就做到了延迟加载也就是懒汉式单例,并且没有多步骤操作,是自然线程安全....DCL实现可以不使用volatile么? 理论上来讲是可以,毕竟加这个volatile也是出于理论上,目前没有找到测试方法。 那么不加volatitle怎么保证不会拿到为初始化对象呢?...保证single字段不为,一定是个完整对象。

29820

ja类主体和方法定义

建设者 该constructor方法是用于创建和初始化使用创建对象特殊方法class。在一个类中,只能有一个名为“ constructor特殊方法。...在严格模式下,将不会发生自动绑定。this保持不变价值。...如上所示,可以使用默认值或不使用默认值来声明字段。 有关更多信息,请参见公共类字段。 私人领域声明 使用私有字段,可以按以下方式细化定义。...#width = width; } } 从类外部引用私有字段是错误。它们只能在类主体中读取或写入。通过定义在类外部不可见内容,可以确保类用户不会依赖于内部,这可能会导致版本之间差异。...例如,当使用诸如这样方法map()返回默认构造函数,您希望这些方法返回父Array对象而不是MyArray对象。

45820

你需要知道 JavaScript 类(class)这些知识

初始化:constructor() constructor(param1, param2, ...)是用于初始化实例类主体中一种特殊方法。 在这里可以设置字段初始值或进行任何类型对象设置。...name ='无名氏'声明一个字段名称,并使用值'无名氏'对其进行初始化。...使用封装类只依赖类提供公共接口,而不耦合类实现细节。 当实现细节改变,考虑到封装而组织类更容易更新。 隐藏对象内部数据一种好方法是使用私有字段。这些字段只能在它们所属类中读取和更改。...使用静态方法,有两个简单规则需要记住: 静态方法可以访问静态字段。 静态方法不能访问实例字段。 例如,创建一个静态方法来检测是否已经使用了具有特定名称用户。...同样,ContentWriter类声明了一个新字段posts。 注意,父类私有成员不会被子类继承。

65710

关于类对象创建与初始化

初始化父类 知乎上看到一个问题: Java中,创建子类对象,父类对象会也被一起创建么?...对齐填充其实也没什么实际含义,只是起到一个占位符作用,因为 HotSpot 虚拟机要求对象大小是 8 整数倍,如果对象大小不足 8 整数倍,会使用对齐填充进行补全。...并且编译器允许我们在调用同类其他实例方法,省略 this。 其实每个实例方法在调用时候都默认会传入一个当前实例引用,这个值最终被传递赋值给变量 this。...我们说了,一个实例对象创建是不会创建其父类对象,而是直接继承父类可继承字段,大致对象内存布局如下: [image] this 关键字可以引用到当前实例对象所有信息,而 super 则只能引用从直接父类那继承来成员信息...实例化阶段主要分为三个部分,实例属性字段初始化,实例代码块执行,构造函数执行。 而实际上,对于实例属性字段赋值与实例代码块中代码都会被编译器放入构造函数中一起运行。

1.6K60

关于类对象创建与初始化

初始化父类 知乎上看到一个问题: Java中,创建子类对象,父类对象会也被一起创建么?...对齐填充其实也没什么实际含义,只是起到一个占位符作用,因为 HotSpot 虚拟机要求对象大小是 8 整数倍,如果对象大小不足 8 整数倍,会使用对齐填充进行补全。...并且编译器允许我们在调用同类其他实例方法,省略 this。 其实每个实例方法在调用时候都默认会传入一个当前实例引用,这个值最终被传递赋值给变量 this。...我们说了,一个实例对象创建是不会创建其父类对象,而是直接继承父类可继承字段,大致对象内存布局如下: ?...实例化阶段主要分为三个部分,实例属性字段初始化,实例代码块执行,构造函数执行。 而实际上,对于实例属性字段赋值与实例代码块中代码都会被编译器放入构造函数中一起运行。

80250

对不起,我就是喜欢问你Spring构造器注入原理

答:参照没有注解处理方式: 若构造器只有两个,且存在无参构造器,将直接使用无参构造器初始化。...答:参照没有注解处理方式: 构造器只有一个且有参数,将会把此构造器作为适用构造器返回出去,使用此构造器进行实例化,参数自然会从IOC中获取Bean进行注入。...答:参照有注解处理方式: 在最后判断candidates适用构造器集合是否为,若有注解,此集合当然不为,且required=true,也不会将默认构造器集合defaultConstructor...加入candidates集合中,最终返回是candidates集合数据,也就是这唯一一个打了注解构造器,所以最终使用此打了注解构造器进行实例化。...requiredConstructor集合是否为判断,一个是candidates集合为判断,若两个构造器required属性都为false,不会进行上述判断,直接放入candidates集合中

2.8K21

单例模式迭代式优化过程

饿汉式单例模式 它是最简单实现单例模式一种方式,所谓饿汉式是指它在类初始化时就会完成相关单例对象创建(不会受任何不同条件影响,即都会创建),可以想象以下在什么场景用什么方法可以在类初始化时就执行...,它优点是不存在线程安全问题,因为你多线程去获取对象走都是getInstance方法,它只会触发一次而并不自动销毁,它唯一性由jvm虚拟机在类初始化创建保证,但是缺点是如果对象创建比较耗资源比如...hbaseConnection对象,则如果实例单例对象不使用就会造成资源浪费 懒汉式单例 区别于饿汉式单例,它思想是在需要使用单例对象才创建,如果对象存在则直接返回,如果对象不存在则创建后返回...最简单懒汉式单例模式实现如下 public class LazySingleton { // 静态加载对象 private static LazySingleton instance...由于线程1已经将变量指向内存地址,所以其他线程判断instance不为,进而直接获取,但instance可能尚未初始化完成 if (instance == null) { synchronized

28710

对不起,我就是喜欢问你Spring构造器注入原理

答:参照没有注解处理方式:若构造器只有两个,且存在无参构造器,将直接使用无参构造器初始化。...答:参照没有注解处理方式:构造器只有一个且有参数,将会把此构造器作为适用构造器返回出去,使用此构造器进行实例化,参数自然会从IOC中获取Bean进行注入。...答:参照有注解处理方式:在最后判断candidates适用构造器集合是否为,若有注解,此集合当然不为,且required=true,也不会将默认构造器集合defaultConstructor加入...candidates集合中,最终返回是candidates集合数据,也就是这唯一一个打了注解构造器,所以最终使用此打了注解构造器进行实例化。...requiredConstructor集合是否为判断,一个是candidates集合为判断,若两个构造器required属性都为false,不会进行上述判断,直接放入candidates集合中

1.1K21

【翻译】ECMAScript装饰器简单指南

1 proposal 定义提案,依赖,挑战,示例,polyfills等使用用例。某个拥护者(TC39成员)将负责此提案。 2 draft 这是最终版本草稿版本。 因此需要提供该功能描述和语法。...当用var obj = {}定义一个或非对象,默认情况下,obj .__ proto__指向Object.prototype,因此obj具有Object类原型。...由于类实例字段既不是类一部分也不是它原型,因此操作它descriptor并不简单。 Babel给我们是类实例字段property descriptor上初始化函数,而不是值键。...为什么初始化函数而不是值,这个主题是争论,因为装饰器处于第2阶段,没有发布最终草案来概述这个,但你可以按照Stack Overflow上这个答案来理解整个背景故事。...该函数返回分配给类实例字段初始值。 在装饰器内部,我们需要返回另一个返回最终初始化函数。 类实例字段提案具有高度实验性,并且直到它进入第4阶段之前很有可能它语法可能会发生变化。

67210

Nest.js 从零到壹系列(七):讨厌写文档,Swagger UI 了解一下?

上家公司在恒大时候,项目的后端文档使用 Swagger UI 来展示,这是一个遵循 RESTful API 、 可以互动文档,所见即所得。...这些都还好,之前还有直接丢个 .doc 文档过来。。。。 以前我总吐槽后端太懒,文档都不愿更新,直到自己写后端,嗯,真香。。。于是,为了不耽误摸鱼时间,寻找一个趁手文档工具,就提上日程了。...: string | number; } 保存,刷新页面(该页面没有热加载功能),再看看效果: 看到已经有了字段信息了,但是我们 role 字段是【可选】,而文档中是【必填】,接下来再完善一下描述...,或者 token 过期了,也不会有任何提示。...,还能看到 DTO 详情: 再点击 try it out 按钮时候,就会自动使用默认参数了: 总结 本篇介绍了如何使用 Swagger 自动生成可互动文档。

4.4K10

单例模式-温故而知新

在同一个类加载器下,一个类型只会被初始化一次,一共有六种能够触发类初始化时机: 1、虚拟机启动初始化包含 main 方法主类; 2、new等指令创建对象实例 3、访问静态方法或者静态字段指令...4、子类初始化过程如果发现其父类还没有进行过初始化 5、使用反射API 进行反射调用时 6、第一次调用java.lang.invoke.MethodHandle实例 这种我不管你用不用,只要我这个类初始化了...这就要涉及到另外一个知识点了,静态内部类加载时机。 刚才说到类加载时候,初始化过程只会加载静态变量和代码块,所以是不会加载静态内部类。...静态内部类是延时加载,意思就是说只有在明确用到内部类才加载。只使用外部类不加载。...这时候线程B调用了getSingleton()方法,走到第一个判,发现不为,返回单例,结果用时候就有问题了,对象都没有初始化完成。 这就是指令重排有可能导致问题。

48640

Android 序列化框架 Gson 原理分析,可以优化吗?

在序列化时,首先使用反射获取字段值,再使用字段 BoundFiled 序列化; 在反序列化时,首先创建对象实例(下文会讨论如何创建),再使用依次使用字段 BoundField 反序列为字段类型值,...在构造 Gson 对象,已经初始化了一系列 TypeAdapter 创建工厂,开发者可以注册自定义 TypeAdapter: Gson.java Gson(final Excluder excluder...类型 TypeAdapter ,而下一次会从缓存获取,不会发生无限递归。...当 Class 未提供默认无参构造函数,Gson 会使用 Unsafe API 兜底来创建对象。...这个 API 不会调用构造函数,因此相关构造初始化操作会丢失; 1、构造函数参数默认值丢失; 2、字段默认值丢失; 3、Kotlin 非类型失效; 4、初始化块未执行; 5、by 属性代理(没有创建代理对象

2.2K50

细数 TS 中那些奇怪符号

那么非断言操作符到底有什么用呢?下面我们先来看一下非断言操作符一些使用场景。...下面我们来介绍值合并运算符特性和使用一些注意事项。 3.1 短路 当空值合并运算符左表达式不为 null 或 undefined 不会对右表达式进行求值。...在初始化 Person 类型变量,如果缺少某个属性,TypeScript 编译器就会提示相应错误信息,比如: // Property 'age' is missing in type '{ name...与常规属性(甚至使用 private 修饰符声明属性)不同,私有字段要牢记以下规则: 私有字段以 # 字符开头,有时我们称之为私有名称; 每个私有字段名称都唯一地限定于其包含类; 不能在私有字段使用...10.1 私有字段与 private 区别 说到这里使用 # 定义私有字段与 private 修饰符定义字段有什么区别呢?

5.7K32
领券