Kotlin定义其他类的实现详解
作者:niuyongzhi 发布时间:2022-12-18 09:29:14
1.嵌套类
如果一个类只对另外一个类有作用,那么可以将其嵌入到该类中,使两个类在一起。和Java中定义的内部类很像。
class Computer {
class Mouse(val name:String){
fun showDescribe(){
println("mouse name is $name")
}
}
}
fun main() {
val mouse = Computer.Mouse("Logitech")
//可以通过嵌套类的实例,访问其定义的属性和函数
mouse.showDescribe()
println(mouse.name)
}
2.数据类
顾名思义,数据类是专门用来存储数据的。
1)数据类的声明,通过在class前加data修饰,就可以将一个普通类定义为一个数据类。
2)数据类提供了toString,equals和hashCode的自定义实现。
3)==默认比较的是对象的引用。但是==用来比较数据类,比较的是他们的内容。
4)数据类默认支持解构。因为kotlin编译器实现了解构声明。
//用data关键字修饰class,就可以定义一个数据类
data class MotionEvent(var x: Int, var y: Int) {
}
fun main() {
//打印数据类对象,默认会调用toString方法。
val e1 = MotionEvent(10, 10)
val e2 = MotionEvent(10, 10)
println(e1)
println(e1.toString())
//数据类的==是判断的equals方法,比较的是内容,而不是对象引用。
println(e1 == e2)
//数据类支持解构
val (x, y) = e1
println("$x,$y")
}
打印结果:
10
MotionEvent(x=10, y=10)
MotionEvent(x=10, y=10)
true
10,10
通过反编,看下kotlin对数据类的默认实现。
public final class MotionEvent {
private int x;
private int y;
public final int getX() {
return this.x;
}
public final void setX(int var1) {
this.x = var1;
}
public final int getY() {
return this.y;
}
public final void setY(int var1) {
this.y = var1;
}
public MotionEvent(int x, int y) {
this.x = x;
this.y = y;
}
//解构声明
public final int component1() {
return this.x;
}
//解构声明
public final int component2() {
return this.y;
}
//默认实现了toString
public String toString() {
return "MotionEvent(x=" + this.x + ", y=" + this.y + ")";
}
//默认实现了hashCode
public int hashCode() {
return Integer.hashCode(this.x) * 31 + Integer.hashCode(this.y);
}
//默认实现了equals方法,比较的是两个对象数据的值。
public boolean equals(@Nullable Object var1) {
if (this != var1) {
if (var1 instanceof MotionEvent) {
MotionEvent var2 = (MotionEvent)var1;
if (this.x == var2.x && this.y == var2.y) {
return true;
}
}
return false;
} else {
return true;
}
}
}
3.定义数据类的必须满足的条件
1)数据类必须至少有一个参数的主构造函数。
2)数据类的主构造函数定义的参数必须是val或var修饰。
3)数据类用data关键字修饰,但是不能使用abstract、open、sealed、inner修饰。
4.解构声明
解构声明的实现原理,就是声明Component1、Component2等若干个组件函数,让每个函数返回一个熟悉数据。如果定义的是一个数据类,kotlin编译器会自动为每个属性声明Component函数。
自定 * 构声明:
通过operator fun component1() 。从定义可以看出来解构声明,是一种特殊的函数。
class Student(val name: String,val age:Int){
operator fun component1() = name
operator fun component2() = age
}
fun main() {
val student = Student("HanMei",18)
val (name: String, age: kotlin.Int) = student
println("$name,$age")
}
5.枚举类enum class
其实枚举就是一个类,kotlin定义的枚举用enum class,来强调枚举也是一个类。而java中只用enum修饰,就可以定义一个类。所以,在java中,枚举是一个类的概念就不太深入。
enum class Week() {
SUNDAY,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY;
fun getDay(): String {
return when (this) {
SUNDAY -> "星期天"
MONDAY -> "星期一"
TUESDAY -> "星期二"
WEDNESDAY -> "星期三"
THURSDAY -> "星期四"
FRIDAY -> "星期五"
SATURDAY -> "星期六"
}
}
}
fun main() {
println(Week.SUNDAY)
println(Week.SUNDAY.getDay())
}
6.运算符重载
可以通过operator fun plus 对“+”运算符进行重载。
data class MotionEvent(var x: Int, var y: Int) {
operator fun plus(e1: MotionEvent) = MotionEvent(x + e1.x, y + e1.y)
}
fun main() {
val e1 = MotionEvent(10, 10)
val e2 = MotionEvent(10, 10)
println(e1+e2)
}
打印结果:
MotionEvent(x=20, y=20)
来源:https://blog.csdn.net/niuyongzhi/article/details/126632526


