Koltin 语言与Java语言有哪些差异?

目录

1. 变量声明方式不同

2. 方法(函数)定义略有不同

3. 逻辑控制关键字 if 的使用区别

4. 继承的区别

5. 接口和实现的区别

6. Koltin 的数据类有什么用?


1. 变量声明方式不同

Koltin声明变量的方式与Java类似,但是顺序不太一样。

举例如下

Java声明一个不可变String:final String name;

Java声明一个可变String:String name;

总结就是 变量修饰符(可选)  变量类型 变量名

Koltin声明一个不可变String:val name String;

Koltin声明一个可变String:var name String;

补充说明:val(value的简写),声明一个变量不可变,与Java中的final修饰类似;

var(variable的简写),声明一个变量可变,即不被final修饰;

总结就是 变量修饰符(可选) 变量名 变量类型

也可以看出,Java与Koltin声明变量最大的区别就是变量名和变量类型顺序换了一下;

2. 方法(函数)定义略有不同

Java中的方法定义方式

方法修饰符 方法返回值 方法名(参数1类型 参数1名称,参数2类型 参数2名称,......){方法体}

Koltin 中方法定义方式

fun(固定位fun,function的缩写) 方法名 (参数1名称 参数1类型,参数2名称 参数2类型,......):方法返回值类型{方法体}

3. 逻辑控制关键字 if 的使用区别

Koltin语言中 if 关键字比Java语言中多了一个功能,它可以有返回值,很好理解,举例如下

// fun定义一个方法,名为largeNumber,方法返回较大的一个数
// 参数分别为 Int 类型的num1和Int类型的num2,方法返回值类型也为Int
fun largerNumber(num1: Int, num2: Int): Int {
// if 可以有返回值,返回较大的一个数,定义一个val不可变参数value接收val value  = if (num1 > num2) {num1} else {num2}
// 返回参数 valuereturn value
}

4. 继承的区别

Java中,继承使用关键字 "extend",只要一个类没有被 final 修饰,默认就是可以被继承的。

继承方式为 子类 extend 父类

// 定义父类Person人
public class Person{
}
// 定义Student学生类继承Person人类
public class Student extend Person{
}

Koltin中,继承关键字要使用 "open",只有被"open"关键字修饰的类可以被继承,继承格式为

子类:父类()

举例如下:

// 定义Father父类,切被open修饰
open class Father {
}
// 父类Father被open修饰,子类Son可以继承Father
// 继承格式为 子类:父类()
class Son : Father(){
}

5. 接口和实现的区别

Java中接口关键字为 "interface",Koltin中接口关键字也为"interface"

Java的接口实现比较简单,这里就不举例说明了,Koltin接口实现的方式如下图

// 使用 interface 定义一个接口
interface Person {// 定义两个变量 name 和 age,但是一般很少在接口中定义变量,只会定义接口方法,
// 这里我只是举例说明var name: Stringvar age: Int// 定义一个sayHell()接口方法,该方法无返回值fun sayHello()// 定义一个有返回值的接口方法largeNumber,方法返回值为Intfun largeNumber(num1: Int, num2: Int): Int
}// 子类Student实现重写父接口Person中定义的方法
class Student : Person {
// override 重写父类中定义的name和ageoverride var name: String = "Tom"override var age: Int = 18// override重写sayHello() 方法override fun sayHello() {println("$name is $age years old, say hello")}// override 重写largeNumberoverride fun largeNumber(num1: Int, num2: Int): Int{val value  = if (num1 > num2) {num1} else {num2}return value}
}

6. Koltin 的数据类有什么用?

Koltin 中的数据类非常类似于Java中的JavaBean,但是比JavaBean要简化的多,它只需要在类的前面定义一个 "data",即可标记该类为数据类,如下代码所示

