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

无法在超类型构造函数中隐藏val

在超类型构造函数中无法隐藏val是指在面向对象编程中,当一个子类继承自一个父类,并且父类中存在一个被声明为val的属性时,子类无法在其构造函数中隐藏该属性。

这是因为在父类中,val属性被编译器自动转换为私有的字段和公共的getter方法。子类继承了这个属性,并且无法在构造函数中重新定义该属性,因为在子类中无法访问父类的私有字段。

这种设计决策是为了保证继承关系的一致性和可预测性。如果子类能够在构造函数中隐藏父类的val属性,那么在使用父类引用指向子类对象时,无法确定该引用是否能够访问到隐藏的属性。这可能导致代码的不一致性和难以调试的问题。

然而,子类仍然可以通过定义一个与父类val属性同名的属性来实现类似的效果。这样子类就可以在自己的作用域中定义一个新的属性,并且可以在构造函数中初始化该属性。这个新的属性将会隐藏父类的属性,但是无法修改父类的属性。

总结起来,无法在超类型构造函数中隐藏val属性是为了保证继承关系的一致性和可预测性。子类可以通过定义同名属性来实现类似的效果。

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

相关·内容

  • 构造函数以及析构函数PHP需要注意的地方

    构造函数以及析构函数PHP需要注意的地方 基本上所有的编程语言类中都会有构造函数和析构函数的概念。...构造函数函数实例创建时可以用来做一些初始化的工作,而析构函数则可以实例销毁前做一些清理工作。...,则默认调用父类的 析构函数如果没显式地将变量置为NULL或者使用unset()的话,会在脚本执行完成后进行调用,调用顺序测试代码是类似于栈的形式先进后出(C->B->A,C先被析构),但在服务器环境则不一定...如果将构造函数设置成非公共的,那么你将无法实例化这个类。这一点单例模式被广泛应用,下面我们直接通过一个单例模式的代码看来。...关于单例模式为什么要让外部无法实例化的问题,我们可以看看之前的设计模式系统文章的单例模式。

    1.6K20

    为什么应该尽可能避免静态构造函数初始化静态字段?

    不同的是Foo以内联(inline)赋值的方法进行初始化,而Bar则将初始化操作定义静态构造函数。...但是当我们调用一个并不涉及类型静态字段的Invoke方法时,定义Foo的静态构造函数会自动执行,但是定义Bar的则不会,由此可以看出一个类型的静态构造函数的执行时机与类型是否具有beforefieldinit...具体规则如下,这一个规则直接定义CLI标准ECMA-335,静态构造函数在此标准中被称为类型初始化器(Type Initializer)或者.cctor。...: 第一次读取任何一个静态字段之前; 第一个执行任何一个静态方法之前; 引用类型:第一次调用构造函数之前; 值类型:第一次调用实例方法; 由于beforefieldinit标记只有没有显式定义静态构造函数的情况下才会被添加...四、关于“All-Zero”结构体 如果我们一个结构体显式定义了一个静态构造函数,当我们调用其构造函数之前,静态构造函数会自动执行。

    18110

    Scala-8.面向对象-构造函数

    辅助构造函数必须用this为名创建 每个辅助构造函数必须从调用之前定义的构造函数开始 一个构造函数通过this调用另一个不同的构造函数 case class里添加的辅助构造函数不是构造函数,是类的伴生对象的...private[this]修饰意味着只有包含改字段的对象可以访问,字段甚至无法被相同类型的其他实例访问。...定义子类构造函数时,不要用var或者val声明类间公用的字段,然后子类中用val或者var定义新的构造函数参数。...* 调用父类的构造函数Scala定义子类时,可以子类定义extends时控制被其主构造函数调用的构造函数。...* 辅助构造函数的第一行必须调用当前类的另一个构造函数,好久无法调用类的构造函数

    97740

    kotlin基础语法

    我们可以像使用普通函数那样使用构造函数创建类实例: val site = Runoob() // Kotlin 没有 new 关键字 要使用一个属性,只要用名称引用它即可 site.name...抽象成员不存在具体的实现。...如果子类没有主构造函数,则必须在每一个二级构造函数中用 super 关键字初始化基类,或者代理另一个构造函数。...使用 out 使得一个类型参数协变,协变类型参数只能用作输出,可以作为返回值类型但是无法作为入参的类型: in 使得一个类型参数逆变,逆变类型参数只能用作输入,可以作为入参的类型但是无法作为返回值的类型...如果你使用匿名对象作为公有函数的 返回类型或者用作公有属性的类型,那么该函数或属性的实际类型 会是匿名对象声明的类型,如果你没有声明任何类型,就会是 Any。匿名对象 添加的成员将无法访问。

    2.1K20

    【Android进阶】kotlin 委托

    委托模式是软件设计模式的一项基本技巧。委托模式,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。 Kotlin 直接支持委托模式,更加优雅,简洁。.../ 构造函数接受一个映射参数 val site = Site(mapOf( "name" to "菜鸟教程", "url" to "www.runoob.com...site.url) } 执行输出结果: 菜鸟教程 www.runoob.com -------------- Google www.google.com Not Null notNull 适用于那些无法初始化阶段就确定属性值的场合...该函数接受以下参数: thisRef —— 必须与属性所有者类型(对于扩展属性——指被扩展的类型)相同或者是它的类型 property —— 必须是类型 KProperty 或其类型 这个函数必须返回与属性相同的类型...或其类型

    52220

    CC++:std::thread构造函数死锁问题:WIN32下不可以DllMain创建线程

    最近在设计一个动态库时,全局变量创建了线程,Windows下动态库加载时导致死锁。根本的原因是Windows要求不可以动态库的DllMain函数创建线程,而我的代码结构恰好满足这个条件。...extern "C" __declspec(dllexport) void hello() { } 上面的代码A类的构造函数创建了线程,a对象被定义为全局变量,不论是作为exe还是dll执行a都会在程序启动初始化阶段被执行初始化...当在动态库执行时,这个a对象的初始化是动态库入口点(DllMain entry point),也就是DllMain函数完成的。...std::thread的构造函数创建新线程,新线程开始执行线程过程之前不能返回。...因此,会造成线程互锁:新线程开始执行线程过程之前,当前线程无法释放加载器锁,但新线程获取加载器锁之前无法执行线程过程,因为加载器锁由当前线程持有。

    88930

    Spring认证中国教育管理中心-Spring Data Couchbase教程二

    如果类型不可分配,Spring Data 会跳过类型属性。也就是说,被覆盖的属性的类型必须可以分配给它的类型属性类型才能注册为覆盖,否则类型属性被认为是瞬态的。我们通常建议使用不同的属性名称。...考虑以下data类Person: data class Person(val id: String, val name: String) 上面的类编译成一个带有显式构造函数的典型类。...我们可以通过添加另一个构造函数来自定义这个类,并用注释@PersistenceConstructor来指示构造函数的偏好: data class Person(var id: String, val name...在这种安排,使用构造函数是 set 的唯一默认方法SuperType.field。...@AccessType(PROPERTY)由于无法设置属性,因此无法使用 using 。 2.2.文档和字段 所有实体都应使用注释进行@Document注释,但这不是必需的。

    1.8K50

    大数据利器--Scala语言学习(基础)

    8) Scala,Unit 类型比较特殊,这个类型也只有一个实例 () Scala数据类型列表 数据类型 描述 Byte 8位有符号补码整数。...这种函数我们称之为惰性函数 Java 的某些框架代码称之为懒加载(延迟加载),Java没有原生方法。...4) protected 为受保护权限,scala 受保护权限比 Java 更严格 , 只能子类访问,问同包无法访问 (编译器从语法层面控制)。...具体实现请参考“特质叠加” 第一种特质构造顺序(声明类的同时混入特质) 1) 调用当前类的构造器 2) 第一个特质的父特质构造器 3) 第一个特质构造器 4) 第二个特质构造器的父特质构造器,...如果已经执行过,就不再执行 5) 第二个特质构造器 6) …….重复 4,5 的步骤(如果有第 3 个,第 4 个特质) 第 2 种特质构造顺序(构建对象时,动态混入特质) 1) 调用当前类的构造

    1K10

    C++类和对象(下)

    总结: 原赋值的初始化方式某些场景下行不通 原赋值初始化方式的缺点: 无法给 const 修饰成员初始化 无法给 引用 成员初始化 无法给 自定义 成员初始化(且该类没有默认构造函数时) 此时祖师爷看不下去了...初始化列表的初始化顺序取决类的声明顺序 以下几种类型必须使用初始化列表进行初始化 const 修饰 引用 类型 自定义类型,且该自定义类型没有默认构造函数 建议 优先选择使用初始化列表 列表的顺序与声明时的顺序保持一致...答: 有的,存在即合理 利用静态成员变量只能初始化一次的特定,写出函数统计程序运行调用了多少次构造函数 class Test { public: Test(int val = 0) :_val(...类的成员变量为私有,类外函数无法随意访问,但可以类中将类外函数声明为友元函数,此时函数可以正常访问类私有成员 友元函数会破坏类域的完整性,有利有弊 注意: 友元是单向关系 友元不具有传递性..._val << endl; } int main() { Test t; Print(t); } 程序正常编译,结果如下: 友元函数可以用来解决外部运算符重载函数无法访问类成员的问题,但还是不推荐这种方法

    15120

    scala 语法深析

    Trait,anyRef和anyVal的共同子类 None :Option的两个子类有some和None Unit :无返回值的函数类型,和void相对应 Nil :长度为0 的list Any所有类型类...,任何实例都属于Any类型 AnyRef所有引用类型类 AnyVal所有值类型类 Nothing所有其他类型的子类 变量的声明 一般变量用var声明,常量用val声明,常量声明后不能修改 可以指明变量类型...,scala的class类默认可以传参数,默认的传参数就是默认的构造函数。...object: 修饰的称为伴生对象;定义object的属性(字段、方法)都是静 态的,main函数写在里面;scala 的object是单例对象,可以看成是定义静态的方法的类.object不可以传参数...②若想增加一个类的传入参数,则需要在声明的类重写this构造函数,这样就可以mian函数声明有增加的属性的对象,当然原来的对象也可以声明。

    63610

    前端高频面试题(六)(附答案)

    但是它有一个很大的问题就是创建出来的对象无法和某个类型联系起来,它只是简单的封装了复用代码,而没有建立起对象和类型间的关系。(2)第二种是构造函数模式。...但是构造函数存在一个缺点就是,造成了不必要的函数对象的创建,因为 js 函数也是一个对象,因此如果对象属性如果包含函数的话,那么每次都会新建一个函数对象,浪费了不必要的内存空间,因为函数是所有的实例都可以通用的...(2)第二种方式是使用借用构造函数的方式,这种方式是通过类型函数调用类型构造函数来实现的,这一种方法解决了不能向类型传递参数的缺点,但是它存在的一个问题就是无法实现函数方法的复用,并且类型原型定义的方法子类型也没有办法访问到...(3)第三种方式是组合继承,组合继承是将原型链和借用构造函数组合起来使用的一种方式。通过借用构造函数的方式来实现类型的属性的继承,通过将子类型的原型设置为类型的实例来实现方法的继承。...这种方式解决了上面的两种模式单独使用时的问题,但是由于我们是以类型的实例来作为子类型的原型,所以调用了两次类的构造函数,造成了子类型的原型多了很多不必要的属性。

    46730

    3小时Scala入门

    4,变量 Scala支持两种类型的变量,即常量val和变量var。 常量程序不可以被重新指向,变量可以被重新指向新的对象。 声明变量时可以指定类型,也可以由解释器根据初始值自动推断。 ?...九,集合 集合是一种不可变的类型,并且是无顺序的,适合查找某个元素是否集合。 ? ? 十,映射Map 映射和Python的字典很像,但是Scala的Map是一种不可变类型。...Scala有3定义类的风格,java风格,简写风格,和case类风格。 简写风格可以类声明的参数前加上val即表示为类的属性,省去属性的绑定。...二十四,继承和特征 Scala可以通过extends关键字指定从某个类(父类)进行继承。 只有子类的主构造器可以调用类的主构造器。 子类可以使用super引用类的某个属性和方法。...并且一个良好风格的scala程序,只需要使用val不可变变量而无需使用var可变变量。 显式的for或者while循环是不可取的,让我们用更多的高阶函数吧。

    1.6K30

    3小时Scala入门

    4,变量 Scala支持两种类型的变量,即常量val和变量var。 常量程序不可以被重新指向,变量可以被重新指向新的对象。 声明变量时可以指定类型,也可以由解释器根据初始值自动推断。 ?...九,集合 集合是一种不可变的类型,并且是无顺序的,适合查找某个元素是否集合。 ? ? 十,映射Map 映射和Python的字典很像,但是Scala的Map是一种不可变类型。...Scala有3定义类的风格,java风格,简写风格,和case类风格。 简写风格可以类声明的参数前加上val即表示为类的属性,省去属性的绑定。...二十四,继承和特征 Scala可以通过extends关键字指定从某个类(父类)进行继承。 只有子类的主构造器可以调用类的主构造器。 子类可以使用super引用类的某个属性和方法。...并且一个良好风格的scala程序,只需要使用val不可变变量而无需使用var可变变量。 显式的for或者while循环是不可取的,让我们用更多的高阶函数吧。

    1.6K30
    领券