1. 继承
java类使用extends继承1
2class MyClass extends BaseClass {
}
而kotlin使用冒号:继承1
2class MyClass : BaseClass() {
}
kotlin的class默认不允许被继承, 如果想要被继承,得要添加open关键字。
2.覆写方法
kotlin中方法也是默认不可覆写的,如果子类要覆写父类的方法,得要在父类的方法前面加open关键字,然后在子类的方法前加override1
2
3
4
5
6
7
8
9
10
11//父类
open class Person{
open fun getName(){}
}
//子类
class Girl : Person(){
override fun getName(){
super.getName()
}
}
3.接口
java和kotlin都使用interface关键字声明接口。但是二者实现接口方式不同。1
2
3
4
5//java使用implements实现接口
class MyClass implements A,B{}
//kotlin还是使用冒号:实现接口
class MyKotlin : A,B{}
kotlin中既然继承和实现接口都是使用冒号: 那同时继承和实现接口怎么写呢?1
class Girl : Person, A,B{}
接口中的属性和方法默认都是open的,不需要另外添加。
java中的接口的方法不能有方法体,但kotlin可以。1
2
3
4
5
6
7
8
9
10
11
12interface IPerson{
fun getName() : String
fun getAge() : Int{
return 18
}
}
class Man : IPerson {
override fun getName() : String{
return "张飞"
}
}
4.创建类的实例
java使用new关键字创建实例:1
User user = new User();
kotlin没有new关键字。直接创建即可:1
var user = User()
5.构造函数
在Kotlin中,主构造函数是类头的一部分:它跟在类名后1
2class User constructor(userName: String) {
}
如果主构造函数没有任何注解或者可见性修饰符,可以省略这个 constructor 关键字1
2class User(userName: String) {
}
Kotlin的主构造函数不能包含任何的代码。初始化的代码可以放到以 init 关键字作为前缀的代码块中1
2
3
4
5class User(userName: String) {
init {
//...
}
}
Kotlin的次构造函数前面必须加constructor关键字1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25class User(userName: String) {
//主构造函数的实现部分
init {
println(userName)
}
//次构造函数,可通过this调主构造函数
constructor() : this("czh")
//次构造函数,可通过this调主构造函数
constructor(age: Int) : this("czh") {
println(age)
}
//次构造函数,通过this调主构造函数
constructor(sex: String, age: Int) : this("czh") {
println("$sex$age")
}
}
//实例化User
User()
User("Czh")
User(2)
User("男",22)
6.可见性修饰符
java有public, protected, default, private 4个可见性修饰符。
kotlin有: internal, public, protected, private 4个修饰符
与Java可见性修饰符的可见性修饰符不同的是,多了一个internal,少了一个default。 internal 意味着该成员只在相同模块内可见。更具体地说, 一个模块是编译在一起的一套 Kotlin 文件
7.嵌套类
嵌套类指的是在类中定义的类,如下所示: Java中的嵌套类1
2
3
4
5
6
7class Dialog{
String title;
static class Builder{
}
}
Dialog.Builder builder = new Dialog.Builder();
kotlin使用inner关键字声明嵌套类1
2
3
4
5
6
7
8class Dialog{
var title = ""
inner class Builder{
}
}
var builder = Dialog().Builder()
//var builder : Dialog.Builder = Dialog().Builder()
8. 调用属性
java中需要加上get,set方法才可以调用属性,而且开发工具有专门的菜单键来生成getter,setter方法
但kotlin中不需要1
2
3
4
5
6class Student{
var name : String = ""
var age = 18
}
Student().name //相当于getName
Student().age = 17 //相当于setAge
当然,kotlin也支持在类中显示定义get,set方法,这里就不展开了。
9.数据类
kotlin中存在数据类这一概念,相当于Java中的实体bean,model
kotlin中使用data关键字标识数据类:1
data class Student(var name : String, var age : Int)
创建数据类需要注意的是:
主构造方法至少要有一个参数,且参数必须标记为val或var
数据类不能用open、abstract、sealed(封闭类)、inner标识
声明一个类为数据类后,除了可以直接使用属性外,还能调用copy函数。
简单解释一下copy()函数。在很多情况下,我们需要复制一个对象改变它的一些属性,但其余部分保持不变。 copy() 函数就是为此而生成。举个例子:1
2
3
4var user = User("张三", 22)
var user1 = user.copy(age = 23)
Toast.makeText(this, user1.toString(), Toast.LENGTH_SHORT).show()
可以看到姓名还是张三,但年龄为23
10. 函数的参数
kotlin的函数支持默认参数,若调用时不指定参数,就会使用默认参数,而java并不支持默认参数。1
2
3
4
5
6
7//给i指定默认值为1
fun foo(str: String, i: Int = 1) {
println("$str $i")
}
//调用该函数,这个时候可以只传一个参数
foo("abc")
//运行代码,得到结果为: abc 1
但是如果将默认值参数放到无默认值参数前,以上方式就会出错。还是上面代码,只是修改了foo方法参数位置:1
2
3
4
5
6
7
8//给i指定默认值为1
fun foo(i: Int = 1, str: String) {
println("$str $i")
}
foo("abc") //编译错误
foo(str = "hello") //编译通过,要使用参数的命名来指定值
//运行代码,得到结果为: hello 1
上面这个情况也叫 命名参数
可变数量的参数: 函数的参数可以用 vararg 修饰符标记,表示允许将可变数量的参数传递给函数,如下所示:1
2
3
4
5
6
7
8
9
10
11
12//用 vararg 修饰符标记参数
fun <T> asList(vararg ts: T): List<T> {
val result = ArrayList<T>()
for (t in ts) // ts is an Array
result.add(t)
return result
}
val a = arrayOf(1, 2, 3)
//*a代表把a里所有元素
val list = asList(-1, 0, *a, 4)
//运行代码,得到结果为: [-1, 0, 1, 2, 3, 4]
11.单表达式函数
kotlin中,如果函数体只有一条语句且有返回值,那么可以省略函数体大括号,变成单表达式函数:1
2
3
4
5
6//函数体只有一条语句并且有返回值
fun getName() : String{
return "张三"
}
//这时可以省略大括号,变成单表达式函数
fun getName() = "张三"
12.局部函数
kotlin支持在函数中嵌套定义另一个函数,嵌套在里面的函数称为局部函数:1
2
3
4
5
6
7
8
9
10fun test(){
Log.e("a", "-1-")
fun testInside(){
Log.e("a", "-2-")
}
testInside()
}
//调用test方法
test()