Kotlin基础——变量、函数、字符串模板、类

news2024/12/26 11:23:11

变量

Kotlin和Java一样是静态语言,所有表达式类型在编译期已经确定,public为默认可见性

变量由 var/val+变量名[: 数据类型][?][ = 值] 组成,如

var a = 1

var b: Int
b = 3

var s: String? = null

val language = arrayListOf("java")
language.add("Kotlin")
  • 无需显示声明每个变量的类型,自动类型推导
  • 若变量未初始化则需要显示指定类型
  • ?标记变量可以为空,若无则不可为空
  • val为不可变变量,初始化后不能再次赋值,对应Java的final,但其指向的对象可以改变

函数

函数组成为 fun 函数名(参数名: 参数类型, …): 返回值{}

fun max(a: Int, b: Int): Int {
    return if (a > b) a else b
}

上面称为代码块函数体,当函数体由单个表达式构成时,可简化为表达式函数体(自动会推导出返回类型)

fun max(a: Int, b: Int) = if (a > b) a else b

参数

如定义一个格式化输出集合的函数

fun <T> joinToString(
    collection: Collection<T>,
    separator: String,
    prefix: String,
    postfix: String
): String {
    val result = StringBuilder(prefix)
    for ((index, element) in collection.withIndex()) {
        if (index > 0)
            result.append(separator)
        result.append(element)
    }
    result.append(postfix)
    return result.toString()
}


val list = listOf("1", "2", "3")
println(joinToString(list, "-", "[", "]"))

在常规调用中,必须按照参数顺序给定参数,通过带默认值的参数可以省略后面的参数传递,默认参数被编码到被调用的函数内部

fun <T> joinToString(
    collection: Collection<T>,
    separator: String = "",
    prefix: String = "",
    postfix: String = ""
): String {
    val result = StringBuilder(prefix)
    for ((index, element) in collection.withIndex()) {
        if (index > 0)
            result.append(separator)
        result.append(element)
    }
    result.append(postfix)
    return result.toString()
}

println(joinToString(list, "-"))

Java需要显式传递所有参数,若需要调用上面的函数,可以用@JvmOverloads注解,会生成

String joinToString(Collection<T> collection, String separator, String prefix, String postfix);
String joinToString(Collection<T> collection, String separator, String prefix);
String joinToString(Collection<T> collection, String separator);
String joinToString(Collection<T> collection);

如果使用命名参数可以省略中间的参数,按照任意顺序给定参数

println(joinToString(list, prefix = "[", postfix = "]"))

顶层函数和属性

如新建一个test.kt文件,创建max()方法,其不属于任何类

package com.demo.demo1

fun max(a: Int, b: Int): Int {
    return if (a > b) a else b
}

会被编译Java的静态函数

public class TestKt {
    public static int max(int a, int b) {
        if (a > b)
            return a;
        else
            return b;
    }
}

如果需要修改顶层函数生成的类的名称,可以在包名前添加注解

@file:JvmName("MyTest")

package com.demo.demo1

fun max(a: Int, b: Int): Int {
    return if (a > b) a else b
}

同理,test.kt文件存放属性

package com.demo.demo1

var a = 0
val b = 1
const val c = 2

会被编译Java的静态域

public class TestKt {
    public static int a = 0;
    public static int b = 1;
    public static final int c = 2;
}

扩展函数和属性

把要扩展的类/接口的名称放到即将添加的函数前面,如下扩展String类新增lastChar()方法

  • 可省略this
  • 能访问被扩展类的public方法和属性
  • 不在同一包的文件需要import扩展函数,若出现命名冲突,可以使用as重命名
  • 不能被子类重写
  • 如果扩展函数和成员函数有相同签名,会优先调用成员函数
fun String.lastChar(): Char = this.get(this.length - 1)

println("Kotlin".lastChar())

在Java中访问扩展函数(放在test.kt)

TestKt.lastChar("Kotlin");

如下定义扩展属性,因为String内容不可变,所以没有setter()

val String.lastChar: Char
    get() = this.get(length - 1)

var java.lang.StringBuilder.lastChar: Char
    get() = get(length - 1)
    set(value: Char) {
        setCharAt(length - 1, value)
    }

当Java中访问扩展属性(放在test.kt),需要显示调用getter()

TestKt.getLastChar("Java");

字符串模板

可在字符串中通过$引用变量

fun main(args: Array<String>) {
    val name = if (args.size > 0) args[0] else "Kotlin"
    println("Hello,$name")
}

还可以用${}引用表达式

