前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Kotlin学习笔记(二)-程序结构(上 )

Kotlin学习笔记(二)-程序结构(上 )

作者头像
g小志
发布于 2019-12-19 11:22:21
发布于 2019-12-19 11:22:21
68200
代码可运行
举报
文章被收录于专栏:Android常用基础Android常用基础
运行总次数:0
代码可运行

[TOC]

前言

上节我们主要讲了Kotlin的数据类型,这节我们主要从程序结构,包括方法,类成员,运算符的角度去认识Kotlin

常量与变量

上一节我们已经用到了用val,var来修饰属性。这节我们详细总结下:

  • 常量(val)
    • val=value,值类型
    • 类似Java的final
    • 不可能重复赋值
    • 运行时常量: val x = getX()
    • 编译期常量: const val x=2

Java final是运行时常量 Kotlin是编译器常量 例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Java:

public final String S1="A"
public String s2=S1

运行时字节码: 
public s2="A" //直接指向值 而不是变量名  

Kotlin:

val S1:String="A"
var s2:String =S1

运行时字节码: 
static{
    s2=S1//这里没有直接指向S1的值 所以是编译期常量
}
  • 变量(var)
    • var = variable
    • var x ="HelloWorld"//定义变量
    • x ="HiWorl"//再次赋值
  • 类型推导 编译器可以推导量的类型
    • val string =“Hello"//推导出String类型
    • valint=5IIInt类型
    • var x = getString() + 5 //String类型
函数

函数是以特定功能组织起来的代码块

