Kotlin和Java的一些不同点

1.Kotlin 的变量是没有默认值的(因此要求初始化),Java的成员变量是有默认值的

Java的成员变量:

String name; //  默认值是 null
int count; //  默认值是 0

不过其实 Java 也只是成员变量有默认值,局部变量也是没有默认值的,如果不给它初始值也会报错

void run() {
    int count;
    count++;     // IDE 报错,Variable 'count' might not have been initialized
}

2.Kotlin中成员变量可以是抽象的

例如下面的编译器提醒,name必须被初始化,或者把他定义为抽象的,让A的子类去实现该变量
在这里插入图片描述

将name定义为抽象变量,那么A类就要相应定义为抽象类了

abstract class A {
    abstract val name: String
}

class B : A(){
    override val name: String
        get() = "daisy"
}

3.Kotlin中有局部函数(local function),而Java中没有

fun toDo() {
    //定义在函数中的局部函数
    fun hellWord() {
        println("你好")
    }
    
    hellWord()
}

4.函数参数的默认可修改性

Kotlin 函数参数默认是 val 类型,所以不需要写 val 关键字,Kotlin 里这样设计的原因是保证了参数不会被修改;而 Java 的参数默认可修改(默认没 final 修饰),会增加出错的概率。

fun increment(number: Int) {
    number = number + 1  // 这会导致编译错误,因为`number`是`val`,不能被重新赋值
}

5.静态初始化块

Java的静态初始化块:

public class MyClass {
    static int staticNumber;
    static String staticString;

    // 静态初始化块
    static {
        staticNumber = 42;
        staticString = "Hello, World!";
    }
}

Java 中的静态变量和方法,在 Kotlin 中都放在了 companion object 中。因此 Java 中的静态初始化在 Kotlin 中自然也是放在 companion object 中的,由 init 和一对大括号表示:

class Sample {
    companion object {
        init {
            ...
        }
    }
}

6.可见性修饰符

  • private。Java 中表示类中可见,作为内部类时对外部类「可见」;Kotlin 中的表示类中或所在文件内可见,作为内部类时对外部类「不可见」
  • Java不加修饰符时(默认),表示在同一个package中可见,在Kotlin中被弃用掉了
  • protected。Java 的 protected 子类可见 + 同一包中可见;Kotlin 的 仅有子类可见
  • public。Java和Kotlin的效果相同,都是可见性最大,哪里都可以引用。但是Kotlin不写可见性修饰符时就是public的效果(默认)
  • internal。这是Kotlin独有的,表示修饰的类、函数仅对 module 内可见
privateJava中无修饰符protectedpublicinternal
Java仅本类中可见
(作为内部类时对外部类可见)
同一包内可见同一包中可见
且子类可见
所有位置可见-
Kotlin仅本类中可见
(作为内部类时对外部类不可见)
-仅子类可见所有位置可见同一模块内可见

7.多分支结构

  • Java和Kotlin的区别

在 Java 中,当多种情况执行同一份代码时,可以这么写:

switch (x) {
    case 1:
    case 2: {
        System.out.println("x == 1 or x == 2");
        break;
    }
    default: {
        System.out.println("default");
    }
}

而 Kotlin 中多种情况执行同一份代码时,可以将多个分支条件放在一起,用 , 符号隔开,表示这些情况都会执行后面的代码:

when (x) {
    1, 2 -> print("x == 1 or x == 2")
    else -> print("else")
}
  • Kotlin独有

使用 in 检测是否在一个区间或者集合中:

when (x) {
    in 1..10 -> print("x 在区间 1..10 中")
    in listOf(1,2) -> print("x 在集合中")
    // not in
    !in 10..20 -> print("x 不在区间 10..20 中")
    else -> print("不在任何区间上")
}

或者使用 is 进行特定类型的检测:

val isString = when(x) {
     is String -> true
     else -> false
 }

还可以省略 when 后面的参数,每一个分支条件都可以是一个布尔表达式:

when {
    str1.contains("a") -> print("字符串 str1 包含 a")
    str2.length == 3 -> print("字符串 str2 的长度为 3")
}

