首页 > 其他分享 >Kotlin:变量声明,null安全,条件语句,函数,类与对象

Kotlin:变量声明,null安全,条件语句,函数,类与对象

时间:2024-09-26 19:20:39浏览次数:12  
标签:语句 String Int Kotlin var null 函数

目录

一,变量声明

1.1 var和val

1.2 类型推断

1.3 Null安全

1.3.1 处理可为null性

二,条件语句

2.1条件语句与条件表达式

2.2 智能类型转换

三,函数

3.1 简化函数声明

3.2 匿名函数

3.3 高阶函数

四,类与对象

4.1 构造函数

4.1.1 主构造函数

4.1.2 次构造函数


一,变量声明

1.1 var和val

Kotlin使用两种关键字varval来修饰变量

  • val用于修饰无法被修改的变量,类似于java中的final;
  • var用于修饰可变的变量;
//var可变
var a : Int = 1
a = 2

//val不可变
val str : String = "Kotlin"

Kotlin中声明变量时,是先声明变量名称,再声明变量类型。Kotlin的基本数据类型包括Boolean IntFloatLongDouble等,均为大写开头,与java不同,CharString不属于数值类型,属于一个独立的数据类型;

1.2 类型推断

在Kotlin中,为某个变量赋初值后,Kotlin编译器可根据初始的类型推断变量的类型;

//根据“Kotlin”推断str类型为String
val str = "Kotlin"

//String类型方法正常调用
str.toUpperCase()

//其他类型方法不可调用
str.inc()

这里编译器根据“Kotlin”推断变量str类型为String,于是str可以调用String类型的方法,而不可调用Int类型的方法inc;

1.3 Null安全

Kotlin提供了严格的可为null性规则,与java不同,默认情况下,Kotlin变量不可为null值;

val str : String = null//不可这样声明,默认情况下不可为null

如果想要使变量可为null,需要在声明变量时在数据类型末尾加上?

val str : String? = null

在java中,默认情况下变量是可以为null的,方法的调用者为null时,就会出现空指针异常:NullPointerException

而在Kotlin中,对于这些可为null值的变量,Kotlin提供了多种机制来安全地处理它们;

1.3.1 处理可为null性

(1)使用 ?. 安全调用方法,调用者为null时,返回null,而不是空指针异常;

var str3 : String? = null;

//3.1 ?.安全调用方法,调用者为null时,返回null
println(str3?.length); //输出null

(2)使用 !!. 非null断言运算符,表示告诉编译器方法的调用者绝不为空,但是如果方法的调用者为null,就会报空指针异常,所以这种方法要谨慎使用;

var str3 : String? = null

//3.1 !! 非null断言运算符 str3为null时报空指针异常
str3 = "str3非null"
println(str3!!.length) //输出str3非null

str3 = null
println(str3!!.length) //空指针异常

(3)使用 ?: Elvis运算符,提供一个默认值,在方法调用者为null时,返回默认值;

var str3 : String? = null

//3.2 ?: Elvis运算符
val str3Length : Int = str3?.length ?: 0;
println(str3Length) //输出0

二,条件语句

2.1条件语句与条件表达式

Kotlin中同样可以使用if-else语句来处理条件逻辑;

if (count == 42) {
    println("I have the answer.")
} else if (count > 35) {
    println("The answer is close.")
} else {
    println("The answer eludes me.")
}

条件表达式:Kotlin条件语句的结果可作为表达式结果返回;

var count : Int = 1;

var str4 : String = if(count == 1){
    "hello"
}else if(count == 2){
    "world"
}else{
    "hello world"
};

println(str4); //输出hello

如果你在Kotlin中使用if-else条件表达式,Kotlin会建议你替换为when表达式,当条件语句复杂时,明显when表达式更简洁;

count = 3;
str4 = when{
    count == 1 -> "hello"
    count > 2 -> "world"
    else -> "hello world"
};
println(str4); //输出hello world

2.2 智能类型转换

Kotlin的条件语句还可以用来安全处理变量的可为null性,当条件语句判定变量不为null时,我们就不必使用安全调用运算符或非null断言运算符来调用方法;

//4.1 智能类型转换
var str6 : String? = "xdyd";
//str6可能为null
println(str6?.length)
//str6一定不会为null
if(str6 != null){
    println(str6.length)
}

三,函数

Kotlin中可以使用函数来封装功能,可以接收参数,声明函数时同样是类型后置;

fun getAnswerString(count : Int) : String{
    val ans: String = when{
        count == 1 -> "hello world"
        count < 1 -> "xxx"
        else -> "yyy"
    };
    return ans
}

