当前位置: 首页 > news >正文

Android修行手册 - 一文全了解Kotlin几种静态变量、函数实现的那些事

  • 点击跳转=>Unity3D特效百例
  • 点击跳转=>案例项目实战源码
  • 点击跳转=>游戏脚本-辅助自动化
  • 点击跳转=>Android控件全解手册
  • 点击跳转=>Scratch编程案例
  • 点击跳转=>软考全系列

👉关于作者

专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等)
有什么需要欢迎底部卡片私我,交流让学习不再孤单

在这里插入图片描述

👉实践过程

在 Java 中使用静态方法或者静态变量,我们直接使用 static 进行静态修饰即可。调用起来不论是 Java 调用还是 Kotlin 调用,方式一样都很方便,类名.方法名 即可。
但是在 Kotlin 中使用静态的方式可就不止一种,有三四种呢,而且不同的方式在 Java 中引用使用方式还不同。具体采用哪种方式,还需要自己根据场景选择了~

😜静态方式

关于静态变量、常量、函数(方法)在Kotlin的使用,主要有以下几种形式:Object、companion object、顶层方法、 @JvmStatic注解、@JvmField注解

单例 Object

使用 Object 关键字修饰class类
该方式主要用到了 Kt 单例方面的知识
该方式所修饰的类,可以看做静态类,内部方法均为静态方法(定制性弱了一点)
同时在 Kt 中还可以用 open、data、internal

object MyStatic {fun myFun(){}
}//Kotlin中调用
MyStatic.myFun()
//Java中调用
MyStatic.INSTANCE.myFun();

在这里插入图片描述

伴生 companion object

伴随对象,通常声明单例方式,也是最常用的方式之一。
使用 companion object 包裹方法,只有在该作用域内的方法方为静态方法。
调用 companion object 修饰时,原理是内部维护了一个伴生类,伴随真不是白叫的,内部维护了静态内部类来模拟static特性
不支持 Java 直接调用 Kt 方法

class MyStaticTwo {companion object {fun myFun() {}}
}//Kotlin中调用
MyStaticTwo.myFun()
//Java中调用
MyStaticTwo.Companion.myFun();

在这里插入图片描述

顶层类 顶层方法

顶层方法是指那些没有定义在任何类中的方法,Kotlin编译器会将所有顶层方法编译成静态方法,这已经脱离了Java范围
该方式调用静态方法时无需通过 类名.方法,可直接调用方法。支持 Java 直接调用 Kt 方法

顶层方法常用在扩展函数、扩展属性场景

创建kt文件后,直接在里面写方法。

package cn.jucheng.datafactoryappfun myFun(){
}
//Kotlin中调用
myFun()    //直接调用方法即可
//Java中调用
MyStaticKt.myFun();  //可以通过【文件名+Kt】的形式调用出来。  我创建的文件名是 MyStatic 

在这里插入图片描述

注解 @JvmStatic、@JvmField(支持 Java 调 Kt)

我们使用 @JvmStatic 注解静态方法,使用@JvmField 注解静态参数(变量、常量)

原始 object 方式并 不支持在Java通过静态方式直接调用Kt静态方法,需要在方法上加 @JvmStatic 才能支持直接调用
只能写在 object 修饰的类或者 companion object 里,写法虽然有些别扭,但是效果是真的是按 static 来实现的

object MyStatic {@JvmFieldvar myName = "芝麻粒儿"@JvmStaticfun myFun() {}
}class MyStaticTwo {@JvmFieldvar myName = "芝麻粒儿"   //这种情况无法知己诶访问companion object {@JvmFieldvar myNameTwo = "芝麻粒儿"  @JvmStaticfun myFun() {}}
}
//Java中调用
MyStatic.myName="";
MyStatic.myFun();
MyStaticTwo.myName=""; //报错 无法调用
MyStaticTwo.myNameTwo="";
MyStaticTwo.myFun();//Kotlin中调用
MyStatic.myName
MyStatic.myFun()
MyStaticTwo.myNameTwo
MyStaticTwo.myName  //同样无法直接调用
MyStaticTwo.myFun()