8.相等性检查

在Java中,相等性检查分为两种类型:

  • 引用相等性:使用 == 操作符。当两个引用指向内存中的同一个对象时,结果为 true。
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1 == s2); // false,因为s1和s2指向不同的对象
  • 内容相等性:使用 .equals() 方法。这个方法通常在 Object 类中定义,并可被重写以检查两个对象的内容是否相等。
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1.equals(s2)); // true,因为s1和s2的内容相同

Kotlin为相等性检查提供了更加清晰的语法:

  • 引用相等性:使用 === 操作符。当且仅当两个引用指向相同的对象时,结果为 true。
val s1 = String("hello")
val s2 = String("hello")
println(s1 === s2) // false,因为s1和s2指向不同的对象
  • 内容相等性:使用 == 操作符。在底层,== 实际上是调用 .equals() 方法
val s1 = String("hello")
val s2 = String("hello")
println(s1 == s2) // true,因为s1和s2的内容相同

如果需要检查对象是否为 null 或比较可能为 null 的对象,Kotlin 的 == 还会处理 null 安全性,这在 Java 中需要显式处理。

引用相等性内容相等性
Java==equals()
Kotlin=====


参考文章:
Kotlin 里那些不是那么写的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/771267.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

中俄汽车产业链合作前景广阔,东方经济论坛助力双边合作与创新

随着中国汽车零部件企业的竞争力和创新能力不断增强,中国汽车及零部件行业在俄罗斯的市场份额和品牌影响力显著提升,中俄两国在汽车产业链上的合作展现出巨大的潜力和广阔的前景。2024年5月,俄罗斯乘用车新车销量达到12.8万辆,同比…

【计算机网络仿真】b站湖科大教书匠思科Packet Tracer——实验15 网络故障导致的路由环路问题

一、实验目的 1.验证因网络故障而导致的静态路由的路由环路问题; 二、实验要求 1.使用Cisco Packet Tracer仿真平台; 2.观看B站湖科大教书匠仿真实验视频,完成对应实验。 三、实验内容 1.构建网络拓扑; 2.验证网络故障导致的…

LTSPICE仿真电路:(十九)磁珠的一些简单仿真

1.作用 简单来说就是用来滤波的,将高频信号转化为热量滤除掉,低频有用信号正常通过 2.参数 上图几个参数比较简单,就是字面上的意思,更重要的就是频率阻抗图 不同曲线代表不同型号的磁珠,实际上除了额定电流外&#…

Spring框架的学习SpringMVC(1)

1.什么是MVC (1)MVC其实就是软件架构的一种设计模式,它将软件的系统分为,(视图,模型,控制器)三个部分 1.1View(视图) 视图也就是,在浏览器显示的那一个部分,是后端数据的呈现 1.…

某DingTalk企典 - Token

⚠️前言⚠️ 本文仅用于学术交流。 学习探讨逆向知识,欢迎私信共享学习心得。 如有侵权,联系博主删除。 请勿商用,否则后果自负。 网址 aHR0cHM6Ly9kaW5ndGFsay5jb20vcWlkaWFuLw 浅聊一下 没毛病,就这字段,有效期…

二叉树与堆相关的时间复杂度问题

目录 满二叉树与完全二叉树高度h和树中节点个数N的关系 向上调整算法: 介绍: 复杂度推导: 向下调整算法: 介绍: 复杂度推导: 向上调整建堆: 介绍: 复杂度推导:…

9.x86游戏实战-汇编指令mov

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 工具下载: 链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

怎么找到DNS服务器的地址?

所有域都注册到域名名称服务器(DNS)点,以解析域名应指向的IP地址。此查找类似于在查找个人名称并查找其电话号码时的电话簿如何运行。如果DNS服务器设置错误或指向错误的名称服务器,则域可能无法加载相应的网页。 如何查找当前的…

【python基础】—calendar模块

