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
猜你喜欢
- 1. 基本用法<dependency> <groupId>org.redisson</groupI
- 今天,我们接着讲微信支付的系列教程,前面,我们讲了这个微信红包和扫码支付。现在,我们讲讲这个公众号支付。公众号支付的应用环境常见的用户通过公
- 使用对象访问类中的成员:对象名.成员变量;对象名.成员方法();成员变量的默认值:具体实例代码:public class StudentTe
- ActiveMQ是Apache的一个开源项目,它是一个功能强劲的开源消息总线,也是一个中间件产品,它是JMS的一个实现。在介绍ActiveM
- 本文实例讲述了Android编程使用HTTP协议与TCP协议实现上传文件的方法。分享给大家供大家参考,具体如下:Android上传文件有两种
- 目标线程的join方法暂停当前线程,直到目前线程完成(从run()方法返回),供大家参考,具体内容如下Java代码:package Thre
- 一、项目运行环境配置:Jdk1.8 + Tomcat8.5 + mysql + Eclispe(IntelliJ IDEA,Eclispe,
- 首先我们要明白一下几点,1.代码写出来除了让他跑起来还有个非常非常重要的作用是维护,因为没有一成不变的代码,需求变化代码就不可避免的要变化。
- 声明:作者是根据 Hongyang的博客自己实践之后,根据自己的理解写的,有什么不对的地方还望指正。 先放两张效果图 一、准备由于Andro
- 一、MVC架构1、MVC是什么MVC是模型Model、视图View和控制器Controller的简称,是一种架构规范降低了业务逻辑与视图之间
- 类1.什么是类类是事物的属性(外在特征)和行为(具备的功能)的集合2.想要知道Java中类是什么我们要先知道现实生活中的类是什么,因为Jav
- 本文实例为大家分享了AndAndroid实现网页图片浏览的具体代码,供大家参考,具体内容如下基本功能:输入图片的url然后点击按钮加载出来图
- 1、unity的脚本模板新版本unity中的C#脚本有三类,第一类是我们平时开发用的C# Script;第二类是Testing,用来做单元测
- 前面我们讲到了Spring在进行事务逻辑织入的时候,无论是事务开始,提交或者回滚,都会触发相应的事务事件。本文首先会使用实例进行讲解Spri
- 一 引入考虑实现一种三轴机器人控件。三轴机器人用来将某种工件从一个位置运送到另一个位置。其X轴为手臂轴,可以正向和反向运动,它处于末端,直接
- weibo.java @Override &n
- 注解是 JDK 5.0 引入的一种注释机制。注解可以作用在类型(类、接口、枚举等)、属性、方法、参数等不同位置,具体的 JDK
- Kotlin是一门基于JVM的编程语言,它正成长为Android开发中用于替代Java语言的继承者。Java是世界上使用最多的编程语言之一,
- 前言目前Flutter三大主流状态管理框架分别是provider、flutter_bloc、getx,三大状态管理框架各有优劣,本篇文章将介
- 一、首先看下支付宝上芝麻信用分的效果图:二、思路 1、确定雷达图中心点坐标 &nb