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

当基类已经导致Kotlin中的初始化时,如何防止子类私有var初始化?

在Kotlin中,当基类中存在初始化代码时,子类无法通过直接覆盖变量的方式来初始化私有var变量。这是因为在Kotlin的类继承中,初始化代码是在基类的构造函数执行过程中被调用的,而子类初始化代码在基类初始化完成之后才会执行。

如果想要在子类中初始化私有var变量,可以通过以下两种方式来实现:

  1. 使用次构造函数:在子类的次构造函数中,可以调用基类的构造函数并传入所需的初始值,然后再对私有var变量进行初始化。示例如下:
代码语言:txt
复制
open class BaseClass(private var property: String) {
    init {
        // 基类的初始化代码
    }
}

class SubClass : BaseClass {
    constructor(property: String) : super(property) {
        // 子类的次构造函数
        this.property = "newValue"  // 初始化私有var变量
    }
}
  1. 使用延迟初始化属性(lateinit):延迟初始化属性是Kotlin中的一种特性,它允许我们在声明属性时不立即初始化,而是在使用该属性之前再进行初始化。注意,延迟初始化属性只适用于非空类型。示例如下:
代码语言:txt
复制
open class BaseClass {
    lateinit var property: String
    
    init {
        // 基类的初始化代码
    }
}

class SubClass : BaseClass() {
    init {
        // 子类的初始化代码
        property = "newValue"  // 初始化延迟属性
    }
}

在上述示例中,我们使用了延迟初始化属性来在子类中对私有var变量进行初始化。需要注意的是,延迟初始化属性必须在使用之前被赋值,否则会抛出未初始化的异常。

以上是针对在基类已经导致Kotlin中的初始化时如何防止子类私有var初始化的两种常见方法。根据具体的场景和需求,可以选择适合的方式进行实现。

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

相关·内容

Kotlin邂逅设计模式之单例模式(一)

