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: Stringget() = "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 -> trueelse -> 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.mzph.cn/pingmian/40625.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 应用启动时出现编译错误进程会退出吗?

背景 开发的尽头是啥呢?超超级熟练工! 总结最近遇到的一些简单问题: Java 应用的某个线程,如果运行时依赖的 jar 不满足,线程是否会退出?进程是否会退出?Netty 实现 TCP 功能时,换…

前后端分离:四种开发模式与实践指南

前后端分离:四种开发模式与实践指南 什么是前后端分离 当业务变得越来越复杂或产品线越来越多时,原有的开发模式就无法满足业务需求了。 产品越来越多,展现层的变化越来越快、越来越多,此时应该进行前后端分离的分层抽象&#…

记录问题:解决vscode找不到Python自定义模块,报错No module named ‘xxx‘

1. 背景 我非要用vscode,不用pycharm,哼! 2. 问题 由于 import xx 自定义的模块, python run 的时候会报错 No module named ‘xxx‘ 报错信息: Traceback (most recent call last):File "d:\work\sf_financ…

基于opencv的斜光测距及python实现

1.前言 最近做了一个基于opencv的斜光测距的小项目,东西不多,但是很有意思,值得拿出来学一学。项目里面需要比较精确的定位功能,将前人matlab代码移植到python上,并且做了一些优化,简化逻辑(毕竟我是专业的…

pandas数据分析(7)

组合DataFrame 连接 如果只是要将多个DataFrame粘合在一起,那么concat函数是最佳选择。在默认情况下,concat会将DataFrame按行粘合在一起,同时会将各列自动对齐。 如果想要按列进行粘合,需要将axis设置为1: concat的特…

制造企业真的需要数字化转型吗?一文讲透:为何做,如何做?

此前拜访了不少制造企业,其以中小型企业居多,在与企业负责人交流数字化转型话题时,感触最多的还是管理者对“数字化转型”的认知。 在数字化转型方面从国家层面到地方政府进行大量的宣传与政策支持,部分行业头部企业也从数字化转…

百度出品_文心快码Comate提升程序猿效率

1.文心快码 文心快码包含指令、插件 和 知识三种功能, 1)指令包含Base64编码、Base64解码、JSON转TS类型、JSON转YAML、JWT解码喂JSON。 2)插件包含 3)指令包含如下功能: 官网链接

AI墓地:738个倒闭AI项目的启示

近年来,人工智能技术迅猛发展,然而,不少AI项目却在市场上悄然消失。根据AI工具聚合网站“DANG”的统计,截至2024年6月,共有738个AI项目停运或停止维护。本文将探讨这些AI项目失败的原因,并分析当前AI初创企…

C语言:结构体数组

结构体数组 介绍定义结构体定义结构体数组初始化结构体数组访问和修改结构体数组的元素遍历结构体数组 示例高级用法动态分配结构体数组使用 malloc 动态分配使用 calloc 动态分配 结构体数组作为函数参数结构体数组与指针多维结构体数组使用 typedef 简化结构体定义结构体数组…

ClickHouse概述

ClickHouse概述 文章目录 ClickHouse概述ClickHouse是什么ClickHouse快的理由什么是OLAPClickHouse的特点列式存储DBMS 的功能多样化引擎高吞吐写入能力数据分区与线程级并行 ClickHouse的应用合适场景不适合场景 ClickHouse是什么 ClickHouse 是俄罗斯的 Yandex 于 2016 年开…

ubuntu20.04配置调试工具

1.准备工作&#xff1a;安装g或者gdb sudo apt updatesudo apt install gg --versionsudo apt install gdbgdb --version 2.配置环境 2.1在本地新建一个main.cpp #include <iostream> #include <vector> #include <string>using namespace std;int main(…

MySQL资讯|2024年MySQL第一个长期支持版本8.4发布

&#x1f4eb; 作者简介&#xff1a;「六月暴雪飞梨花」&#xff0c;专注于研究Java&#xff0c;就职于科技型公司后端工程师 &#x1f3c6; 近期荣誉&#xff1a;华为云云享专家、阿里云专家博主、腾讯云优秀创作者、ACDU成员 &#x1f525; 三连支持&#xff1a;欢迎 ❤️关注…

【漏洞复现】Emlog Pro 2.3.4——任意用户登入、会话持久化(CVE-2024-5044)

声明&#xff1a;本文档或演示材料仅供教育和教学目的使用&#xff0c;任何个人或组织使用本文档中的信息进行非法活动&#xff0c;均与本文档的作者或发布者无关。 文章目录 漏洞描述漏洞复现 漏洞描述 漏洞编号&#xff1a;CVE-2024-5044 漏洞成因&#xff1a; 在Emlog Pro …

黑马点评DAY5|商户查询缓存

商户查询缓存 缓存的定义 缓存就是数据交换的缓冲区&#xff08;Cache&#xff09;&#xff0c;是存储数据的临时地方&#xff0c;一般读写性能较高。 比如计算机的CPU计算速度非常快&#xff0c;但是需要先从内存中读取数据再放入CPU的寄存器中进行运算&#xff0c;这样会限…

【C语言】union 关键字

在C语言中&#xff0c;union关键字用于定义联合体。联合体是一种特殊的数据结构&#xff0c;它允许不同的数据类型共享同一段内存。所有联合体成员共享同一个内存位置&#xff0c;因此联合体的大小取决于其最大成员的大小。 定义和使用联合体 基本定义 定义一个联合体类型时…

SiCat:一款多功能漏洞利用管理与搜索工具

关于SiCat SiCat是一款多功能漏洞利用管理与搜索工具&#xff0c;该工具基于纯Python 3开发&#xff0c;旨在帮助广大研究人员有效地识别和收集来自开源和本地存储库的漏洞信息。 SiCat专注于网络安全管理方面的实践工作&#xff0c;允许研究人员快速实现在线搜索&#xff0c;…

2024亚太赛(中文赛)数学建模竞赛选题建议+初步分析

提示&#xff1a;DS C君认为的难度&#xff1a;B<C<A&#xff0c;开放度&#xff1a;C<A<B。 综合评价来看 A题适合有较强计算几何和优化能力的团队&#xff0c;难度较高&#xff0c;但适用面较窄。 B题数据处理和分析为主&#xff0c;适合数据科学背景的团队…

Android TextView的属性与用法

文本控件包括TextView、EditText、AutoCompleteTextView、CheckedTextView、MultiAutoCompleteTextView、TextInputLayout等&#xff0c;其中TextView、EditText是最基本最重要的文本控件&#xff0c;是必须要掌握的文本控件。 1.TextView TextView控件用于显示文本信息&…

自然语言处理学习--3

对自然语言处理领域相关文献进行梳理和总结&#xff0c;对学习的文献进行梳理和学习记录。希望和感兴趣的小伙伴们一起学习。欢迎大家在评论区进行学习交流&#xff01; 论文&#xff1a;《ChineseBERT: Chinese Pretraining Enhanced by Glyph and Pinyin Information》 下面…

原厂商是什么意思?云管平台原厂商有哪些企业?

最近不少IT小伙伴在问关于原厂商相关问题&#xff0c;今天我们就来简单回答一下&#xff0c;仅供参考&#xff01; 原厂商是什么意思&#xff1f; 原厂商&#xff0c;或称原厂&#xff0c;是指生产特定产品或零部件的原始厂家。 软件原厂商是什么意思&#xff1f; 软件原厂…