当前位置: 首页 > 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/
📢这位道友请留步☁️,我观你气度不凡,谈吐间隐隐有王者霸气💚,日后定有一番大作为📝!!!旁边有点赞👍收藏🌟今日传你,点了吧,未来你成功☀️,我分文不取,若不成功⚡️,也好回来找我。

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

相关文章:

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

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&…...

Qt QTableView排序

1.简介 在开发过程中,我们需要通过点击表头来对QTableView或QTreeView等一系列高级视图进行排序操作,以下是进行排序的步骤。 步骤: 首先创建了一个QStandardItemModel对象或者继承QAbstractTableModel类作为数据模型,并设置了…...

Linux shell编程学习笔记22: () $() (()) 的用法小结

最近学习Linux Shell编程,对 () (()) [] [[]]等符号的用法还是有点分不太清楚,于是决定再梳理一下。今天先整理 () $() (()) 的用法。 1 单小括号() 1.1 子shell(命令组) 括号中的命令将会新开一个子shell顺序执行,所…...

1. Pthreads专栏简介

在基于共享内存的多处理器架构中,可使用线程实现并行。以前硬件供应商一般都会提供相应硬件专用的线程库,使得代码的可移植性成为另开发者头疼的一个问题。在UNIX系统中,IEEE POSIX 1003.1c标准已经定义了基于C的标准化线程编程接口规范&…...

C++17 fallthrough属性

在C17中,引入了[[fallthrough]]属性。这个属性主要用于switch语句中,用于告诉编译器,从上一个case标签到下一个case标签的执行是有意为之的,不应该被诊断为错误。 在switch-case语句中,如果当前case分支中不加break&a…...

STM32 蜂鸣器介绍 配置 播放音节

蜂鸣器一般被分为两类:有源蜂鸣器和无源蜂鸣器。其中源是振荡源。有源蜂鸣器内部有正当电路,可以把直流电源转换为一定频率的脉冲信号。因为它一直输出一定的频率,我们无法改变频率,我们只能通过电源,控制它发不发声&a…...

多目标最优化的资产配置

摘要及声明 1:本文主要对基于均值方差最优化的资产配置方法进行拓展,从多目标最优化的角度看待资产配置并可视化展示; 2:本文主要为理念的讲解,模型也是笔者自建,文中假设与观点是基于笔者对模型及数据的…...

word图片的标题跑到了图片的上方。

问题描述:在写论文时,在word文档中插入了一个svg图片,然后在图片下方输入标题。后面可能是调整了svg图片的大小,标题跑到了图片的上方。 具体情况如下图所示。标题明显跑到了图片的上方。 解决办法:把svg图片格式调成…...

electron打包下载资源失败,设置国内镜像

0.electron介绍 Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows、Linux及macOS上运行的跨平台应用。可以用原生html写,也可以用vue等…...

架构漫谈 - 如何设计高性能、高可用、高扩展架构

文章目录 一、如何设计高扩展架构架构设计复杂度模型可扩展复杂度模型"拆分"复杂度分析和设计"封装"复杂度分析和设计(1)规则引擎:美团MazeGO规则引擎(2)微内核:OSGI微内核(3)抽象层:Linux VFS抽象层(4)设计模式二、设计高性能架构单机高性能集…...

matlab 读写ENVI标准数据

本博客主要讲解如何读、生成ENVI标准格式的数据。主要分为四部分:读取ENVI头文件、读取ENVI数据、写入ENVI头文件、生成ENVI标准数据,最后附加讲解了本人写的生成hdr文本文件代码。此外,文中还具体介绍写代码的一些思路。 一、读取ENVI头文件…...

如何对ppt文件设置修改权限?

PPT文件会应用在会议、演讲、课件等工作生活中,当我们制作好了PPT之后,保护内容防止在演示时出错是很重要的,那么如何将PPT文件设置成禁止修改模式呢?今天分享几个方法给大家。 方法一 将PPT文件直接保存或者另存为一份文件&…...

