参考: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