3.1 简化函数声明

当函数返回单个表达式的值时,可以直接返回条件表达式;

fun getAnswerString(count : Int) : String{
    return when{
        count == 1 -> "hello world"
        count < 1 -> "xxx"
        else -> "yyy"
    };
}

也可以将 return 关键字替换为赋值运算符;

fun getAnswerString(count : Int) : String = when{
    count == 1 -> "hello world"
    count < 1 -> "xxx"
    else -> "yyy"
}

3.2 匿名函数

在Kotlin中,函数可以没有名称,只通过输入输出来表示,我们称之为匿名函数;

val getStringLength = fun (str : String) : Int{
    return str.length
}

匿名函数既可以看作是函数,也可以看作是一个对象,或者说是在把函数当作对象来使用,就像上边我们将匿名函数赋值给了getStringLength变量;

匿名函数也可以通过lambda表达式的方式表示,我们也可以这样理解:getStringLength是一个函数类型的变量,(String)-> Int 就是函数类型,表示接收一个String类型的参数,返回Int类型的值;

val getStringLength : (String) -> Int = {
    //参数名称可以自定义,这里为input,就是上面String类型的参数
    input -> input.length
}

匿名函数通常作为高阶函数的参数来使用;

3.3 高阶函数

一个函数可以将另一个函数作为参数来使用,我们称之为高阶函数

//5.3 高阶函数 将其他函数作为参数的函数 下面这个函数需要接收一个字符串和一个函数
fun stringMapper(str : String, mapper : (String) -> Int) : Int {
    return mapper(str);
}

//高阶函数的调用,传入了一个字符串和一个(String) -> Int类型的匿名函数
stringMapper("android nb", getStringLength)

val getStringLength : (String) -> Int = {
    input -> input.length
}

当高阶函数的最后一个参数为匿名函数时,匿名函数可以写在圆括号之外;

stringMapper("android nb") { input -> input.length }

除了匿名函数之外,高阶函数也可以使用命名函数来作为参数,使用命名函数作为参数时,需使用 :: 来创建函数类型对象,也就是说被 :: 修饰的函数可以作为对象来使用;

stringMapper("android nb", ::getMapper)

fun getMapper(str : String) : Int{
    return str.length
}

四,类与对象

Kotlin中同样使用 class 来定义类,类中可以包括成员变量,成员方法,构造函数,代码块,内部类等,这些与java都相同,与java不同的是,实例化类时不需要new关键字;

//6. 类 构造方法
class Person(){
    //成员变量
    private var name : String = ""

    //成员方法
    fun getName() : Int{
        return name.length
    }

    fun setName(name : String){
        this.name = name
    }

    //内部类
    class man(){

    }
}

//类的实例化
val person : Person = Person()

需要注意的是:在Kotlin中,变量的声明和初始化必须同时进行,如果想要推迟变量的初始化,可以使用 lateinit 关键字修饰;

例如:在使用Android的fragment时;

class HomeFragment() : Fragment() {
    //Kotlin必须在声明变量时初始化,使用lateinit可以推迟初始化
    private lateinit var btn_add : Button

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        var view = inflater.inflate(R.layout.item_mine, container, false)
        //初始化
        btn_add = view.findViewById(R.id.btn_mine)
        return view
    }
}

4.1 构造函数

4.1.1 主构造函数

Kotlin中类的主构造函数可以写在类的头部;

class Person(var name : String, private var age : Int){
   
}

等同于java代码中这种写法;

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

由于主构造函数不能包含任何代码块,所以我们可以使用初始化程序块来进行一些除初始化之外的操作,初始化程序块使用 init 关键字来修饰;

class Person(name : String, age : Int){
    var myName : String
    var myAge : Int

    init{
        myName = name
        myAge = age

        println(myName)
        println(myAge)
    }
}

4.1.2 次构造函数

次构造函数使用 constructor 关键字定义,用于提供多个构造方式。如果需要定义多个构造函数,或者需要一些额外的初始化逻辑,可以使用次构造函数;

如果此构造函数中没有接收全部的成员变量参数,必须给成员变量赋初值;

class Person {
    val myName: String
    var myAge: Int

    constructor(name : String){
        myName = name
        myAge = 18
    }

    constructor(name : String, age : Int){
        myName = name
        myAge = age
    }
}

如果类已经定义了主构造函数,那么次构造函数必须显示调用主构造函数;

class Person(val name: String, var age: Int) {
    constructor(name: String) : this(name, 0) {
        // 构造逻辑
    }
}