STM32G030F6P6 芯片实验 (二)

STM32G030F6P6 芯片实验 (二) Hello World - GPIO LED 尝试了下, 从 0 开始建 MDK HAL M0plus Project, 成功点亮 LED了。 但是 ST-LINK跑着跑着, 码飞了! 不知飞哪去了。 只好拿 MX 建了个 MDK Base。 呼叫 SysTick HAL_Delay(), 切换 LED。 基本上都是一样的用法, 只是换…...

时间序列预测模型实战案例(七)(TPA-LSTM)结合TPA注意力机制的LSTM实现多元预测

论文地址->TPA-LSTM论文地址 项目地址-> TPA-LSTM时间序列预测实战案例 本文介绍 本文通过实战案例讲解TPA-LSTM实现多元时间序列预测,在本文中所提到的TPA和LSTM分别是注意力机制和深度学习模型,通过将其结合到一起实现时间序列的预测,本文利用…...

Mysql多表设计

前言 多表查询中要给每一表起别名 tableA as 别名1 , tableB as 别名2 ; (111111推荐) tableA 别名1 , tableB 别名2 ; 例子: select emp.name , dept.name from tb_emp emp inner join tb_dept dept on emp.dept_id dept.id; 一对一 在任…...

第九章:最新版零基础学习 PYTHON 教程—Python 元组(第五节 -清除元组的5种方式方法)

有时,在处理记录数据时,我们可能会遇到需要执行数据记录清除的问题。元组是不可变的,无法修改,因此使这项工作变得困难。让我们讨论执行此任务的某些方法。 目录 方法 #1:使用 list() + clear() + tuple() 方法#2:使用 tuple() 重新初始化...

学习笔记4——JVM运行时数据区梳理

学习笔记系列开头惯例发布一些寻亲消息 链接:https://baobeihuijia.com/bbhj/contents/3/192489.html 类装载器classLoader: 将本地的字节码文件.class 加载到内存方法区中成为元数据模板(两个class对象是否为同一个类要求:完整…...

Splunk 创建特色 dashboard 报表

1: 背景: 对原有的dashboard 进行增加点东西,特别是文字部分: 比如: 增加:“this is a guidline for how to use performance". 这段话,就不能写在title, 那样,这段文字,会出现在dashboard 的PDF 文件的分割线的上面,不符合要求。 2: 解决问题: 正确的做法是…...

如何在校园跑腿系统小程序中构建稳健的订单处理与分配系统?

1. 数据库设计 首先,设计订单数据结构。使用数据库(例如MySQL、MongoDB等),创建订单表以存储订单相关信息,包括订单ID、用户信息、交付地址、订单状态等。 CREATE TABLE orders (order_id INT AUTO_INCREMENT PRIMAR…...

数据结构与算法—双链表

前言 前面有很详细的讲过线性表(顺序表和链表),当时讲的链表以单链表为主,但在实际应用中双链表有很多应用场景,例如大家熟知的LinkedList。 双链表与单链表区别 单链表和双链表都是线性表的链式实现,它们的主要区别在于节点结构…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

【JVM】- 内存结构

引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

蓝桥杯 冶炼金属

原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

k8s从入门到放弃之HPA控制器

k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率(或其他自定义指标)来调整这些对象的规模,从而帮助应用程序在负…...

面试高频问题

文章目录 🚀 消息队列核心技术揭秘:从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"?性能背后的秘密1.1 顺序写入与零拷贝:性能的双引擎1.2 分区并行:数据的"八车道高速公路"1.3 页缓存与批量处理…...

STM32标准库-ADC数模转换器

文章目录 一、ADC1.1简介1. 2逐次逼近型ADC1.3ADC框图1.4ADC基本结构1.4.1 信号 “上车点”:输入模块(GPIO、温度、V_REFINT)1.4.2 信号 “调度站”:多路开关1.4.3 信号 “加工厂”:ADC 转换器(规则组 注入…...