Kotlin和Java的一些不同点

news2024/11/23 19:22:08

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.coloradmin.cn/o/1894103.html

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

相关文章

以品质为初心,以创新为驱动,光明乳业闪耀第十五届中国奶业大会

2024年7月3日,以“数智赋能引领产业发展增长点,科技创新驱动奶业新质生产力”为主题的中国奶业协会第十五届奶业大会奶业20强(D20)论坛暨2024中国奶业展览会隆重召开,光明乳业党委书记、董事长黄黎明受邀出席会议&…

Linux 压测工具---ab

安装 yum -y install httpd-tools 本文用于压测k8s集群内pod,k8s集群master可直接测试pod ip 命令: ab -n 10000 -c 100 http://10.42.8.212/ 其中,-n表示请求数,-c表示并发数,ip必须有”/“,表示此目录…

如何清理电脑内存?让电脑运行如飞!

电脑内存(RAM)的清理对于维持系统的流畅运行至关重要。随着使用时间的增加,系统内存会被各种应用程序和后台进程占用,导致系统响应变慢,甚至出现卡顿现象。通过有效地清理内存,可以提升电脑的性能&#xff…

5.基于SpringBoot的SSMP整合案例-数据层开发

目录 1.新建项目 2.实体类开发: 2.1在pom.xml中增加Lombok坐标: 2.2添加Book实体类 3.数据层开发: 3.1 配置MyBatisPlus与Druid 3.2创建数据层接口 3.3写测试类 3.4点击运行: 4.数据层快速开发: 4.1配置MyB…

【数据结构】02.顺序表

一、顺序表的概念与结构 1.1线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。线性表是⼀种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串… 线性表在逻辑上是线性结构&#xff0…

HighConcurrencyCommFramework c++通讯服务器框架 :简介-信号处理

项目是4月份左右做的现在整理到博客上,顺便加深一下印象 介绍 项目描述:该项目是使用 C 实现的高并发服务器脚手架,包含线程池和连接池等技术,支持开发者进行二次开发复用,只需 要添加对应业务逻辑即可完成通信服务器、网络交易…

【Termius】详细说明MacOS中的SSH的客户端利器Termius

希望文章能给到你启发和灵感~ 如果觉得有帮助的话,点赞+关注+收藏支持一下博主哦~ 阅读指南 开篇说明一、基础环境说明1.1 硬件环境1.2 软件环境二、软件的安装2.1 Termius界面介绍2.1.1 Hosts 主机列表2.1.2 SFTP 文件传输2.1.3 Port ForWarding 端口转发2.1.4 Snippets 片…

afrog-漏洞扫描(挖洞)工具【了解安装使用详细】

★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与学习之用,读者将信息做其他用途,由Ta承担全部法律及连带责任,文章作者不承担任何法律及连带责任。 1、afrog介绍 afrog 是一款性能卓越、快速稳定、PoC可定…

全面教程:在Ubuntu上快速部署ZeroTier,实现Windows与VSCode的局域网无缝访问

文章目录 1 背景介绍2 Windows上的操作3 Ubuntu上的操作4 连接 1 背景介绍 在现代工作环境中,远程访问公司内网的Ubuntu主机对于开发者来说是一项基本需求。然而,由于内网的限制,传统的远程控制软件如向日葵和todesk往往无法满足这一需求。作…

【后端面试题】【中间件】【NoSQL】MongoDB查询过程、ESR规则、覆盖索引的优化

任何中间件的面试说到底都是以高可用、高性能和高并发为主,而高性能和高并发基本是同时存在的。 性能优化一直被看作一个高级面试点,因为只有对原理了解得很透彻的人,在实践中才能找准性能优化的关键点,从而通过各种优化手段解决性…

YOLOv5改进 | 损失函数 | EIoU、SIoU、WIoU、DIoU、FocuSIoU等多种损失函数

秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 专栏目录: 《YOLOv5入门 …

VsCode允许JSON文件注释

打开设置 配置 输入:文件关联或者Files: Associations

Qt实现检测软件是否多开

Qt实现检测软件是否多开 在桌面软件开发中,软件通常要设置只允许存在一个进程,像一些熟知的音乐软件,QQ音乐这种。而这些软件在限制只有一个进程的同时,通常还会有双击桌面图标唤醒已运行的后台进程的功能。关于双击桌面唤醒已运…

Android广播机制

简介 某个网络的IP范围是192.168.0.XXX,子网 掩码是255.255.255.0,那么这个网络的广播地址就是192.168.0.255。广播数据包会被发送到同一 网络上的所有端口,这样在该网络中的每台主机都将会收到这条广播。为了便于进行系统级别的消息通知&…

Android使用http加载自建服务器静态网页

最终效果如下图,成功加载了电脑端的静态网页内容,这是一个xml文件。 电脑端搭建http服务器 使用“Apache Http Server”,下载地址是:https://httpd.apache.org/download.cgi。具体操作步骤,参考:Apache …

使用 urllib OpenSSL 时遇到的问题及解决

题意: ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1, currently the ssl module is compiled with LibreSSL 2.8.3 当前使用的 urllib3 版本(v2.0)仅支持 OpenSSL 1.1.1 或更高版本,但你的 Python 环境中的 ssl 模块…

Windows 11 安装 Python 3.11 完整教程

Windows 11 安装 Python 3.11 完整教程 一、安装包安装 1. 下载 Python 3.11 安装包 打开浏览器,访问 Python 官方下载页面。点击“Download Python 3.11”,下载适用于 Windows 的安装包(Windows installer)。 2. 安装 Python 3.11 运行下载的安装包 python-3.11.x-amd6…

django @login_required 为什么会自动重定向到/accounts/login/?next=/myblog/post/new/

在Django中,login_required 装饰器用于确保用户在访问某个视图时已经登录。如果用户未登录,那么Django会自动重定向用户到登录页面。默认情况下,Django使用/accounts/login/作为登录URL。如果用户试图访问一个需要登录的视图,比如…

eNSP-VLAN虚拟局域网

一、出现Vlan的原因 同一个局域网,使用交换机连接,虽然比集线器相连,降低了广播风暴,但是局域网主机数量够多的时候,正常的广播数据(arp、dhcp)也很影响网络性能,所以还需要进一步降低广播风暴——VLAN (图…

Altium Designer专业PCB设计软件下载安装 Altium Designer安装包下载获取

在电子设计的广袤领域中,PCB设计无疑占据着重要的地位。而Altium Designer作为一款业界领先的电子设计自动化软件,其提供的先进布局工具,无疑为设计师们打开了一扇通往高效、精确设计的大门。 在PCB设计的核心环节——布局中,Alti…