Koltin 语言与Java语言有哪些差异?

本文详细比较了Kotlin与Java在变量声明、方法定义、逻辑控制、继承、接口实现以及数据类使用上的差异,强调了Kotlin中val和var的区分,以及数据类自动生成的相关函数。
摘要由CSDN通过智能技术生成

目录

1. 变量声明方式不同

2. 方法(函数)定义略有不同

3. 逻辑控制关键字 if 的使用区别

4. 继承的区别

5. 接口和实现的区别

6. Koltin 的数据类有什么用?


1. 变量声明方式不同

Koltin声明变量的方式与Java类似,但是顺序不太一样。

举例如下

Java声明一个不可变String:final String name;

Java声明一个可变String:String name;

总结就是 变量修饰符(可选)  变量类型 变量名

Koltin声明一个不可变String:val name String;

Koltin声明一个可变String:var name String;

补充说明:val(value的简写),声明一个变量不可变,与Java中的final修饰类似;

var(variable的简写),声明一个变量可变,即不被final修饰;

总结就是 变量修饰符(可选) 变量名 变量类型

也可以看出,Java与Koltin声明变量最大的区别就是变量名和变量类型顺序换了一下;

2. 方法(函数)定义略有不同

Java中的方法定义方式

方法修饰符 方法返回值 方法名(参数1类型 参数1名称,参数2类型 参数2名称,......){方法体}

Koltin 中方法定义方式

fun(固定位fun,function的缩写) 方法名 (参数1名称 参数1类型,参数2名称 参数2类型,......):方法返回值类型{方法体}

3. 逻辑控制关键字 if 的使用区别

Koltin语言中 if 关键字比Java语言中多了一个功能,它可以有返回值,很好理解,举例如下

// fun定义一个方法,名为largeNumber,方法返回较大的一个数
// 参数分别为 Int 类型的num1和Int类型的num2,方法返回值类型也为Int
fun largerNumber(num1: Int, num2: Int): Int {
// if 可以有返回值,返回较大的一个数,定义一个val不可变参数value接收
    val value  = if (num1 > num2) {
        num1
    } else {
        num2
    }
// 返回参数 value
    return value
}

4. 继承的区别

Java中,继承使用关键字 "extend",只要一个类没有被 final 修饰,默认就是可以被继承的。

继承方式为 子类 extend 父类

// 定义父类Person人
public class Person{
}
// 定义Student学生类继承Person人类
public class Student extend Person{
}

Koltin中,继承关键字要使用 "open",只有被"open"关键字修饰的类可以被继承,继承格式为

子类:父类()

举例如下:

// 定义Father父类,切被open修饰
open class Father {
}
// 父类Father被open修饰,子类Son可以继承Father
// 继承格式为 子类:父类()
class Son : Father(){
}

5. 接口和实现的区别

Java中接口关键字为 "interface",Koltin中接口关键字也为"interface"

Java的接口实现比较简单,这里就不举例说明了,Koltin接口实现的方式如下图

// 使用 interface 定义一个接口
interface Person {

// 定义两个变量 name 和 age,但是一般很少在接口中定义变量,只会定义接口方法,
// 这里我只是举例说明
    var name: String
    var age: Int

// 定义一个sayHell()接口方法,该方法无返回值
    fun sayHello()

// 定义一个有返回值的接口方法largeNumber,方法返回值为Int
    fun largeNumber(num1: Int, num2: Int): Int
}

// 子类Student实现重写父接口Person中定义的方法
class Student : Person {
// override 重写父类中定义的name和age
    override var name: String = "Tom"
    override var age: Int = 18

// override重写sayHello() 方法
    override fun sayHello() {
        println("$name is $age years old, say hello")
    }

// override 重写largeNumber
    override fun largeNumber(num1: Int, num2: Int): Int{
        val value  = if (num1 > num2) {
        num1
    } else {
        num2
    }
    return value
    }
}

6. Koltin 的数据类有什么用?

Koltin 中的数据类非常类似于Java中的JavaBean,但是比JavaBean要简化的多,它只需要在类的前面定义一个 "data",即可标记该类为数据类,如下代码所示

data class 类名(
    var param1:数据类型,
    var param2:数据类型,
    ......
){// 没有结构体的时候,该大括号可以省略}

当我们声明了一个数据类之后,编译器会帮我们做以下几件事

(1)生成equals()函数与hasCode()函数;

(2)生成toString()函数,由类名(参数1 = 值1,参数2 = 值2,....)构成;

(3)由所定义的属性自动生成component1()、component2()、...、componentN()函数,其对应于属性的声明顺序;

(4)copy()函数;

这里主要说一下componentN() 和 copy() 函数,很简单,它其实就是Java中的 get方法,set 方法。

下面我用代码来举例说明

Java代码定义一个User类,并定义name和pwd两个属性,如下所示

// 定义一个 User 用户类,并定义 name 和age 两个变量
public class User {
    private String name;
    private String pwd;
 // 添加无参构造器
    public User(){}
 // 添加全参构造器
    public User(String name, String pwd) {
        this.name = name;
        this.pwd = pwd;
    }
 // 生成每个属性变量的getter和setter方法
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public String getPwd() {
        return pwd;
    }
 
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
 // 生成toString方法
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                '}';
    }
}

可以看到,JavaBean代码的实体类代码量很大,显得很臃肿,也许有些同学会说我可以在类上标记@Data,@Gatter,@Setter注解省很多事情。

也许你很急,但别急,我们看一下Koltin语言实现同样的效果有多简单

Koltin 定义User用户类,并定义name和age两个属性

data class User(val name : String, val pwd : String)

OK,一行代码搞定,是不是很简单

然后我们在来说刚才的 componentN() 和 copy() 函数怎么用

copy函数举例:

// 定义
val user1 = User("kotlin","123456")
println(user1)

// 使用copy函数修改name属性的值
val newUser1 = user1.copy(name = "new Kotlin")
println(newUser1)

copy函数,类似Java的setter方法,括号内要对当前对象哪个属性做修改,直接写 属性名 = "要修改的值" 即可。

componentN() 函数举例:

val user1 = User("kotlin","123456")
println(user1.component1());
println(user1.component2());

控制台输出结果为

koltin

123456

简单来说,Kotlin中定义一个数据类,则系统会默认自动根据参数的个数生成component1() ... componentN()函数。

componentN()函数就是用于解构声明的,现在我们的数据了共定义了name和pwd两个属性.

对应着,函数component1()获取到的就是第一个属性name;

函数component2()获取到的就是第二个属性pwd;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值