Kotlin关键字二——constructor和init

news/2025/2/23 5:36:57

在关键字一——var和val中最后提到了构造函数,这里就学习下构造函数相关的关键字: constructor和init

主要构造(primary constructor)

kotlin和java一样,在定义类时就自动生成了无参构造

kotlin">// 会生成默认的无参构造函数
class Person{
}

与java不同的是,当kotlin的构造函数中必须带参数时,则需要在类名后面直接添加参数:

kotlin">class Person(var name:String, var age:Int){
}

这种在类名后面添加参数(包含无参)的构造方法就称为主要构造(primary constructor)

次要构造(secondary constructor)

当类包含多个构造函数时,需要通过次要构造实现, 次要构造需要用constructor关键字修饰:

kotlin">// primary constructor
class Person(var age: Int, var name: String) {
	// secondary constructor
    constructor(name: String) : this(18, name = name)
}

次要构造使用上需要注意:

  • 次要构造需要直接或间接调用主要构造
    kotlin">// primary constructor
    class Person(var age: Int, var name: String) {
    	// 会提示: Primary constructor call expected
        constructor(name: String)
    }
    
  • 次要构造中不能声明类的属性,即不能使用var或val
    kotlin">class Person(var age: Int, var name: String) {
        constructor(name: String) : this(age = 18, name)
        
    	// 提示'var' on secondary constructor parameter is not allowed
        constructor(var address:String, name: String):this(name)
    }
    

init_41">init

kotlin提供了一个方法init,当有多个构造方法,无论使用哪个构造方法都会调用到init方法:

kotlin">// 调用 Person("xiao ming")或者 Person(16, "小明")后 都会输出
// I am a person
class Person(var age: Int, var name: String) {
    constructor(name: String) : this(age = 18, name)
    
    init {
        System.out.println("I am a person")
    }
}

可以看下实现原理:

public final class Person {
   public Person(int age, @NotNull String name) {
      super();
      this.age = age;
      this.name = name;
      // init方法
      System.out.println("I am a person");
   }

   public Person(@NotNull String name) {
      this(18, name);
   }
}

可以看到kotlin构造的执行顺序是
主构造——>init()——>次要构造


http://www.niftyadmin.cn/n/5249841.html

相关文章

「JavaScript每日一练」系列——提高你的JS技能(第一天)

以后我会陆续发布关于JavaScript知识点以及案例面试题 文章目录 文章目录 题目 一、详细讲解 二、代码 1.引入库 总结 题目 输入一个数字,判断是不是水仙花数自恋数(自幂数 各位的3次方十位的三次方百位的三次方等于153) ----输出true或fals…

前端canvas的基础使用

一、介绍 前端中的 Canvas 是一种用于在网页上绘制图形的 HTML 元素。它提供了一个可以通过 JavaScript 进行绘制的 2D 绘图环境。使用 Canvas,您可以绘制图形,包括线条、矩形、圆形、文本和图像。Canvas 为开发人员提供了灵活自由的绘图能力&#xff0…

frp内网穿透部署,轻松实现内网服务对外访问

FRP(Fast Reverse Proxy)是一种轻量级、高性能的反向代理工具,利用反向代理技术将公网请求转发至内网服务器上,并将内网服务器的响应再次转发至公网请求者。在实现内网穿透时,FRP能够将公网与内网之间的隔离突破&#…

电脑知识:关于电脑使用的误区

本文是向大家介绍关于电脑使用的误区,电脑是较为贵重的一个电子产品,熟练掌握基本的电脑操作技巧应该是每一个人必备技能。在使用技巧之外,有一些误区是需要我们知道并避免的。 1、直接按开关按钮关机或直接拔电源 很多电脑小白关电脑都是直…

五、HotSpot细节实现

一、并发标记与三色标记 问题:三色标记到底发生在什么阶段,替代了什么。并发标记 1、并发标记( Concurrent Marking) 从 GC Root 开始对堆中对象进行可达性分析,递归扫描整个堆里的对象图,找出要回收的对象,这阶段耗…

【PyTorch】模型训练过程优化分析

文章目录 1. 模型训练过程划分1.1. 定义过程1.1.1. 全局参数设置1.1.2. 模型定义 1.2. 数据集加载过程1.2.1. Dataset类:创建数据集1.2.2. Dataloader类:加载数据集 1.3. 训练循环 2. 模型训练过程优化的总体思路2.1. 提升数据从硬盘转移到CPU内存的效率…

力扣每日一题day28 [94. 二叉树的中序遍历][144. 二叉树的后序遍历][145. 二叉树的后序遍历]

递归法 确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。 确定终止条件: 写完了递归算法, 运行的时候&am…

YOLOv8独家原创改进:SPPF自研创新 | 可变形大核注意力(D-LKA Attention),大卷积核提升不同特征感受野的注意力机制

💡💡💡本文自研创新改进: 可变形大核注意力(D-LKA Attention)高效结合SPPF进行二次创新,大卷积核提升不同特征感受野的注意力机制。 收录 YOLOv8原创自研 https://blog.csdn.net/m0_63774211/category_12511737.html?spm=1001.2014.3001.5482 💡💡💡全网独…