fun main(args: Array<String>) {
    if (args.size > 0) {
        println("Hello,${args[1]}")
    }
}

fun main(args: Array<String>) {
    println("Hello,${if (args.size > 0) args[0] else "Kotlin"} ")
}

只有数据没有其他代码的对象通常叫做值对象,如JavaBean

public class Person {
    private String name;

    private final int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }
}

使用过程如下

Person person = new Person("java", 8);

person.setName("kotlin");
System.out.println(person.getName());
System.out.println(person.getAge());

将上述Java复制到代码.kt文件,会触发自动转换(.kt不要求类名和文件名一致,可将多个类放到同一文件,且文件名随意

在这里插入图片描述

转换后的代码如下,name为var变量(默认带有getter和setter),而age为val变量(只有getter)

class Person(
    var name: String,
    val age: Int
) 

使用方法如下

val person = Person("java", 8);

person.name = "kotlin"
println(person.name)
println(person.age)

如果一个属性可以根据其他属性计算,可使用自定义getter

class Rectangle(val height: Int, val width: Int) {
    val isSquare: Boolean
        get() {
            return height == width
        }
}

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

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

相关文章

Kmeans算法的K值选择技巧【Elbow Method + Silhouette Score Method】

文章目录 一、方法简述二、使用到的数据集三、代码实现四、结论 一、方法简述 在Kmeans算法中最终聚类数量K的选择主要通过两个方法综合判断&#xff1a; Elbow Method 这是一种绘制k值范围的平方和的方法。如果此图看起来像一只手臂&#xff0c;则k是选择的类似肘部的值。从这…

走进人工智能的大门:打造职业梦想的契机

在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;不再是科幻小说的情节&#xff0c;而是我们现实生活和职业生涯中的现实部分。从自动驾驶汽车到智能助手&#xff0c;AI 的影响已经渗透到各个领域。而中国&#xff0c;作为全球人工智能市场的重要一员&#xff…

HTML简单实现v-if与v-for与v-model

Vue启动&#xff01;&#xff01; 首先VIewModel将View和Model连接一起&#xff0c;Model的数据改变View的数据也变 使用Visual Studio Code 启动Vue需要vue.js插件和导入CDN(包) vue.js插件&#xff1a;CTRL shift x 在搜索栏搜 索vue.js安装即可 CDN&#xff1a; http…

利用HTTP2,新型DDoS攻击峰值破纪录

亚马逊、Cloudflare 和谷歌周二联合发布消息称&#xff0c;一种依赖于 HTTP/2 快速重置技术的攻击行为对它们造成了破纪录的分布式拒绝服务 (DDoS) 攻击。 根据披露的信息&#xff0c;该攻击自8月下旬以来便一直存在&#xff0c;所利用的漏洞被跟踪为CVE-2023-44487&#xff0c…

花园这样去装,让户外空间更上一个层次

花园这样去装&#xff0c;让户外空间更上一个层次 园林设计师马修-布罗姆利&#xff08;Matthew Bromley&#xff09;说&#xff1a;”我深受法国和英国花园传统的影响&#xff0c;而这些客户想要的是一个能让人回想起在法国南部迷人的凉棚下度过的时光的空间。斑驳的树荫、燃烧…

关于Web应用和容器的指纹收集以及自动化软件的制作

一次对Web应用的渗透&#xff0c;九成都是从信息收集开始&#xff0c;所以信息收集就显得尤为重要。关键信息的收集可以使你在后期渗透的时候更加的得心应手&#xff0c;把渗透比喻成走黑暗迷宫的话&#xff0c;那信息收集可以帮你点亮迷宫的大部分地图。 信息收集涉及的点特别…

[Leetcode] 0094. 二叉树的中序遍历

94. 二叉树的中序遍历 题目描述 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[]示例 3&#xff1a; 输入&…

现代风格设计,大美至简!福州中宅装饰,福州装修

风格&#xff1a;现代 面积&#xff1a;70m 户型&#xff1a;住宅 现代风格设计是较为流行的风格 注重家居空间的布局与使用功能的结合 追求时尚和潮流 客厅空间 简约风格已经成为装修的一种流行趋势 讲究以简洁的视觉制造出简单的风格 客厅的空间整体户型 是纵向客餐厅…

【Python】一个句子中也许有多个连续空格,过滤掉多余的空格,只留下一个空格

题目要求&#xff1a;一个句子中也许有多个连续空格&#xff0c;过滤掉多余的空格&#xff0c;只留下一个空格 例&#xff1a;&#xff08;为了方便观看&#xff0c;以 ▢ 代替空格&#xff09; 输入&#xff1a;123▢▢abc▢▢▢python 输出&#xff1a;123▢abc▢python 参考…

vue源码分析(五)——vue render 函数的使用

文章目录 前言一、render函数1、render函数是什么&#xff1f; 二、render 源码分析1.执行initRender方法2.vm._c 和 vm.$createElement 调用 createElement 方法详解&#xff08;1&#xff09;区别&#xff08;2&#xff09;代码 3、原型上的_render方法&#xff08;1&#xf…

轻量级仿 Spring Boot=嵌入式 Tomcat+Spring MVC

啥&#xff1f;Spring Boot 不用&#xff1f;——对。就只是使用 Spring MVC Embedded Tomcat&#xff0c;而不用 Boot。为啥&#xff1f;——因为 Boot 太重了&#xff1a;&#xff09; 那是反智吗&#xff1f;Spring Boot 好好的就只是因为太重就不用&#xff1f;——稍安勿…

EfficientViT:高分辨率密集预测的多尺度线性关注

标题&#xff1a;EfficientViT: Multi-Scale Linear Attention for High-Resolution Dense Prediction 论文&#xff1a;https://arxiv.org/abs/2205.14756 中文版&#xff1a;【读点论文】EfficientViT: Enhanced Linear Attention for High-Resolution Low-Computation将soft…

Betaflight关于STM32F405 SBUS协议兼容硬件电气特性问题

Betaflight关于STM32F405 SBUS协议兼容硬件电气特性问题 1. 源由2. 储备知识2.1 三态逻辑(Tri-state Logic)2.1 上拉 (Pull-up)2.2 下拉 (Pull-down)2.3 Current Sink2.4 Current Source2.5 GPIO输入模式2.6 GPIO输出模式 3. FPV系统协议简介3.1 TX Protocols – communication…

Elasticsearch跨集群检索配置

跨集群检索字面意思&#xff0c;同一个检索语句&#xff0c;可以检索到多个ES集群中的数据&#xff0c;ES集群默认是支持跨集群检索的&#xff0c;只需要动态的增加入节点即可&#xff0c;下面跟我一起来体验下ES的跨集群检索的魅力。 Elasticsearch 跨集群检索推荐的是不同集群…

vue源码分析(一)——源码目录说明

文章目录 一、如何下载源码&#xff08;可忽略&#xff09;&#xff08;1&#xff09;打开地址&#xff08;2&#xff09;复制链接&#xff08;3&#xff09;git clone 链接 二、源码目录说明1.可以根据你下载的源码通过package.json文件查看vue版本2.源码目录说明 一、如何下载…

Java中作为数据库某个表的实体类为什么一定要实现Serializable接口

在Java中&#xff0c;实体类并不一定要实现 Serializable 接口来作为数据库的某个表的映射。这个接口的实现主要与对象的序列化和反序列化相关。序列化是指将对象的状态信息转换为可以存储或传输的形式的过程。在反序列化过程中&#xff0c;这些信息可以用来重构原始对象。 下面…

Go学习第十五章——Gin(参数绑定bind与验证器)

Go web框架——Gin&#xff08;参数绑定bind与验证器&#xff09; 1 bind参数绑定1.1 JSON参数1.2 Query参数1.3 Uri绑定动态参数1.4 ShouldBind自动绑定 2 验证器2.1 常用验证器2.2 gin内置验证器2.3 自定义验证的错误信息2.4 自定义验证器 1 bind参数绑定 在Gin框架中&#…

人工智能轨道交通行业周刊-第64期(2023.10.16-10.29)

本期关键词&#xff1a;北斗应用、供电智能运维、5G-R、铁路职称、星火大模型 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通RailMetro轨道世界铁路那…

数据结构和算法——用C语言实现所有排序算法

文章目录 前言排序算法的基本概念内部排序插入排序直接插入排序折半插入排序希尔排序 交换排序冒泡排序快速排序 选择排序简单选择排序堆排序 归并排序基数排序 外部排序多路归并败者树置换——选择排序最佳归并树 前言 本文所有代码均在仓库中&#xff0c;这是一个完整的由纯…

哨兵1和2号遥感数据请求失败

哨兵1和2号遥感数据请求失败 问题描述 在23年10月底下载哨兵数据的时候发现&#xff0c;22年12月前的哨兵数据都请求失败了&#xff0c;但是之后的数据都能够下载&#xff0c;是否是哨兵数据下载也有时间限制&#xff1f;网站上只能保存近一年来的数据呢&#xff1f; 解决方案…