如果你需要定义一个无参构造函数,必须要给给主构造函数的参数提供默认值:

class Person(val name: String = "Unknown", var age: Int = 0)

val person = Person() // 使用默认值

可以看出,Kotlin似乎一直在避免一件事:声明的变量没有初始值,或者说声明的变量为null。这也是Kotlin null安全的一角啊;

标签:语句,String,Int,Kotlin,var,null,函数
From: https://blog.csdn.net/IH_LZH/article/details/142533827

相关文章

  • Python中的“with”语句:开启优雅文件操作的新篇章
    引言在日常开发工作中,我们经常需要与各种类型的文件打交道。无论是简单的日志记录还是复杂的文本分析,正确地打开、读取、写入以及关闭文件都是必不可少的步骤。然而,在传统的文件操作模式下(如使用open()函数),一旦在操作过程中发生异常,可能会导致文件未被正确关闭,进而引发资源泄露等......
  • 搭建jforum报错zeroDateTimeBehavior CONVERT_TO_NULL convertToNull
    今天搭建项目的时候,本来马上就搭好了,结果在安装的时候报错:"Theconnectionproperty‘zeroDateTimeBehavior’acceptablevaluesare:‘CONVERT_TO_NULL’,‘EXCEPTION’or‘ROUND’.Thevalue‘convertToNull’isnotacceptable."照着网上的教程找了好久都不行,最后自......
  • FPGA Verilog基本语句(语法)FPGA入门
    本篇文章主要写了在Verilog环境下,FPGA基本语法和数据类型。可以通过导航键快速进入assign语句、always语句等其他内容!对于Verilog(FPGA):module     ...                   ==》构成主体endmodulemodule模块名(【端口......
  • 初学者学Kotlin
    Kotlin是一种现代的、静态类型的编程语言,由JetBrains开发,它与Java100%兼容,并且被广泛用于Android应用开发。Kotlin的设计目标是更加简洁和安全,同时保持与Java生态系统的互操作性。对于初学者来说,Kotlin提供了清晰的语法和强大的功能,是一个很好的选择。###学习路......
  • mysql优化之sql语句优化、以及mysql一些高频面试题
    文章目录一、索引1、什么是索引2、添加索引的原则3、索引的优缺点4、索引分类5、mysql存储过程(方法)二、MySQL的逻辑架构1、逻辑架构2、MyISAM和InnoDB的区别三、mysql的索引数据结构1、BTree2、B+Tree四、缓冲池BufferPool1、预读机制2、预读失效3、淘汰策略五......
  • goto语句与标号
    在C语言中提供goto语句与跳转标号,他们可以在同一函数内跳转位置。#include<stdio.h>intmain(){inta=1;intd=4;gotoww;printf("a=%d",a);printf("hhhhh");ww:printf("d=%d",d);return0;}goto语句后面的单词只是跳转标号,可以是随意的字母组成特殊字......
  • SQL Server 语句日期格式查找方法
    SQLServer语句日期格式查找方法 1.SQLServer中,处理日期格式和查找特定日期格式方法示例在SQLServer中,处理日期格式和查找特定日期格式的记录是一个常见的需求。SQLServer提供了多种函数和格式选项来处理和比较日期。以下是一个详细的示例,展示了如何根据特定日期格式查......
  • 数据库系统------sql语句
    创建以上的图就是sql中创建表的大致使用方法啦,每一个椭圆或者圆就是sql固定的语法,然后矩形就是我们自己自定义的,然后箭头代表着输入的顺序,如果箭头又回到某个起始处,表示这可以是一个循环,比如定义多个列,以下就带大家一起走一遍这个流程吧我们按照这个图的输入顺序一个一个写ok,......
  • 简单说说MySQL中 SELECT 语句执行流程
    流程讲解MySQL中SELECT语句的执行流程分为多个步骤,通常从用户发出查询请求到MySQL返回结果包含以下过程:客户端/服务器通信:用户向MySQL服务器发送SELECT查询语句。查询解析(Parser):MySQL收到SQL语句后,会将查询语句进行词法和语法分析。词法分析器将SQL语句拆解为关键......
  • 关于建表字段是否该使用not null这个问题你怎么看?
    大家好,我是V哥,在数据库设计中,是否使用NOTNULL是一个非常重要的决策,直接影响数据完整性、查询性能以及业务逻辑的复杂度。使用NOTNULL的关键在于理解业务需求和具体场景。下面V哥通过一些场景来分析什么时候应该使用NOTNULL,什么时候允许NULL。一起聊聊经验之谈,望和兄弟......