data class 类名(var param1:数据类型,var param2:数据类型,......
){// 没有结构体的时候,该大括号可以省略}

当我们声明了一个数据类之后,编译器会帮我们做以下几件事

(1)生成equals()函数与hasCode()函数;

(2)生成toString()函数,由类名(参数1 = 值1,参数2 = 值2,....)构成;

(3)由所定义的属性自动生成component1()、component2()、...、componentN()函数,其对应于属性的声明顺序;

(4)copy()函数;

这里主要说一下componentN() 和 copy() 函数,很简单,它其实就是Java中的 get方法,set 方法。

下面我用代码来举例说明

Java代码定义一个User类,并定义name和pwd两个属性,如下所示

// 定义一个 User 用户类,并定义 name 和age 两个变量
public class User {private String name;private String pwd;// 添加无参构造器public User(){}// 添加全参构造器public User(String name, String pwd) {this.name = name;this.pwd = pwd;}// 生成每个属性变量的getter和setter方法public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPwd() {return pwd;}public void setPwd(String pwd) {this.pwd = pwd;}// 生成toString方法@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", pwd='" + pwd + '\'' +'}';}
}

可以看到,JavaBean代码的实体类代码量很大,显得很臃肿,也许有些同学会说我可以在类上标记@Data,@Gatter,@Setter注解省很多事情。

也许你很急,但别急,我们看一下Koltin语言实现同样的效果有多简单

Koltin 定义User用户类,并定义name和age两个属性

data class User(val name : String, val pwd : String)

OK,一行代码搞定,是不是很简单

然后我们在来说刚才的 componentN() 和 copy() 函数怎么用

copy函数举例:

// 定义
val user1 = User("kotlin","123456")
println(user1)// 使用copy函数修改name属性的值
val newUser1 = user1.copy(name = "new Kotlin")
println(newUser1)

copy函数,类似Java的setter方法,括号内要对当前对象哪个属性做修改,直接写 属性名 = "要修改的值" 即可。

componentN() 函数举例:

val user1 = User("kotlin","123456")
println(user1.component1());
println(user1.component2());

控制台输出结果为

koltin

123456

简单来说,Kotlin中定义一个数据类,则系统会默认自动根据参数的个数生成component1() ... componentN()函数。

componentN()函数就是用于解构声明的,现在我们的数据了共定义了name和pwd两个属性.

对应着,函数component1()获取到的就是第一个属性name;

函数component2()获取到的就是第二个属性pwd;

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

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

相关文章

Mapbox添加model图层

贴个群号 WebGIS学习交流群461555818,欢迎大家 效果图 源码 经常关注mapbox的朋友会发现,3.0版本之后,mapbox的api里更新了一个model图层 但是呢,却没有提供model有关的api,让我们摸不着头脑,到底该如…

20个常用的Python脚本

以下是20个常用的Python脚本示例&#xff1a; 计算阶乘 def factorial(n):if n 0:return 1else:return n * factorial(n-1)print(factorial(5))斐波那契数列 def fibonacci(n):if n < 1:return nelse:return fibonacci(n-1) fibonacci(n-2)print(fibonacci(10))判断素数…

最新基于R语言lavaan结构方程模型(SEM)技术

原文链接&#xff1a;最新基于R语言lavaan结构方程模型&#xff08;SEM&#xff09;技术https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247596681&idx4&sn08753dd4d3e7bc492d750c0f06bba1b2&chksmfa823b6ecdf5b278ca0b94213391b5a222d1776743609cd3d14…

【C++庖丁解牛】模拟实现STL的string容器(最后附源码)

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 1.vs和g下string结构…

librtmp交叉编译

目录 软件包下载 libopenssl编译 libz编译 librtmp编译 软件包下载 librtmp依赖openssl库和zlib库&#xff0c;注意openssl库版本需要为1.0&#xff0c;三个库下载地址如下&#xff1a; openssl:https://www.openssl.org/source/old/1.0.0/openssl-1.0.0s.tar.gz zlib:h…

LeetCode_Hot100_栈_155最小栈_Python

题目 设计一个支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶部的元素。i…

mysql笔记:3. 表数据更新

文章目录 插入数据插入单条数据插入多条数据复制表插入数据 更新数据删除数据截断表 存储在系统中的数据是数据库管理系统&#xff08;DBMS&#xff09;的核心&#xff0c;数据库被设计用来管理数据的存储、访问和维护数据的完整性。那么&#xff0c;数据库和表创建完成后&…

创造一款安卓自定义控件(4)——使用Matrix的setPolyToPoly方法实现图像纠正

接上文&#xff1a; 创造一款安卓自定义控件_任意4顶点裁剪框http://t.csdnimg.cn/vu1r5 创造一款安卓自定义控件_任意4顶点裁剪框2_为裁剪框添加放大镜功能http://t.csdnimg.cn/qkngh 创造一款安卓自定义控件_裁剪原理介绍http://t.csdnimg.cn/ORRRL 需求 随着需求修改&#x…

Stable Diffusion 详解

整体目标 文本生成图片&#xff1b;文本图片生成图片 网络结构 CLIP的文本编码器和图片生成器组成图像生成器&#xff0c;输入是噪声经过UNet得到图像特征&#xff0c;最后解码得到图像 前向扩散 模型直接预测图片难度比较大&#xff0c;所有让模型预测噪音然后输入-噪音…

macbook pro 2018 安装 arch linux 双系统

文章目录 友情提醒关于我的 mac在 mac 上需要提前做的事情复制 wifi 驱动 在 linux 上的操作还原 wifi 驱动连接 wifi 网络磁盘分区制作文件系统挂载分区 使用 archinstall 来安装 arch linux遗留问题 友情提醒 安装 archl linux 的时候&#xff0c;mac 的键盘是没法用的&#…

设计模式-结构型模式-代理模式

代理模式&#xff08;Proxy&#xff09;&#xff0c;为其他对象提供一种代理以控制对这个对象的访问。[DP] // 定义接口 interface Subject {void request(); }// 真实主题对象 class RealSubject implements Subject {Overridepublic void request() {System.out.println(&quo…

网络基础『 序列化与反序列化』

&#x1f52d;个人主页&#xff1a; 北 海 &#x1f6dc;所属专栏&#xff1a; Linux学习之旅、神奇的网络世界 &#x1f4bb;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 文章目录 &#x1f324;️前言&#x1f326;️正文1.协议的重要性2.什么是序列化与反序列化&…

AI会砸了我们的饭碗?

Sora&#xff0c;由OpenAI推出&#xff0c;是一款创新的文本到视频生成模型。它能够将文本描述转化为引人入胜的高清视频片段。采用了扩散模型和变换器架构&#xff0c;Sora实现了高效的训练。其方法包括统一表示法、基于补丁的表示法、视频压缩网络和扩散变换器。 Sora具备多种…

C语言--- 指针运算笔试题详解

目录 题目1&#xff1a; 题目2&#xff1a; 题目3&#xff1a; 题目4&#xff1a; 题目5&#xff1a; 题目6&#xff1a; 题目7&#xff1a; 题目1&#xff1a; #include <stdio.h> int main() {int a[5] { 1, 2, 3, 4, 5 };int *ptr (int *)(&a 1);print…

长期异地就医备案有效期是多久?答记者问!

4、长期异地就医登记的有效期是多长&#xff1f; 答&#xff1a;异地长期就医登记长期有效。 如果您因个人原因需要变更长期居住地&#xff0c;只需提供相应的登记信息即可申请变更。 5、临时异地就医登记的有效期是多长时间&#xff1f; 答&#xff1a;临时异地就医登记包括…

CSS伪类与常用标签属性整理与块级、行级、行级块标签(文本,背景,列表,透明,display)

目录 文本 color&#xff1a;字体颜色 font-size&#xff1a;字体大小​编辑 front-family&#xff1a;字体 text-align&#xff1a;文本对齐 text-decoration:line-through&#xff1a;定义穿过文本下的一条线 text-decoration:underline&#xff1a;定义文本下的一条线…

如何轻松打造属于自己的水印相机小程序?

水印相机小程序源码 描述&#xff1a;微信小程序。本文将为您详细介绍小程序水印相机源码的搭建过程&#xff0c;教您如何轻松打造属于自己的水印相机小程序。无论您是初学者还是有一定基础的开发者&#xff0c;都能轻松掌握这个教程。 一&#xff1a;水印相机搭建教程 1 隐…

上位机图像处理和嵌入式模块部署(qmacvisual旋转和镜像)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 旋转和镜像是图像处理中经常遇到的一个情况。很多时候&#xff0c;摄像头面对物体进行拍摄&#xff0c;未必是正对着进行拍摄的&#xff0c;这个时…

【学习笔记】VMware vSphere 6.7虚拟化入门

VMware vSphere 6.7虚拟化入门课程介绍 课程内容 1、VMware vSphere 6.7虚拟化入门课程介绍 2、ESXi6.7控制台设置 3、使用vSpkere Host client管理虚拟机 4、VMware EsXi基础操作 5、VMware Esxi存储管理 6、管理ESXi主机网络与虚拟机网络 7、安装配置vCenter Server Applia…

使用Amazon Bedrock托管的Claude3 学习中国历史

最近被Amazon Bedrock托管的Claude3 刷屏了&#xff0c;那么先简单介绍下什么是Claude 3。 Claude 3是Anthropic 推出了下一代 Claude模型&#xff0c;针对不同用例进行优化的三种先进模型&#xff1a;Claude 3 Haiku、Claude 3 Sonnet 和 Claude 3 Opus&#xff0c;使用户能够…