文章目录 前言一、calendar模块方法1.firstweekday()2.setfirstweekday(firstweekday)3.isleap(year)4.leapdays(y1, y2)5.weekday(year, month, day)6.monthrange(year, month)7.weekheader(n)8.monthcalendar(year, month)9.prmonth(theyear, themonth, w0, l0)10.prcal(year…

堆结构、堆排序

堆 是完全二叉树,类似这种样式的 而这种有右子节点,没左子节点的就不是完全二叉树 分为大根堆和小根堆 大根堆是二叉树里每一颗子树的父节点都是这颗子树里最大的,即每一棵子树最大值是头节点的值 小根堆相反 把数组中从0开始的一段数人…

【等保2.0是什么意思?等保2.0的基本要求有哪些? 】

一、等保2.0是什么意思? 等保2.0又称“网络安全等级保护2.0”体系,它是国家的一项基本国策和基本制度。在1.0版本的基础上,等级保护标准以主动防御为重点,由被动防守转向安全可信,动态感知,以及事前、事中…

Stable Diffusion图像的脸部细节控制——采样器全解析

文章目录 艺术地掌控人物形象好易智算原因分析为什么在使用Stable Diffusion生成全身图像时,脸部细节往往不够精细? 解决策略 局部重绘采样器总结 艺术地掌控人物形象 在运用Stable Diffusion这一功能强大的AI绘图工具时,我们往往会发现自己…

开源的基于图像识别本地实名认证系统(本项目不借助任何api) v1.0

前言: 本项目主要是代替昂贵的实名认证服务api或者sdk,目前仍然存在很多缺点 一、具体介绍 1.组成: 人脸识别服务器分为两部分: (1)、http服务端 server.py共有四个函数: DrawFaceinIdCard:用户上传身份证图片后,服务端会对身份证进行抠人像和ocr处理…

澳蓝荣耀时刻,6款产品入选2024年第一批《福州市名优产品目录》

近日,福州市工业和信息化局公布2024年第一批《福州市名优产品目录》,澳蓝自主研发生产的直接蒸发冷却空调、直接蒸发冷却组合式空调机组、间接蒸发冷水机组、高效间接蒸发冷却空调机、热泵式热回收型溶液调湿新风机组、防火湿帘6款产品成功入选。 以上新…

正交的拉丁方阵(MOLS)

在组合数学中,如果两个同阶的拉丁方阵叠加后,每个位置上的有序对条目都是唯一的,则这两个拉丁方阵被称为正交的。 如果一组同阶的拉丁方阵中,任意两个方阵都是正交的,则这组方阵被称为一组相互正交的拉丁方阵&#xf…

Prometheus 监控Kubelet的运行状态

kubelet通过/metrics暴露自身的指标数据。kubelet有两个端口都提供了这个url,一个是安全端口(10250),一个是非安全端口(10255,kubeadm安装的集群该端口是关闭的)。安全端口使用https协议&#x…

SpringMVC的架构有什么优势?——控制器(一)

文章目录 控制器(Controller)1. 控制器(Controller):2. 请求映射(Request Mapping):3. 参数绑定(Request Parameters Binding):4. 视图解析器(View Resolver):5. 数据绑定(Data Binding):6. 表单验证(Form Validation)…

02-部署LVS-DR群集

1.LVS-DR工作原理 LVS-DR模式,Director Server作为群集的访问入口,不作为网购使用,节点Director Server 与 Real Server 需要在同一个网络中,返回给客户端的数据不需要经过Director Server 为了响应对整个群集的访问,…

【JS】过滤数组中空值——arr.filter(Boolean)

前言:过滤数组中的空值,包括 (undefined、null、“”、0、false、NaN) Boolean函数可以将一个值转换为布尔值,空值会被转换为false,非空值会被转换为true 方法: const arr [1, 2, ""…

Redis 典型应用——分布式锁

一、什么是分布式锁 在一个分布式的系统中,也会涉及到多个节点访问同一个公共资源的情况,此时就需要通过锁来做互斥控制,避免出现类似于 "线程安全" 的问题; 而 Java 中的 synchronized,只能在当前进程中生…