三、基本要求 1、构造器私有化,private修饰,主要为了防止外部私自创建该单例对象实例 2、提供一个该实例对象全局访问点,在Java中一般是以公有的静态方法或者枚举返回单例对象 3、在多线程环境下保证单例有且只有一个对象实例...(); INSTANCE = var0; } } 可能会有人疑问: 没有看到构造器私有化,实际上这一点已经在编译器层面做了限制,不管你是在Java还是Kotlin中都无法私自去创建新单例对象...七、线程安全懒汉式单例 可是有时候我们并不想当加载时候就去创建这个单例实例,而是想当我们使用这个实例时候才去初始化它。...,锁住getInstance方法,每一次调用该方法时候都得获取锁,但是如果这个单例已经初始化了,其实按道理就不需要申请同步锁了,直接返回这个单例实例即可。...() { //构造器私有化 } //公有获取单例对象函数 //DCL(Double Check Lock) 既能在需要时候初始化单例,又能保证线程安全,且单例对象初始化完后

95530

Kotlin 漫谈系列之类与继承

既没用 class 修饰,也没用 static 修饰就是实例方法。 Kotlin: Kotlin 里面已经没有方法概念了。?...构造函数覆盖也是一样子类覆盖父初始化步骤: 初始化子类所有成员变量 用 super 调用父初始化器 一些额外操作 class SomeClass: BaseClass { let...,所以在初始化可以随意访问主构造函数参数。...没有 NSObject 概念 构造函数(初始化器) 构造函数也可以叫做初始化器(Initializer) 用 init 关键字来定义构造函数 class SomeClass { init...(string: String) { } }let instance = SomeClass(string: "KotlinThree") 如果类含有成员变量,在初始化时,必须保证所有成员变量都被初始化

3.6K40
  • Kotlin语法基础之继承

    如果类没有主构造器,那么每个辅助构造器初始化时需要使用super关键字,或者将其委托给其他构造器。需要注意是,在这种情况下,不同辅助构造器可以调用不同构造器。...如果没有open注解,比如Basenv(),那么在子类是不能覆写该方法。在一个final(没有open注解声明),open成员是禁止。...base3: Base = AnotherDerived() base1.v() base2.v() base3.v() } 覆写属性 覆写属性和覆写方法基本类似;如果子类要重新声明父已经声明过属性...每个声明属性可以被具有初始化属性或具有getter方法属性覆盖。...总结 Kotlin默认是final,如果需要子类继承,需要使用open修饰; Kotlin方法默认是不允许复写,只有用open修饰时,子类才可以进行覆写,并且需要使用override进行显示标注

    85990

    JAVA安全编码标准学习分享

    14、在文件或者网络IO两端使用兼容编码方式 二、声明和初始化 1、防止循环初始化,因为声明为static final一个字段为并不能保证它在被读之前已经完全初始化 public class...1、只有受信子类能对具有不变性和方法进行扩展 2、声明数据成员为私有并提供可访问封装器方法 3、改变时,保存子类之间依赖,不能破坏子类所依赖程序不可变性。...,避免子类覆盖后访问权限过大 4、确保构造函数不会调用可覆写方法,避免子类发起创建时却调用了子类方法,得到一个未初始化值 5、不要在clone()调用可覆写方法 6、定义了equals(...9、在异常条件时,保证释放已经持有的锁 10、不要执行那些持有锁时会阻塞操作 11、不要使用不正确形式双重检查惯用法,需要保证延迟初始化必须在多线程是同步 12、方法和成员使用不同内置锁时...9、不要从readObject()方法调用可以被覆写方法,因为反序列化发生在反序列化前,所以在readObject()调用可覆写方法会读取到子类被完全创建之前状态 10、在序列化时避免出现内存和资源泄漏

    4.6K10

    Kotlin入门(23)适配器进阶表达

    所以ViewHolder便应运而生,它在列表项首次初始化时,就将其视图对象保存起来,后面再次加载该视图时,即可直接从持有者处获得先前视图对象,从而减少了系统开销,提高了系统运行效率。...为方便理解循环适配器Kotlin编码,下面以微信公众号消息列表为例,给出对应消息列表Kotlin代码: //ViewHolder在构造时初始化布局控件对象 class RecyclerLinearAdapter...onItemLongClick(v, position)             true         }     }     //ItemHolder属性在构造时初始化     inner...然而不过是雕虫小技,Java也照样能够运用,所以这根本不入Kotlin法眼,要想超越Java,还得拥有独门秘笈才行。...这三要素包括: //布局文件对应资源编号、列表项数据结构、各个控件对象初始化操作 class RecyclerCommonAdapter(context: Context, private

    1.8K41

    Kotlin 创建接口或者抽象匿名对象实例

    Kotlin 继承 1.使用 open 关键字进行修饰 2.主构造函数紧跟着在后面声明函数 open class Person(var name : String, var age : Int){/...(name){ //初始化 println("-------类次级构造函数---------") } } /**子类继承 Person **/ class Student:Person{...一个从其他或者接口(继承实现来方法),同名方法,在子类必须显示进行调用 open class A { open fun f () { print("A") } fun a() { print...因为val属性本身定义了getter方法,重写为var属性会在衍生额外声明一个setter方法 你可以在主构造函数中使用 override 关键字作为属性声明一部分: interface Foo...bar() // 未实现 fun foo() { //已实现 // 可选方法体 println("foo") } } 接口中属性 接口中属性只能是抽象,不允许初始化值,接口不会保存属性值

    3K41

    Kotlin实体创建方式

    = '1' } 补充知识:Kotlin、构造器、对象 1.Kotlin定义 构成: 构成由构造函数和初始化代码块、属性(字段)、函数(方法)、内部类(嵌套)、对象声明五部分组成 /.../Kotlin创建对象无new关键字 } 3.创建构造器 Kotlin没有创建构造器时,与Java类似的是,与Java类似的就是没有显示提供主函数时,Kotlin会为其生成一个无参构造。...: String private var age: Int //在Kotlin中使用init初始化代码块,它作用是为了主构造函数服务,由于主构造函数是放在首部,是不能包含任何初始化执行语句...用来创建,封装常用方法,以及处理一些共有的逻辑,而这个所谓一般都是抽象。...Kotlin抽象定义 抽象,可以理解为定义了一个模板。所有的子类都是根据这个模板是填充自己代码。 关键字:abstract 抽象可以分为:抽象、抽象函数、抽象属性。

    4K10

    Kotlin入门(14)继承那些事儿

    () {}”,这跟Java对比有明显差异,那么Kotlin究竟是如何定义并由派生出子类呢?...因此,接下来还是按照Kotlin规矩办事,重新写个采取open修饰,下面即以鸟类Bird进行演示,改写后代码框架如下: open class Bird (var name:String,...就像大家在Java和C++世界熟知几个关键字,包括public、protected、private,分别表示公开、只对子类开放、私有。...只有头戴open帽子,才允许作为派生出子类来;而头戴open帽子函数,表示它允许在子类中进行重写。...,再来声明一个它子类试试,例如鸭子是鸟类一种,于是下面有了鸭子定义代码: //注意父Bird已经在构造函数声明了属性,故而子类Duck无需重复声明属性 //也就是说,子类构造函数,在输入参数前面不要再加

    1.6K50

    C++基础知识精髓

    不要在构造函数定义(构造函数可能被调用多次)另外是因为声明不分配内存空间.静态成员变量初始化方式:int Person::m_var = 10;静态成员变量只在静态存储区保留一份拷贝,静态成员变量可以声明为本来类型...3.构造函数可以重载 4.构造函数初始化可以使用初始化参数列表,成员变量初始化顺序跟初始化列表顺序无关,是按照成员变量声明顺序。...友元: 友元所有成员函数都是另一个友元函数,都可以访问另一个隐藏信息(包括私有成员和保护成员)。 希望一个可以存取另一个私有成员时,可以将该类声明为另一友元。...继承 继承:之间关系 父() 子类(派生) 继承语法 构建子类对象,先调用父构造函数,再调用子类自己构造函数,析构时候先调用子类自己析构函数,再调用父析构函数 父...私有继承即所有成员均变成派生私有成员,私有成员仍然不能在派生访问 class BASE { public: void who() { cout <<

    2K50

    嵌入式软件工程师笔试面试指南-CC++

    派生在构造函数要对自身成员初始化,也要对继承过来成员进行初始化没有默认构造函数时候,通过在派生构造函数初始化列表调用构造函数实现。...成员变量在使用初始化列表初始化时,与构造函数初始化成员列表顺序无关,只与定义成员变量顺序有关。...如果不使用初始化列表初始化,在构造函数内初始化时,此时与成员变量在构造函数位置有关。 注意:成员在定义时,是不能初始化 注意:const成员常量必须在构造函数初始化列表初始化。...一个为另一个成员变量时,如何对其进行初始化?...protected);私有成员不可见,私有成员依然是私有的,子类不可访问。

    1.6K11

    Kotlin 和对象介绍

    介绍:在Kotlin可以包含:构造函数和初始化代码块,函数,属性,内部类,对象声明....如果我们要在主构造器创建时进行初始化操作,那么我们直接在init{}函数里面实现我们逻辑即可....如果我们要初始化时定义属性值空那么该如何处理? Kotlin提供了一种可以延迟初始化方案,使用lateinit 关键字来描述属性....但是已经有嵌套了.为什么还有一个内部类? 因为内部类会带有一个对外部类对象引用.所以内部类是可以直接访问外部类属性和函数....添加标注之后就可以被继承了 annotation 注解 访问权限修饰符:标注或者属性访问权限 关键字 介绍 private 私有,仅当前或同一个文件可访问 protected 保护,在同一个或者子类之中可访问

    19930

    【C++深度探索】继承机制详解(一)

    如果没有默认构造函数,则必须在派生构造函数初始化列表阶段显示调用构造函数。...例如: 当我们将默认构造函数缺省值"tutu",去掉,它就不再是默认构造函数,那么在创建子类Student对象时就不会自动调用默认构造函数,会保错,那么这时我们就需要在初始化列表里显示调用...这是因为规定在初始化列表是不可以使用父成员 ✨拷贝构造 派生拷贝构造函数必须调用拷贝构造完成拷贝初始化。...其核心原因在于初始化时先构造父再构造子类,而析构时先析构子类再析构父,因为子类析构时是可能用到父成员,先父后子可能会出错 所以为了保证先析构子类再析构父,编译器会在析构了子类后自动调用父析构函数...派生对象初始化先调用构造再调派生构造。

    7610

    Google C++ 编程风格指南(三):

    构造函数职责 不要在构造函数中进行复杂初始化 (尤其是那些有可能失败或者需要调用虚函数初始化). 定义: 在构造函数体中进行初始化操作. 优点: 排版方便, 无需担心是否已经初始化....结论: 简单初始化成员初始化完成, 尤其是一个成员变量要在多个构造函数里用相同方式初始化时候....如果在派生对成员变量使用了内部初始化的话, 继承构造函数还是适用. 3.6. 结构体 VS. 只有数据时使用 struct, 其它一概使用 class....定义: 子类继承时, 子类包含了父所有数据及操作定义....如果你有虚函数, 则析构函数也应该为虚函数. 注意 数据成员在任何情况下都必须是私有的. 重载一个虚函数, 在衍生把它明确声明为 virtual.

    80640

    Kotlin学习日志(五)与对象

    println替换JavaSystem.out.println println("Animal:这是个动物类") } } 现在这个已经创建好了,并且有了初始化函数,...经过这一番操作,我们再与Java对比一下区别: (1)Kotlin进行初始化函数名称叫init,不像Java那样把雷鸣作为构造函数名称。...这里面,初始化函数init看似是Kotlin构造函数,但它只是构造函数一部分,并不完整,因为没有定义输入参数,那么怎么定义呢?谁来定义呢?...,Java可以通过覆写带不同参数构造函数来实现,那么Kotlin已经名后面指明了固定数量入参,又该如何表示拥有其他参数构造函数呢?...(2)初始化函数属性字段赋值,为了区别同名属性和入参,特意给属性字段添加了this。 那么Kotlin如何精简这个代码呢?

    1.1K20

    Kotlin Android】一个列表带你领略Kotlin简洁之风

    第三种方式,如果你不想声明变量同时初始化变量,那么可以使用“?”...来表明这个变量有可能为null,并赋值为null; 第四种方式,如果你只想声明变量,那么可以使用lateinit关键来表明该变量在后面才进行初始化(注:基础变量不能指定为lateinit,并且lateinit...Kotlin 声明、定义、继承 Kotlin同样使用class来声明继承符号为一个冒号“:”,需要在名后面带上一对括号,如果构造函数带有参数,此时需要在括号填写对应参数。...:” ,必须为 open/abstrct 属性class,或者为 interface 接口,举个栗子: open class Base (arg: Int) { var arg: Int...Base为open属性,并且构造函数需要一个Int类型参数 2,Base中有一个init初始化代码块,可以在里面直接使用构造函数参数来完成数据初始化 3,子类必须在默认构造方法初始化参数

    1.8K10

    Kotlin 基础 | 委托及其应用

    使用by好处是消灭模板代码,就如上面所示,type()接口实现就可以省略。 惰性初始化一次 惰性初始化也是一种常见模式:延迟对象初始化,直到第一次访问它。...当初始化消耗大量资源,惰性初始化显得特别有价值。...支持属性是一种实现惰性初始化惯用技术: class BitmapManager { // 支持属性用于存储一组 Bitmap private var _bitmaps: List<Bitmap...对于 var 修饰读写变量进行属性委托时,被委托对象必须实现getValue()和setValue()接口,即定义如何读写变量值。...神奇之处在于,甚至都不需要指定key就可以正确地从 map 获取 name 属性值。这是因为 Kotlin 标准库已经为 Map 定义了getValue()和setValue()扩展函数。

    97430

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

    console.log(`${pt.x}, ${pt.y}`); 就像使用 const、let 和 var 一样,类属性初始化语句也会被用于进行类型推断: const pt = new Point(...TypeScript 不会分析在构造器调用方法以检测初始化语句,因为派生可能会重写这些方法,导致初始化成员失败。...根据 JavaScript 定义,初始化顺序是: 初始化字段 执行构造器 初始化派生字段 执行派生构造器 这意味着,因为构造器执行时候派生字段尚未进行初始化,所以构造器只能看到自己...公开受保护成员 派生需要遵循其约束,但可以选择公开具有更多功能子类。...抽象方法或者抽象字段在没有对应实现。这些成员必须存在于一个无法直接被实例化抽象。 抽象角色是充当一个,让其子类去实现所有的抽象成员。

    2.6K10

    《Kotin 极简教程》第7章 面向对象编程(OOP)(1)第7章 面向对象编程(OOP)《Kotlin极简教程》正式上架:

    Kotlin成员可以包含: 构造函数和初始化块 属性 函数 嵌套和内部类 对象声明 等。...初始化代码可以放到以 init 关键字作为前缀初始化块(initializer blocks): open class Student constructor(var name: String,...} ... } 主构造参数可以在初始化块中使用,也可以在体内声明属性初始化器中使用。...关于抽象属性,需要注意是: 抽象属相在抽象不能被初始化 如果在子类没有主构造函数,要对抽象属性手动初始化。...相应地这个子类,也成为了抽象子类,需要使用abstract关键字来声明。 如果抽象中含有抽象属性,再实现子类必须将抽象属性初始化,除非子类也为抽象

    1.1K20

    Kotlin|这些隐藏内存陷阱,你应该熟记于心

    =构建者模式; 关于 arrayOf() 使用细节。 好了,让我们开始吧! 密封小细节 密封用来表示受限继承结构:一个值为有限几种类型、而不能有任何其他类型时。...摘自Kotlin中文文档 关于它用法,我们具体不再做赘述。 密封虽然非常实用,经常能成为我们多type绝佳搭配,但其中却藏着一些使用小细节,比如 构造函数传值所导致损耗问题。...错误示例 sealed 初始化 如题,我们有一个公用属性 sum ,为了便于复用,我们将其抽离到 Fruit 构造函数,让子类便于初始化时传入,而不用重复显式声明。...这样好处就是性能优势,我们不必应用或者页面加载时就初始化一切,相比过往 var xx = null ,这种方式一定程度上也更加便捷。...MainActivity初始化时,会先在 构造函数 初始化 lazy 对象,即 SYNCHRONIZED 对应 SynchronizedLazyImpl。

    79930
    领券