Skip to content

Commit

Permalink
Update 1.Kotlin_简介&变量&类&接口.md
Browse files Browse the repository at this point in the history
  • Loading branch information
CharonChui authored May 14, 2024
1 parent 3aa5408 commit d903180
Showing 1 changed file with 26 additions and 18 deletions.
44 changes: 26 additions & 18 deletions KotlinCourse/1.Kotlin_简介&变量&类&接口.md
Original file line number Diff line number Diff line change
Expand Up @@ -673,8 +673,8 @@ class Person{
}
```
如果类有一个主构造函数,每个次构造函数都需要委托给主构造函数(不然会报错), 可以直接委托或者通过别的次构造函数间接委托。
委托到同一个类的另一个构造函数用`this`关键字即可:
**如果类有一个主构造函数,每个次构造函数都需要委托给主构造函数(不然会报错), 可以直接委托或者通过别的次构造函数间接委托。
委托到同一个类的另一个构造函数用`this`关键字即可:**
```kotlin
class Person constructor(name: String) {
constructor(name: String, surName: String) : this(name) {
Expand Down Expand Up @@ -711,7 +711,7 @@ class Example(p: Int) : Base(p)
```
如果该类有一个主构造函数,那么其基类型可以用主构造函数的参数进行初始化。
如果该类没有主构造函数,那么每个次构造函数必须使用super关键字初始化其类型,或者委托给另一个构造函数初始化。如:
**如果该类没有主构造函数,那么每个次构造函数必须使用super关键字初始化其类型,或者委托给另一个构造函数初始化**。如:
```kotlin
class Example : View {
constructor(ctx: Context) : super(ctx)
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -1283,14 +1290,15 @@ Unit与Int一样,都是一种类型,然而它不代表任何信息,用面
### 表达式函数体
如果返回的结果可以使用一个表达式计算出来,你可以不使用括号而是使用等号:
***如果一个函数的返回的结果可以使用一个表达式计算出来,你可以不使用括号而是使用等号***:
```kotlin
fun add(x: Int,y: Int) : Int = x + y // 省略了{}
```
Kotlin支持这种单行表达式与等号的语法来定义函数,叫做表达式函数体,作为区分,普通的函数声明则可以叫做代码块函数体。如你所见,在使用表达式函数体
的情况下我们可以不声明返回值类型,这进一步简化了语法。
***Kotlin支持这种单行表达式与等号的语法来定义函数,叫做表达式函数体,作为区分,普通的函数声明则可以叫做代码块函数体。***
如你所见,在使用表达式函数体的情况下我们可以不声明返回值类型,这进一步简化了语法。
我们可以给参数指定一个默认值使的它们变的可选,这是非常有帮助的。这里有一个例子,在`Activity`中创建了一个函数用来`Toast`一段信息:
Expand Down Expand Up @@ -1367,7 +1375,7 @@ val mList2 = vars(0, *myArray, 6, 7)
### 类布局
通常,一个类的内容按以下顺序排列
通常,一个类的内容按以下顺序排列:
- 属性声明与初始化块
- 次构造函数
Expand Down

0 comments on commit d903180

Please sign in to comment.