You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中构造函数内调用函数:Java继承代码转Kotlin实现求助

把你的Java代码转换成Kotlin的实现

嗨~作为Kotlin新手,我帮你把这段代码转成Kotlin版本,顺便先提个小问题:你给出的Java代码其实存在编译错误——在子类构造器调用super()之前,不能调用实例方法getSum(),因为此时子类的实例还没初始化,Java编译器会直接报错。所以我们先修正这个逻辑,再转成Kotlin。

首先贴出你的原Java代码:

class A{ 
    int x; 
    int y; 
    A(int x, int y){ 
        this.x=x; 
        this.y=y; 
    } 
} 

class B extends A{ 
    int x,y; 
    B(int a, int b){ 
        // Java编译器会报错:无法在调用super()之前引用实例方法getSum
        super(x,getSum(x,y)); 
    } 
    int getSum(int x, int y){ 
        return x+y; 
    } 
}

修正后的Kotlin实现

我们可以把getSum改成类级别的方法(对应Java的静态方法,Kotlin里用companion object实现),这样就能在构造阶段安全调用,同时利用Kotlin简洁的语法来实现:

父类A的Kotlin实现

Kotlin默认类是final的,要允许继承必须加open关键字;另外主构造函数可以直接在类名后声明属性,自动完成赋值和getter/setter的生成,不用像Java那样手动写构造逻辑:

open class A(var x: Int, var y: Int)

子类B的Kotlin实现

子类继承父类用:,主构造函数需要直接调用父类的构造器;把getSum放在companion object里变成类级别的方法,这样就能在构造阶段调用:

class B(var x: Int, var y: Int) : A(x, getSum(x, y)) {
    companion object {
        fun getSum(x: Int, y: Int): Int = x + y
    }
}

补充说明

  1. 如果你的原Java代码里B的构造器参数a和b是要用来赋值给B自己的x和y,那上面的代码已经做到了——Kotlin主构造器里的var x: Int会自动把参数赋值给类的成员属性。
  2. 如果你原本的逻辑是想用a和b来计算传给父类的值,那可以调整构造器的写法,比如:
class B(a: Int, b: Int) : A(a, getSum(a, b)) {
    // 如果B自己需要x和y属性,可以在这里声明并初始化
    var x = a
    var y = b
}

这样就完成了等价的Kotlin实现啦~

内容的提问来源于stack exchange,提问作者Safwat Nassef

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:30:50