Android:Kotlin再探-Java异同

参考:Kotlin学习系列之:Kotlin的构造函数
官网
Kotlin中?和!!的区别
为什么Kotlin属性访问方式比Java的Get/Set方式好
对比Java,Kotlin的优点和缺点
kotlin - 实现静态的几种方式详解
Kotlin类型系统笔记
在这里插入图片描述
Kotlin 并没有 new 关键字

创建类的实例
要创建一个类的实例,我们就像普通函数一样调用构造函数:
val invoice = Invoice()

val customer = Customer("Joe Smith")

Kotlin的构造函数分为主构造器(primary constructor)和次级构造器(secondary constructor)
和Primary Constructor相比,很明显的一点,Secondary Constructor是定义在类体中。第二,Secondary Constructor可以有多个,而Primary Constructor只会有一个。

主
class 类名 constructor(形参1, 形参2, 形参3){}
class Person constructor(username: String, age: Int){
	private val username: String
	private var age: Int

	init{
		this.username = username
		this.age = age
	}
}

次
class User{
	private val username: String
	private var age: Int
		
	constructor(username: String, age: Int){
	    this.username = username
	    this.age = age
	}
}

关键字init:init{}它被称作是初始化代码块(Initializer Block),它的作用是为了Primary Constructor服务的,由于Primary Constructor是放置在类的首部,是不能包含任何初始化执行语句的,这是语法规定的,那么这个时候就有了init的用武之地,我们可以把初始化执行语句放置在此处,为属性进行赋值。

class Person constructor(username: String, age: Int){
	private val username: String
	private var age: Int

	init{
		this.username = username
		this.age = age
	}
}

与 Java 不同,Kotlin 对于可覆盖的成员(我们称之为开放)以及覆盖后的成员需要显式修饰符:

open class Base {
    open fun v() { ... }
    fun nv() { ... }
}
class Derived() : Base() {
    override fun v() { ... }
}

复写函数上必须加上 override 修饰符。如果没写,编译器将会报错。
标记为 override 的成员本身是开放的,也就是说,它可以在子类中覆盖。如果你想禁止再次覆盖,使用 final 关键字:


open class AnotherDerived() : Base() {
    final override fun v() { ... }
}

覆盖属性
属性覆盖与方法覆盖类似;在超类中声明然后在派生类中重新声明的属性必须以 override 开头,并且它们必须具有兼容的类型。每个声明的属性可以由具有初始化器的属性或者具有 getter 方法的属性覆盖。

open class Foo {
    open val x: Int get() { …… }
}
​
class Bar1 : Foo() {
    override val x: Int = ……
}

你也可以用一个 var 属性覆盖一个 val 属性,但反之则不行。这是允许的,因为一个 val 属性本质上声明了一个 getter 方法,而将其覆盖为 var 只是在子类中额外声明一个 setter 方法。

请注意,你可以在主构造函数中使用 override 关键字作为属性声明的一部分。

interface Foo {
    val count: Int
}
​
class Bar1(override val count: Int) : Foo
​
class Bar2 : Foo {
    override var count: Int = 0
}

kotlin 实现静态的方式:伴生对象
与 Java 或 C# 不同,在 Kotlin 中类没有静态方法。在大多数情况下,它建议简单地使用包级函数。

如果你需要写一个可以无需用一个类的实例来调用、但需要访问类内部的函数(例如,工厂方法),你可以把它写成该类内对象声明中的一员。

更具体地讲,如果在你的类内声明了一个伴生对象, 你就可以使用像在 Java/C# 中调用静态方法相同的语法来调用其成员,只使用类名作为限定符。

基本都是用一个静态对象来模拟 class 的静态属性和方法,目前有4种实现方式:

companion object - 伴随对象,声明单例的方式

@JvmField + @JvmStatic 注解 - 使用注解标签声明 static 的部分

object 单例 - 静态单例其实和 companion object 类似

const - 包内唯一性,脱离类的束缚,kotlin 的特性,在 java 中会编译生成一个 kotlin.kt 的文件专门对齐提供支持

companion object
companion object 伴随对象这是我们在 kotlin 中最常用的方式了吧,在 companion object 里面我们即可以声明属性,也可以声明方法,kotlin 中的调用方式感觉和 java 的 static 一样(直接类名点调用),举个例子看下面:

class BookKotlin {

    var name: String = "AA"

    fun speak() {}

    companion object instance {

        var nameStatic: String = "BB"

        fun speakStatic() {}

    }
}

如何把Kotlin代码转成java代码,如何把java代码转成kotlin代码

其实就是互转,以下基于IDEA或Android Studio

Java转Kotlin
打开要转的文件

方法1
Ctrl+Shift+Alt+K

方法2
Code - Convert Java File To Kotlin File

Kotlikn 转 Java
Tools>Kotlin>Show Kotlin Bytecode
Decompile
发布了72 篇原创文章 · 获赞 28 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/changhuzichangchang/article/details/97374598