举例:

  • fun sayHi(name: String){ println("Hi, $name") }
  • fun sayHi(name: String) = println(“Hi, $name")
  • 匿名函数
    • fun([参数列表])): [返回值类型]{ [函数体] }
      • 举例:- val sayHi = fun(name: String) = println(“Hi, $name")

Java是面向对象的,Kotlin是面向函数的,函数是一等公民,是在Java中你可以将调用一个对象,也可以将一个对象传来传去,在Kotlin中函数也是可以的做到像Java对象一样,下面结合代码来体验一下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fun main(args: Array<String>) {
    
    //不建议这么去写  这么写 是无法区分你想调用的是常量还是函数
    //这里和重载也不相同 因为val sum =fun 后面接的是无方法名的方法
    //这里默认是调用的方法  如果想调用常量方法  可以使用sum.invoke()等价于 sum()
    println("方法函数 " + sum(args[0].toInt(), args[1].toInt()))
    println("方法函数 invoke: " + sum(args[0].toInt(), args[1].toInt()))
    println("常量" + sum.invoke(args[0].toInt(), args[1].toInt()))

}
fun sum(aInt1: Int, aInt2: Int): Int {
    return aInt1 + aInt2
}

val sum = fun(aInt1: Int, aInt2: Int): Int {
    println("$aInt1 + $aInt2 = ${sum(aInt1, aInt2)}")
    return aInt1 + aInt2
}
fun printlnUarge(): String {
    return "请输入两个数值 例: 1 2"
}

val uager = fun(): String {
    return "请输入两个数值 例: 1 2"
}
Lambda表达式

Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。 使用 Lambda 表达式可以使代码变的更加简洁紧凑。 Java1.8加入,Kotlin作为面向函数编程的语言,他一出生就完美支持lambda

  • 语法
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(parameters) -> expression

(parameters) ->{ statements; }
  • lambda表达式的重要特征
    • 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
    • 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
    • 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
    • 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。

简单例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 1. 不需要参数,返回值为 5  
() -> 5  
  
// 2. 接收一个参数(数字类型),返回其2倍的值  
x -> 2 * x  
  
// 3. 接受2个参数(数字),并返回他们的差值  
(x, y) -> x – y  
  
// 4. 接收2个int型整数,返回他们的和  
(int x, int y) -> x + y  
  
// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void在Kotlin中时Unit)  
(String s) -> System.out.print(s)

Lambda表达式要是细说的话可能一篇文章也不够,我觉得刚开始看虽然代码变的更简洁,但是对我我这种只会Java一种语言的来说一下子转变有时候还是挺别扭的,感觉这个就得多写多看慢慢适应。

这里我再结合前面讲的函数和Kotlin特性写几个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fun multiply_1(arg1: Int, arg2: Int): Int {//具名函数 Lambda: (Int,Int)->Int
    return arg1 * arg2
}

fun multiply_2(arg1: Int, arg2: Int) = arg1 * arg2//具名函数 Lambda: (Int,Int)->Int

val multiply_3 = { arg1: Int, arg2: Int -> arg1 * arg2 }//匿名函数 Lambda: (Int,Int)->Int


val multiply_4 = { arg1: Int, arg2: Int ->
    //lambda
    println("HelloWorld multiply_4")
    println("HelloWorld multiply_4")
    println("HelloWorld multiply_4")
    arg1 * arg2//最后一行作为lambda的返回值

}
val multiply_5 = fun(arg1: Int, arg2: Int): Int {
    return arg1 * arg2
}//匿名函数 Lambda: (Int,Int)->Int
val multiply_6 = {//匿名函数 Lambda: ()->Unit
    //lambda
    println("HelloWorld")
}

fun printlnUsage() {//具名函数 Lambda: ()->Unit
    println("no return element")
}
//匿名函数 Lambda: ()->Unit
val sum1 = { it: String ->
    println(it)//方法体内容
    Unit//最后一行作为lambda的返回值 Kotlin Unit相当于Java的Void无返回值
}

这几个例子应该覆盖了我们会用到的大部分例子的类比了。

  • 循环语句 Kotlin的循环语句有些特殊看下面的例子:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//args=a b c d e f
fun main(args: Array<String>) {

    for (i in args) {
        println(i)
    }
    args.forEach{
        if (it == "d") return
        println(it)
    }
    println("The End")
}

当调用第二种循环,如果如上想跳出循环,那么println("The End")这句并不会执行。因为 {}中的内容是表达式而不是函数,所以return的是main这个函数,可以改成如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    run Break@/*外部标识*/{
        args.forEach Continue@/*内部标识*/{
            if (it == "d") return@Continue
            println(it)
        }

    }
    println("The End")

添加标识,return@Continue相当于java的Continuereturn@Break相当于Java的break。(这里标识的定义是随便写的,@A @ABC都可以)

成员方法和成员变量

这部分比较简单直接举例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class X
class B {
//    lateinit var a:Int //错误 不能再原始类型中使用 lateinit
//    lateinit var a:Double//error
//    lateinit var a1:Long//error
//    lateinit var a2:Float//error
//    lateinit var a3:Short//error
//    lateinit var a4:Char//error
//    lateinit var a5:Byte//error
//    lateinit var b: Boolean//error
    var a: Int = 0
        get() = field//默认可以不写
        set(value) {//默认可以不写
            field = value
        }
    lateinit var c: String

    lateinit var x1: X
    //    lateinit  val x2: //错误  不可以 val 类似final 定义后别虚初始化
    val x2: X by lazy {
        X()
    }
    var cc: String? = null

    fun value() {

    }
}

fun main(args: Array<String>) {

    val b = B()
    b.value()
    b.a
}

我们直接对上面的代码进行总结:

  • var/val a: Int = 0默认访问修饰符是public,同时默认帮我们getter和setter,当然我们也可以重写这两个方法
  • field这个属性(也叫Backing Field)只能在getter和setter才能访问到,更多详见理解Backing Field
  • Kotlin建议val/var修饰的属性最好直接初始化或是在构造方法中初始化,如果不可以就降级为局部变量**
  • lateinit延时初始化,不可以修饰val不可以修饰基本数据类型(因为基本数据类型有默认值),理智使用lateinit否则会空指针
  • by lazy{} 可以修饰val
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Kotlin 基础语法
以上例中 test() 的全名是 com.runoob.main.test、Runoob 的全名是 com.runoob.main.Runoob。
zhangjiqun
2024/12/16
1870
开心档-Kotlin 基础语法
以上例中 test() 的全名是 com.kxdang.main.test、Runoob 的全名是 com.kxdang.main.Runoob。
爱学iOS的小麦子
2023/02/08
7330
Kotlin语言基础入门:Kotlin简介
Kotlin 是一种富有表现力且简洁的编程语言,不仅可以减少常见代码错误,还可以轻松集成到现有应用中。
Android_anzi
2022/02/09
9670
《Kotlin 程序设计》第四章 Kotlin 语法基础
Kotlin 可以省略变量定义的类型声明,但是在定义参数列表和定义返回值类型时则必须明确指定类型(这个类型推断Kotlin居然没做,这地方用起来比Scala,Groovy要繁琐点)。
一个会写诗的程序员
2018/08/17
1.5K0
BNB丨BSC链项目系统开发DAPP模式分析解析方案
作为一种可能的Web3.0底层技术,区块链以去中心化、不可篡改、可溯源等特点,构建起数字经济时代的全新信任体系。
开发v_StPv888
2022/11/07
3970
Kotlin学习笔记(三)-程序结构(下 )
继续讲下程序结构,这部分相对简单,有时候可能会比较啰嗦,笔记嘛!就是在学习过程中我遇到的问题,作为记录。大家没有遇到问题更好。有些是个人理解,有更好的理解欢迎在评论。
g小志
2019/12/19
7220
Kotlin---基础数据类型与函数
Kotlin和一些脚本语言一样,在定义变量的时候不需要指定变量类型,Kotlin会根据默认值来确定变量类型。
None_Ling
2018/12/05
6720
给 Java 开发者的 Kotlin 快速上手教程(Kotlin for Java Developers)v0.1
1995年,当年如日中天的Sun公司发布了Java语言,引起了巨大的轰动,与当时主流的C语言和Basic语言比起来,Java语言简单、面向对象、稳定、与平台无关、解释型、多线程、动态等特点,就像是打开了一个新的世界,一时间风靡全球,云集者众,微软为了模仿Java搞出C#语言,Netscape为了赶时髦硬塞出一个JavaScript语言,IBM则捏着鼻子做了Java IDE Eclipse(日蚀,呵呵)。直到现在,Java在编程世界里还占据着举足轻重的地位,Andy Rubin在开发Android系统时,也很自然地采用了Java和C++(C++负责NDK开发)作为开发语言。
一个会写诗的程序员
2018/12/07
1.2K0
给 Java 开发者的 Kotlin 快速上手教程(Kotlin for Java Developers)v0.1
Kotlin语法基础
定义常量与变量 可变变量定义:var 关键字 var <标识符> : <类型> = <初始化值> 不可变变量定义:val 关键字,只能赋值一次的变量(类似Java中final修饰的变量) val <标识符> : <类型> = <初始化值> 字符串模板 $ 表示一个变量名或者变量值 $varName 表示变量值 ${varName.fun()} 表示变量的方法返回值: var a = 1 // 模板中的简单名称: val s1 = "a is $a"  a = 2 //
黄林晴
2019/01/10
6230
Kotlin Primer·第四章·Kotlin 的类特性(下)
张涛终于开始继续Kotin之旅了~ ---- 题外话:全书的目录以及主要内容已经公开,可在我公众号【技术实验室】的历史推送文章查看 第一部分——快速上手 第一章·启程 第二章·基本语法 第三章·Kotlin 与 Java 混编 第四章·Kotlin 的类特性 第五章·函数与闭包 函数与闭包的特性可以算是 Kotlin 语言最大的特性了。 5.1 函数 即使 Kotlin 是一门面向对象的编程语言,它也是有函数的概念的——而不像 Java 那样,仅仅有“方法”。 回顾一下前面第二章讲述的函数声明语法: fun
用户1907613
2018/07/20
5140
Kotlin函数式编程
Lambda表达式本质就是匿名函数,它的出现减少了代码量,同时也使代码变得更加简洁明了。Lambda是函数式编程的基础。
菜菜cc
2022/11/15
3300
Kotlin基本语法和使用技巧
take是从集合中取前几个元素 takeLast是从集合中取后几个元素 sortedBy 排序 过滤list,符合过滤条件的就是过滤结果 filterNot把符合条件的过滤掉,剩下的是结果。这个操作和 filter 相反 slice,取集合中的某一部分
六月的雨
2020/03/27
9220
从点滴基础探究Kotlin的独特魅力
博客:https://www.jianshu.com/p/fbbd68bffc69
陈宇明
2020/12/15
2.8K0
android-Kotlin基础语法
推荐教程 https://kotliner.cn/post/6292540246044377088
tea9
2022/07/16
3690
Kotlin难点
所有函数类型都有一个圆括号括起来的参数类型列表以及一个返回类型:(A, B) -> C 表示接受类型分别为 A 与 B 两个参数并返回一个 C 类型值的函数类型。 参数类型列表可以为空,如 () -> A,Unit 返回类型不可省略。
六月的雨
2023/05/26
5120
Kotlin难点
第2章 Kotlin 语法基础第2章 Kotlin 语法基础
人与人之间通过语言来交流沟通,互相协作。人与计算机之间怎样“交流沟通”呢?答案是编程语言。一门语言有词、短语、句子、文章等,对应到编程语言中就是关键字、标识符、表达式、源代码文件等。通常一门编程语言的基本构成如下图所示
一个会写诗的程序员
2018/08/17
2.8K0
第2章 Kotlin 语法基础第2章 Kotlin 语法基础
Kotlin之基本语法
在今年Google IO大会上Google已经明确kotlin作为为Android第一官方语言的地位。我相信Google的决意,就像当初毫不犹豫的抛弃eclipse转向as,kotlin已经是不可避免的大势所趋了。再加上Kotlin与java代码完全兼容,所以从Java转向Kotlin是一件很容易的事情。Kotlin语法简单,它融合了当前多种语言的优势,可以是一门明星语言。 下面就Kotlin的一些基本语法做一个讲解。 包 一个源文件往往以包声明开始:源文件的所有内容(比如类和函数)都被包声明并包括。 pa
xiangzhihong
2018/02/06
1.1K0
Kotlin修炼指南(二):lambda表达式的精髓
lambda表达式是Kotlin函数式编程的一个重要概念,要想掌握函数式编程,就必须熟练掌握lambda表达式,并掌握它的各种写法和实现,这些都是掌握函数式编程的基础。
用户1907613
2019/11/10
1.8K0
《Kotlin 程序设计》第六章 Kotlin 函数式编程(FP)第六章 Kotlin 函数式编程(FP)1. 函数式编程概述2. Kotlin函数式编程参考资料
从本质上来说, 程序就是一系列有序执行的指令集合。 如何将指令集合组织成可靠可用可信赖的软件(美妙的逻辑之塔), 这是个问题。
一个会写诗的程序员
2018/08/20
6250
《Kotlin 程序设计》第六章 Kotlin 函数式编程(FP)第六章 Kotlin 函数式编程(FP)1. 函数式编程概述2. Kotlin函数式编程参考资料
《Kotin 极简教程》第8章 函数式编程(FP)(2)
好了亲,前文中我们在函数式编程的世界里遨游了一番,现在我们把思绪收回来,放到在Kotlin中的函数式编程中来。
一个会写诗的程序员
2018/08/17
1.9K0
相关推荐
Kotlin 基础语法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验