在这里插入图片描述
反编译后可以看出这种形式是比较贴合我们常用的Java形式的。建议@JvmField修饰变量 @JvmStatic修饰函数方法。如果他们反过来使用虽然不报错,但是反编译后会发现里面代码多了一层处理。

静态常量 const

在使用const前,我们要了解 var、val 修饰变量的区别:var 可变变量,可更改、val 只读变量,不可更改
注意: const 仅支持 val 只读变量 的形式,包内唯一性,脱离类的束缚,这是kotlin的特性,不能和 @JvmField 混用
const 关键字的作用域 一般有三种地方:顶层方法、object 、companion object
我们写代码通常应该有个单独的object的类,里面放置的是所有的const修饰的常量,当然如果过多也可以分多个object类。
在 Java 中可以直接调用
在这里插入图片描述
从上面我们可以看出静态变量是定义在类公有属性中,和Java中定义一模一样,我们在Java中定义常量也是使用 final 关键字。但 const 有两个限制:

  1. 值必须是常量,后续不可更改
  2. 必须是基本的包装类型

😜将 Kotlin 编译成 Java

我们都知道 kotlin 最终还是要编译成 java class 在 JVM 上运行的,有时我们的确是想看看用 kotlin 写完的代码编译完了到底啥样子,这样有助于我们理解 kotlin 语法
比如现在想要查看具体的 Kotlin 不同静态方法具体的 Java 实现。我们直接使用 Android Studio 提供的工具即可。

在窗口中找到 Tools->Kotlin->Show Kotlin Bytecode 打开窗口然后点击 Decompile 进行反编译即可。
在这里插入图片描述
快去试试吧。

👉其他

📢作者:小空和小芝中的小空
📢转载说明-务必注明来源:https://zhima.blog.csdn.net/
📢这位道友请留步☁️,我观你气度不凡,谈吐间隐隐有王者霸气💚,日后定有一番大作为📝!!!旁边有点赞👍收藏🌟今日传你,点了吧,未来你成功☀️,我分文不取,若不成功⚡️,也好回来找我。

温馨提示点击下方卡片获取更多意想不到的资源。
空名先生

http://www.lryc.cn/news/221528.html

相关文章:

  • Qt QTableView排序
  • Linux shell编程学习笔记22: () $() (()) 的用法小结
  • 1. Pthreads专栏简介
  • C++17 fallthrough属性
  • STM32 蜂鸣器介绍 配置 播放音节
  • 多目标最优化的资产配置
  • word图片的标题跑到了图片的上方。
  • electron打包下载资源失败,设置国内镜像
  • 架构漫谈 - 如何设计高性能、高可用、高扩展架构
  • matlab 读写ENVI标准数据
  • 如何对ppt文件设置修改权限?
  • STM32G030F6P6 芯片实验 (二)
  • 时间序列预测模型实战案例(七)(TPA-LSTM)结合TPA注意力机制的LSTM实现多元预测
  • Mysql多表设计
  • 第九章:最新版零基础学习 PYTHON 教程—Python 元组(第五节 -清除元组的5种方式方法)
  • 学习笔记4——JVM运行时数据区梳理
  • Splunk 创建特色 dashboard 报表
  • 如何在校园跑腿系统小程序中构建稳健的订单处理与分配系统?
  • 数据结构与算法—双链表
  • linux继续循环案例测试ping网络,目录下的文件权限循环输出
  • 关于SSP3D复现
  • 在直播系统中使用RTSP协议传递视频
  • Notion汉化
  • echarts有背景的柱状图,鼠标滑过提示信息都是展示背景柱状图的值
  • 华为防火墙基本原理工作方法总结
  • Spring Cloud之多级缓存
  • 融云荣登「2023 年度 PaaS 企业排行榜」
  • YOLOv8轻量化模型:模型轻量化设计 | 轻量级可重参化EfficientRep| 来自YOLOv6思想
  • 【JavaSE】基础笔记 - 类和对象(下)
  • 浅析刚入门Python初学者的注意事项