From d903180e00476bac0a045be60e636a6e3a7638c4 Mon Sep 17 00:00:00 2001 From: Charon Date: Tue, 14 May 2024 20:09:27 +0800 Subject: [PATCH] =?UTF-8?q?Update=201.Kotlin=5F=E7=AE=80=E4=BB=8B&?= =?UTF-8?q?=E5=8F=98=E9=87=8F&=E7=B1=BB&=E6=8E=A5=E5=8F=A3.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...&\347\261\273&\346\216\245\345\217\243.md" | 44 +++++++++++-------- 1 file changed, 26 insertions(+), 18 deletions(-) diff --git "a/KotlinCourse/1.Kotlin_\347\256\200\344\273\213&\345\217\230\351\207\217&\347\261\273&\346\216\245\345\217\243.md" "b/KotlinCourse/1.Kotlin_\347\256\200\344\273\213&\345\217\230\351\207\217&\347\261\273&\346\216\245\345\217\243.md" index 72e4986b..6bd6e2fe 100644 --- "a/KotlinCourse/1.Kotlin_\347\256\200\344\273\213&\345\217\230\351\207\217&\347\261\273&\346\216\245\345\217\243.md" +++ "b/KotlinCourse/1.Kotlin_\347\256\200\344\273\213&\345\217\230\351\207\217&\347\261\273&\346\216\245\345\217\243.md" @@ -673,8 +673,8 @@ class Person{ } ``` -如果类有一个主构造函数,每个次构造函数都需要委托给主构造函数(不然会报错), 可以直接委托或者通过别的次构造函数间接委托。 -委托到同一个类的另一个构造函数用`this`关键字即可: +**如果类有一个主构造函数,每个次构造函数都需要委托给主构造函数(不然会报错), 可以直接委托或者通过别的次构造函数间接委托。 +委托到同一个类的另一个构造函数用`this`关键字即可:** ```kotlin class Person constructor(name: String) { constructor(name: String, surName: String) : this(name) { @@ -711,7 +711,7 @@ class Example(p: Int) : Base(p) ``` 如果该类有一个主构造函数,那么其基类型可以用主构造函数的参数进行初始化。 -如果该类没有主构造函数,那么每个次构造函数必须使用super关键字初始化其类型,或者委托给另一个构造函数初始化。如: +**如果该类没有主构造函数,那么每个次构造函数必须使用super关键字初始化其类型,或者委托给另一个构造函数初始化**。如: ```kotlin class Example : View { constructor(ctx: Context) : super(ctx) @@ -954,12 +954,12 @@ class User(val name: String, val age: Int) { } ``` -在上面的实例中,User类还有一个special函数,使用User::special可以获取成员函数的对象,然后使用invoke函数调用special函数,以获取该函数的内容。 +**在上面的实例中,User类还有一个special函数,使用User::special可以获取成员函数的对象,然后使用invoke函数调用special函数,以获取该函数的内容。** ### 构造函数引用 -构造函数的引用和属性、方法类似,构造函数可以作用于任何函数类型的对象,该函数的对象与构造函数的参数相同,可以使用::操作符加类名的方式来引用构造函数。 +**构造函数的引用和属性、方法类似,构造函数可以作用于任何函数类型的对象,该函数的对象与构造函数的参数相同,可以使用::操作符加类名的方式来引用构造函数。** ```kotlin class Foo @@ -1030,14 +1030,17 @@ class SuperPerson(num: Int) : Person(num) 请记住,即使你没有在父类中显式地添加构造函数,编译器也会在编译代码的时候自动创建一个空构造函数。 假如我们不想为Person类添加构造函数,因此编译器在编译代码的时候创建了一个空构造函数。该构造函数通过使用Person()被调用。 -注意: 上面在说到继承的时候`class SuperPerson(num: Int) : Person(num)`在父类后面必须加上括号,这是为了能够调用到父类的主构造函数。 -Kotlin中规定,当一个类既有主构造函数又有次构造函数时,所有的次构造函数都必须调用主构造函数(包括间接调用)。 -但是如果类没有主构造函数,那么每个次构造函数必须使用`super`关键字初始化其基类型,或委托给另一个构造函数做到这一点。 这里很特殊,在Kotlin -中是允许类中只有次构造函数,没有主构造函数的。当一个类没有显式的定义主构造函数且定义了次构造函数时,它就是没有主构造函数的。 -如果该类有一个主构造函数,其基类必须用基类型的主构造函数参数就地初始化。 +***注意: 上面在说到继承的时候`class SuperPerson(num: Int) : Person(num)`在父类后面必须加上括号,这是为了能够调用到父类的主构造函数。 +Kotlin中规定,当一个类既有主构造函数又有次构造函数时,所有的次构造函数都必须调用主构造函数(包括间接调用)。*** +***但是如果类没有主构造函数,那么每个次构造函数必须使用`super`关键字初始化其基类型,或委托给另一个构造函数做到这一点。 这里很特殊,在Kotlin +中是允许类中只有次构造函数,没有主构造函数的。当一个类没有显式的定义主构造函数且定义了次构造函数时,它就是没有主构造函数的。*** + +***如果该类有一个主构造函数,其基类必须用基类型的主构造函数参数就地初始化。*** + +***如果类没有主构造函数,那么每个次构造函数必须使用`super`关键字初始化其基类型,或委托给另一个构造函数做到这一点。*** + -如果类没有主构造函数,那么每个次构造函数必须使用`super`关键字初始化其基类型,或委托给另一个构造函数做到这一点。 注意,在这种情况下,不同的次构造函数可以调用基类型的不同的构造函数: ```kotlin @@ -1046,11 +1049,15 @@ class MyView : View { constructor(ctx: Context, attrs: AttributeSet) : super(ctx, attrs) } ``` -也就是MyView类的后面没有显式的定义主构造函数,同时又定义了次构造函数。所以现在MyView类是没有主构造函数的。那么既然没有主构造函数,继承View类 -的时候也就不需要再在View类后加上括号了。其实原因就是这么简单,只是很多人在刚开始学习Kotlin的时候没能理解这对括号的意义和规则,因此总感觉继承的 + +也就是MyView类的后面没有显式的定义主构造函数,同时又定义了次构造函数。所以现在MyView类是没有主构造函数的。 + +***那么既然没有主构造函数,继承View类的时候也就不需要再在View类后加上括号了。*** + +其实原因就是这么简单,只是很多人在刚开始学习Kotlin的时候没能理解这对括号的意义和规则,因此总感觉继承的 写法有时候要加上括号,有时候又不要加,搞得晕头转向的,而在你真正理解了规则之后,就会发现其实还是很好懂的。 -另外,由于没有主构造函数,次构造函数只能直接调用父类的构造函数,上述代码也是将this关键字换成了super关键字,这部分就很好理解了。 +***另外,由于没有主构造函数,次构造函数只能直接调用父类的构造函数,上述代码也是将this关键字换成了super关键字,这部分就很好理解了。*** ### Any @@ -1283,14 +1290,15 @@ Unit与Int一样,都是一种类型,然而它不代表任何信息,用面 ### 表达式函数体 -如果返回的结果可以使用一个表达式计算出来,你可以不使用括号而是使用等号: +***如果一个函数的返回的结果可以使用一个表达式计算出来,你可以不使用括号而是使用等号***: ```kotlin fun add(x: Int,y: Int) : Int = x + y // 省略了{} ``` -Kotlin支持这种单行表达式与等号的语法来定义函数,叫做表达式函数体,作为区分,普通的函数声明则可以叫做代码块函数体。如你所见,在使用表达式函数体 -的情况下我们可以不声明返回值类型,这进一步简化了语法。 +***Kotlin支持这种单行表达式与等号的语法来定义函数,叫做表达式函数体,作为区分,普通的函数声明则可以叫做代码块函数体。*** + +如你所见,在使用表达式函数体的情况下我们可以不声明返回值类型,这进一步简化了语法。 我们可以给参数指定一个默认值使的它们变的可选,这是非常有帮助的。这里有一个例子,在`Activity`中创建了一个函数用来`Toast`一段信息: @@ -1367,7 +1375,7 @@ val mList2 = vars(0, *myArray, 6, 7) ### 类布局 -通常,一个类的内容按以下顺序排列: +通常,一个类的内容按以下顺序排列: - 属性声明与初始化块 - 次构造函数