《Kotlin入门实战》CH4 | 类与面向对象编程

Kotlin与Java的相互调用 Kotlin调用java public class MyJavaClass{ public static MyJavaClass object = new MyJavaClass(); @Override public String toString(){ return "MyJavaClass{}"; } } kotlin fun main(args: Array<String>){ //需要加反引用符号,!左侧的按键 阅读详情

类与面向对象编程

从面向过程到面向对象,再到设计模式,架构设计,面向服务,Sass、Pass和Iass等思想,各种软
件理论思想五花八门,但万变不离其宗:

你要解决一个什么样的问题?
你的问题是哪个领域的?
你的模型(数据结构)是什么?
你的算法是什么?
你对这个世界的本质认知是怎样的?
你的业务领域的逻辑问题、流程是什么?

声明类

1. 空类

2. 声明类和构造函数

class People(var id: Int) {
    var age: Int = 0;           // 没有延迟初始化的必须声明的时候初始化
    lateinit var name: String;  // 延迟初始化

    // 二级构造器必须调用主构造器
    // 构造器中参数不能使用val或者var声明
    constructor(id: Int, age: Int, name: String) : this(id) {
        this.age = age
        this.name = name
    }

    // 重写toString方法
    override fun toString(): String {
        return "People(id=$id, age=$age, name='$name')"
    }
}


fun main() {
    val people = People(42119999)   // 调用主构造器
    people.age = 20                 // 类中属性默认是public,在其他包中也可以访问
    people.name = "kris"
}

当子类继承了某个类之后,便可以使用父类中的成员变量,但并不是完全继承父类的所有成员变量。具体的原则如下:

  • 能够继承父类的public和protected成员变量;
  • 不能继承父类的private成员变量;
  • 对于父类的包访问权限成员变量,如果子类和父类在同一个包下,则子类能够继承;否则,子类不能继承;
  • 对于子类可以继承的父类成员变量,如果在子类中出现了同名称的成员变量,则会发生隐藏现象,即子类的成员变量会屏蔽掉父类的同名成员变量。如果要在子类中访问父类中的同名成员变量,需要使用super关键字进行引用。

3 Object对象

Kotlin中没有静态对象,需要实现单例模式,可以使用Object单例对象

object User{
    var id = "admin"
    var pw = "admin"

    override fun toString(): String {
        return "$id + $pw"
    }
}

fun main() {
    println(User) //  admin + admin
}

或者使用伴生对象

class DBClient(var id : Int){
    fun open(){
        println("DBClient id $id")
        openDB()
    }

    // 伴生对象,一个类只有一个
    companion object DBEngine{
        fun openDB(){
            println("DB engine open db")
        }
    }
}

fun main() {
    DBClient(1).open()
    DBClient(2).open()
}
/*
DBClient id 1
DB engine open db
DBClient id 2
DB engine open db
*/

4. 数据类

//主构造器不能为空
data class Music(var id : Int){
    lateinit var name : String;
}

这是Kotlin的数据类,可以反编译一下,查看对应的Java代码

public final class Music {
   @NotNull
   public String name; // 在类中声明的变量是public的
   private int id; // 主构造器中变量式私有的,也就是说不能继承
   
   // 构造器 
   public Music(int id) {
      this.id = id;
   }
    
// ============= get and set fun
   // get&set 都是被声明为final,不能重写
   @NotNull
   public final String getName() {
      String var10000 = this.name;
      if (var10000 == null) {
         Intrinsics.throwUninitializedPropertyAccessException("name");
      }

      return var10000;
   }

   public final void setName(@NotNull String var1) {
      Intrinsics.checkParameterIsNotNull(var1, "<set-?>");
      this.name = var1;
   }
    
   public final int getId() {
      return this.id;
   }

   public final void setId(int var1) {
      this.id = var1;
   }
//===============

   // component1 返回主构造器中下表为1的属性值
   public final int component1() {
      return this.id;
   }
   
   // 拷贝函数
   @NotNull
   public final Music copy(int id) {
      return new Music(id);
   }

   // $FF: synthetic method
   @NotNull
   public static Music copy$default(Music var0, int var1, int var2, Object var3) {
      if ((var2 & 1) != 0) {
         var1 = var0.id;
      }

      return var0.copy(var1);
   }
   // 只包含主构造器中的域
   @NotNull
   public String toString() {
      return "Music(id=" + this.id + ")";
   }
   // 只包含主构造器中的域
   public int hashCode() {
      return this.id;
   }
   // 只包含主构造器中的域
   public boolean equals(@Nullable Object var1) {
      if (this != var1) {
         if (var1 instanceof Music) {
            Music var2 = (Music)var1;
            if (this.id == var2.id) {
               return true;
            }
         }

         return false;
      } else {
         return true;
      }
   }
}

  • 主构造函数至少包含一个参数;
  • 参数必须标识为val或者var;
  • 不能为abstract、open、sealed或者inner;
  • 不能继承其他类(但可以实现接口)。
  • 可以在解构声明中使用

Pair

Kotlin中提供了二元组Pair,和三元组Triple,可以使用Pair实现Map

public data class Pair<out A, out B>(
    public val first: A,
    public val second: B
) : Serializable {
    public override fun toString(): String = "($first, $second)"
}

/**
 * Creates a tuple of type [Pair] from this and [that].
 *
 * This can be useful for creating [Map] literals with less noise, for example:
 * @sample samples.collections.Maps.Instantiation.mapFromPairs
 */
public infix fun <A, B> A.to(that: B): Pair<A, B> = Pair(this, that)
// 重写了中缀表达式to

使用Pair实现Map

fun main() {
    val map = mapOf(1 to 'A', 2 to 'B', 3 to 'C')
    println(map) // 创建的是LinkedHashMap类型的Map
}

// mapOf方法在 kotlin.collections包中(默认导入)
public fun <K, V> mapOf(vararg pairs: Pair<K, V>): Map<K, V> =
    if (pairs.size > 0) pairs.toMap(LinkedHashMap(mapCapacity(pairs.size))) else emptyMap()

内部类

1.普通内部类

一个类可以嵌套其他类中,并且可以嵌套多层,普通内部类不持有外部类的引用,所以不能访问外部类属性。

class Out{
    var v = 1
    class inner{
        fun cout(){
            println(v) // Error
        }
    }
}

2.嵌套内部类

如果需要在内部类中获取外部类的this指针,可以使用嵌套内部类

class Out{
    var v = 1

    inner class inner{
        fun cout(){
            println(v) // OK
        }
    }
}

3.匿名内部类

匿名内部类也可以访问外部类属性。匿名内部类最经典的运用场景应该就是创建子线程

class MyThread {
    // 匿名内部类实现
    fun doRun1() {
        Thread(object : Runnable {
            override fun run() {
                println(Thread.currentThread().id)
            }
        }).start()
    }

    // Lambda表达式实现
    fun doRun2() {
        Thread(Runnable {
            println(Thread.currentThread().id)
        }).start()
    }

    //使用lambda表达式和匿名内部类
    fun doRun3() {
        val run = Runnable {
            println(Thread.currentThread().id)
        }
        Thread(run).start()
    }

    // 直接使用lambda表达式
    fun doRun4() {
        val run = {
            println(Thread.currentThread().id)
        }
        Thread(run).start()
    }

}


fun main() {
    println(Thread.currentThread().id)  // 1
    MyThread().doRun1()                 // 12
    MyThread().doRun2()                 // 13
    MyThread().doRun3()                 // 14
    MyThread().doRun4()                 // 15
}

方法4和方法2其实是一样的。方法1和方法3其实是一样的。

Pixhawk固定翼飞行控制实战:L1与TECS算法详解(附代码解析) 本文深入解析了Pixhawk飞控在固定翼无人机中的核心控制算法:L1导航与TECS总能量控制。通过剖析算法原理、代码实现与实战调参,帮助开发者解决航线跟踪振荡、高度速度不稳定等常见问题,实现精准稳定的自主飞行。 阅读详情

相关推荐

基于Vivado2025的UltraScale+时序收敛优化实战案例

深入解析在Vivado2025环境中针对UltraScale+架构的时序收敛挑战,结合实际设计案例,分享关键优化策略与操作技巧,显著提升设计性能与收敛效率。vivado2025的更新特性为时序优化带来新机遇。

weixin_33660045的博客 343

Serializable,Parcelable和data class的区别

序列化是将对象的状态(属性数据)转换为字节流或其他可存储或传输的格式的过程。主要作用存储:将对象保存到文件或数据库中。传输:在网络中传输对象,比如在客户端与服务器之间传递数据。缓存:将对象转化为可恢复的格式,便于后续恢复使用。序列化后7. 什么是反序列化(Deserialization)?反序列化是将序列化后的字节流(或存储格式)重新转换回原始对象的过程。主要作用从存储或传输的格式中重建对象。恢复数据到应用中,便于程序继续使用。8.序列化与反序列化的用途网络传输。

Android 领域开发程序员,希望通过写博客的方式不断的总结提升自己,大家共同进步哦! 1313

银河麒麟v10(x86_64)升级openssh实操成功

本文详细介绍了在银河麒麟V10系统上将OpenSSH从8.2p1升级至9.9p2版本的全过程。主要内容包括:系统环境确认、安装telnet备用连接、备份配置、卸载旧版本、安装新版本、服务配置与验证等关键步骤。特别强调了安全注意事项,如必须安装telnet作为备用连接、重要配置备份等。升级后提供了安全加固建议,包括修改SSH端口、禁用root登录等。文章还包含详细的故障排查方法和恢复方案,确保升级过程安全可靠。通过本教程,用户可以顺利完成OpenSSH版本升级,提升系统安全性。

淘淘小窝 1089

kotlin中的序列化

我们可以在Intent中通过putExtra方法来添加要传递的数据,但该方法所支持的数据类型是有限的,当我们想传递一些自定义对象的时候,会发现无从下手。而使用Intent来传递对象,通常有两种实现方式:Serializable和Parcelable。

qq_44016573的博客 1476

某银行大数据分析平台之云原生架构

软考架构师论文

doudoudouy的博客 768

Halcon-AOI外观缺陷检测系列

Halcon-AOI外观缺陷检测系列

Jumy_S的博客 1666

Kotlin 序列化Parcelable/Serializable

开发中,序列化是常见操作,在java中,我们一般会用到Serializable或者Parcelable,优缺点就不赘述了,今天来看看kotlin中的序列化。 1.添加配置 app目录下的build.gradle文件 android { ... androidExtensions { experimental = true } } 2.添加注解并实现Parc...

yechaoa 1万+

(超详细)互补格雷码+相移码求解包裹相位(Python实现)

记录实现“互补格雷码+相移码”求解包裹相位的编码过程。也可以叫它“5+4”法,5代表五幅格雷码图像,4代表四步相移法的四张正弦条纹图。

暴雨梨花博客 3万+

kotlin 注解 @Parcelize 使用

在 Kotlin 中,@Parcelize注解用于简化实现 AndroidParcelable接口的过程。Parcelable接口是 Android 中用于在组件之间传递对象的一种方式。通常,实现Parcelable接口需要编写大量样板代码,但使用@Parcelize注解可以大大简化这个过程。以下是使用@Parcelize。

阿饱同学 2371

【STK】手把手教你利用STK进行关联分析仿真01-STK/CAT模块介绍

今天主要介绍接近分析工具CAT。

weixin_44184852的博客 1106

使用 SAP 自家的 AI 工具 Joule 辅助 SAP Fiori 应用开发

SAP Joule 不请自答,解释说标记了接口的 UI Component,具备进行异步内容创建的能力,比如其通过 rootView 分配的视图,在运行时可以异步创建。目前 SAP Business Application Studio 里的 SAP Joule 支持下面这八种上下文,绝大部分都和 SAP UI5 开发相关,剩下的则是代码仓库和 SAP 帮助文档的搜索。SAP Joule 回答的大意是:我只负责回答 SAP UI5 开发相关的问题,不要和我扯其他有的没的。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1096

kotlin实现服务端的序列化

kotlin实现序列化前言 前言 我们在编写Java端序列化的时候我们只需要实现我们的Serializable接口就可以了,可是我们在kotlin我们实现该接口大家会发现无法引入我们的Serializable的包,这时候大家可能觉得那只能百度自己去找实现了,可是找了半天会发现实际上并没什么软用,因为都是说的Android上的,最终回归到原点,既然kotlin可以调用JAVA为什么就不能实现Seri...

笨鸟不会飞 865

【第13话:感知算法】库位与可行驶区域检测:自主泊车场景中的检测及语义分割方法

本文提出了一种自动泊车系统中的泊车库位线检测方法,通过逆透视映射(IPM)将车辆摄像头图像转换为鸟瞰视图,消除透视变形。该方法结合目标检测和语义分割模型,先定位库位线候选区域,再生成像素级精确掩码。后处理步骤将掩码转换为结构化输出,包括停车位边界多边形和可行驶区域掩码。整个流程采用深度学习模型和计算机视觉技术,可实现高精度的泊车环境感知,为自动泊车系统提供可靠支持。

一碗白开水一 1160

《Kotlin入门实战》CH2 | Kotlin 语法基础

写在前面 kotlin 为啥用fun声明方法? JetBrains : We use “fun” because we like it - and yes, we do know what the word means in English. JVM语言生态 需要注意的式Kotlin是基于JVM的语言,而不是基于Java的语言,他们都可以翻译成Class字节码。 kotlin ...

落红不是无情物 218

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

《Kotlin入门实战》CH6 | 扩展函数与扩展属性

扩展函数与属性 在Java中获取String中的第一个字符,StringUtil.firstChar(str)可能是这样写的,但是要想`"ABC".firstChar()是不可能的,因为Java中String是final类,在Kotlin中就不一样了。 1. 扩展函数 给String类中添加firstChar方法 fun String.firstChar(...

落红不是无情物 179

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

《Kotlin入门实战》CH5 | 函数与函数式编程

函数与函数式编程 函数式编程与命令式编程最大的不同是:函数式编程的焦点在于数据的映射,命令式编程(imperative programming)的焦点是解决问题的步骤。 函数式编程和命令式编程比较 fun main() { val list = listOf<Int>(1, 2, 3, 4, 5) // 函数式编...

落红不是无情物 202

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

《Kotlin入门实战》CH7 | 集合类

集合类 在Java类库中有一套相当完整的容器集合类来持有对象。Kotlin没有去重复造轮子(Scala则是自己实现了一套集合类框架),而是在Java类库的基础上进行了改造和扩展,引入了不可变集合类,同时扩展了大量方便实用的功能,这些功能的API都在kotlin.collections包下面。 集合类概述 集合层次 Iterable 可遍历...

落红不是无情物 168

《Kotlin入门实战》CH3 | 类型系统与可空类型

类型系统与可空类型 Kotlin属于静态类型编程语言,编程语言中类型系统定义: 如何将数值和表达式归为不同类型 如何操作这些类型 这些类型之间如何相互作用 类型系统 1. 类型系统作用 让编译器检查无意义、无效、类型不匹配的错误代码 代码更好读懂 利于抽象 char[] str = {'a','b','c'}抽象为String str = 'abc'...

落红不是无情物 159

《Kotlin入门实战》CH9 | 文件IO,正则和多线程

文件IO,正则和多线程 得益于kotlin的扩展函数,kotlin对java中api进行了改进,对于java中好用的api直接使用,对于不好用的api进行了扩展和改进。 1 文件IO操作 读写 fun main() { val f = File("test.txt") // 写入文件 f.writeText("hello kotl...

落红不是无情物 278

《Kotlin入门实战》CH8 | 泛型

泛型 泛型是在Java5中引入的,泛型让集合框架可以重用代码,在没有泛型时候,集合框架中存储数据的类型都是Object,也就是说存入和取出数据都需要对对象进行强制类型转换。这就很可能出现错误。 1 类接口函数上使用泛型 泛型接口 interface Send<T>{ fun handleMessage(t : T) : T; } fu...

落红不是无情物 164

GBrain 的 resolve-before-asking 技能:耗尽大脑检索链再打扰用户的身份问题门控实践

本技能是 GBrain(Garry's Opinionated OpenClaw/Hermes Agent Brain)中一个身份识别问题门控(identity-question gate):任何"X 是谁?""Ta 和你什么关系?"的问题在到达用户之前,必须先跑完大脑的完整检索链——思考 → 搜索+读页 → 挂载源查询 → 时间线/图谱 → 网络。只有全部升级失败后才能询问用户,且必须带着假设去

gitblog_00359的博客 797

8.4 Spring Boot集成Kotlin混合Java开发

8.4 Spring Boot集成Kotlin混合Java开发 本章介绍Spring Boot集成Kotlin混合Java开发一个完整的spring boot应用:Restfeel,一个企业级的Rest API接口测试平台(在开源工程restfiddle[1]基础上开发而来)。 系统技术框架 编程语言:Java,Kotlin 数据库:Mongo Spring框架:Spring data jpa,S

AI天才研究院 9333

kotlin杂谈系列八

Kotlin杂谈系列八

Pandaer杂货铺 3112

Java/Kotlin TCP Socket TLS/SSL加密通讯实战指南

在网络编程中,TCP Socket是实现客户端与服务器端稳定双向通讯的基础技术。然而,明文传输的数据在公网环境中面临被截获和窃取的风险,因此数据加密成为保障通讯安全的核心原理。TLS/SSL协议作为业界标准,通过非对称加密进行密钥交换、对称加密保障传输效率,并利用数字证书实现身份认证,为数据传输提供了机密性、完整性和可信性三重保障。这一技术价值在于,它能有效防止中间人攻击和数据泄露,是构建安全网络应用的基石。在Java/Kotlin开发实践中,通过SSLSocket和SSLServerSocket可以便捷地

weixin_33845881的博客 527

Android CH340驱动实现和单片机串口通信(串口转USB)Kotlin语言实现

序言 今天领导订做了一个单片机,连接处是USB口的,然后调完没问题之后呢,把连接方法写下来了。 由于是Kotlin语言写的,可能对纯Java的朋友不太友好,望多包涵。 CH340驱动下载地址: http://www.wch.cn/download/ch341ser_android_zip.html 注意事项和说明: 1.解压完成后把jar包导入到自己项目中 2.initUSB方法为核心代码包含了权限检查和驱动配置 3.baudRate或者其他变量要根据具体情况改变 4.startTh.

赵星海 2645

Java中也能用Kotlin断言库?Atrium Java互操作完整指南

**Atrium** 是一个面向 Kotlin 的多平台断言/期望(expectation)库,支持 JVM、JS 和 Android。对拥有 Java 代码的开发者来说,Atrium 的 Java 互操作能力尤其值得关注:它既能帮你优雅地测试 Java 类型的返回值,又原生支持 Java 9+ 的模块系统(JPMS)。本文就是这份 **Atrium Java 互操作完整指南**,带你快速上手。?

gitblog_00573的博客 444
上一篇: 《Kotlin入门实战》CH3 | 类型系统与可空类型
下一篇: 《Kotlin入门实战》CH5 | 函数与函数式编程
KriyWu
博客等级 码龄9年 3粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值