猜你喜欢
- 前言Android6.0代号棉花糖。尽管是在15年I/O大会上Google被正式发布的了。但是看看大多数人的项目中大家的 targetSdk
- 1、Service的种类按运行地点分类:类别区别 优点缺点 应用本地服务(Local)该服务依附在主进程上,
- 一、理解slf4j(Simple Logging Facade for Java),表示为java提供的简单日志门面,更底层一点说就是接口。
- 下面是我自己收集整理的2017年Java岗位的面试题,可以用它来好好准备面试。一、Java基础1. String类为什么是final的。2.
- 1 前言Java是近 10 年来计算机软件发展过程中的传奇,其在众多开发者心中的地位可谓“爱不释手”
- 上一篇文章已经介绍了如何为RecyclerView添加FootView,在此基础上,要添加分页加载的功能其实已经很简单了。 上一篇文章地址:
- 这是一个android开屏布局的实例,可以用于加载广告图片和倒计时的布局。程序中设置的LayoutParams,划分额外空间比例为6分之5,
- 有时候有一些DOS命令需要我们在执行程序的时候调用,这需要使用C#提供的相关接口。代码如下,很简单,相信大家都能看懂,我就不赘述了。usin
- 《Android开发艺术探索》笔记:在Activity的onCreate()或者onResume()中去获得View的高度的时候不能正确获得
- 1. Spring Boot Condition功能与作用@Conditional是基于条件的自动化配置注解, 由Spring 4框架推出的
- 提示:运行该程序可双击滚动字幕推出程序。(当然任务管理器也可以...)步骤如下:1.新建窗体,并设置窗体的FormBorderStyle属性
- 当你在使用Mybatis 时进行配置的时候有这样几个坑一定要注意下。mybatisplus中逻辑删除通俗说为了在数据库中保留数据,但是又不想
- 我们来简单实现一个cookie。一、简单介绍Cookie 是一些数据, 存储于你电脑上的文本文件中。当 web 服务器向浏览器发送 web
- 本文实例为大家分享了android实现点击按钮控制图片切换的具体代码,供大家参考,具体内容如下代码:class MainActivity :
- 完成支付宝支付、查询的接口之后,我们应该还需要定时与支付宝进行对账,以确保商户系统的订单信息是正确的,想知道支付宝支付、查询接口实现过程的亲
- MyBatis插入Insert、InsertSelective的区别逆向自动生成的mybatis对应配置Mapper文件里面,有两个方法,分
- 重复参数 Scala在定义函数时允许指定最后一个参数可以重复(变长参数),从而允许函数调用者使用变长参数列表来调用该函数,Scala中使用“
- 使用工具:Android studio 3.0使用方法:一:在build.gradle(Module:app)中添加依赖implementa
- 本文实例为大家分享了unity实现玻璃效果的具体代码,供大家参考,具体内容如下一、使用Cubemap,做一个假反射shader代码如下:Sh
- 原理解析:利用RandomAccessFile在本地创建一个随机访问文件,文件大小和服务器要下载的文件大小相同。 根据线程的数量(假设有三个