Skip to content

Commit 3b38b25

Browse files
committed
update kotlin parts
1 parent 6fa4a0e commit 3b38b25

4 files changed

Lines changed: 173 additions & 43 deletions

File tree

JavaKnowledge/Java基础面试题.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ Java基础面试题
2626
```
2727
另外,我个人通常并不使用标号这种方式,而是让外层的循环条件表达式的结果可以受到里层循环体代码的控制,例如,要在二维数组中查找到某个数字。
2828
```java
29-
int arr[][] = {{1,2,3},{4,5,6,7},{9}};
29+
int arr[][] = ...;
3030
boolean found = false;
3131
for(int i=0;i<arr.length && !found;i++) {
3232
for(int j=0;j<arr[i].length;j++) {

KotlinCourse/Kotlin学习教程(一).md

Lines changed: 55 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,13 @@ Kotlin学习教程(一)
55

66
`5月18`日谷歌在`I/O`开发者大会上宣布,将`Kotlin`语言作为安卓开发的一级编程语言。并且会在`Android Studio 3.0`版本全面支持`Kotlin`
77

8-
- `Kotlin`是一个基于`JVM`的新的编程语言,由`JetBrains`开发。`JetBrains`作为目前广受欢迎的`Java IDE IntelliJ`的提供商,在`Apache`许可下已经开源其`Kotlin`编程语言。
8+
- `Kotlin`是一个基于`JVM`的新的编程语言,由[JetBrains](https://www.jetbrains.com/)开发。`JetBrains`作为目前广受欢迎的`Java IDE IntelliJ`的提供商,在`Apache`许可下已经开源其`Kotlin`编程语言。
99
- `Kotlin`可以编译成`Java`字节码,也可以编译成`JavaScript`,方便在没有`JVM`的设备上运行。
1010
- `Kotlin`已正式成为`Android`官方开发语言。
1111

1212
[Kotlin官网](https://kotlinlang.org/)
1313

14+
`JetBrains`这家公司非常牛逼,开发了很多著名的软件,他们在使用`Java`的过程中发现`java`比较笨重不方便,所以就开发了`kotlin``kotlin`是一种全栈的开发语言,可以用它进行开发`web``web`后端、`Android`等。
1415

1516
很多开发者都说`Google`学什么不好,非要学苹果,出个`android``swift`版本,一定会搞不起来没人用,所以不用浪费时间去学习。在这里想引用马云的一句话:
1617
> 拥抱变化
@@ -28,6 +29,23 @@ Kotlin学习教程(一)
2829
- `Kotlin`在代码中很少需要在代码中指定类型,因为编译器可以在绝大多数情况下推断出变量或是函数返回值的类型。这样就能获得两个好处:简洁与安全
2930

3031

32+
### `Kotlin`优势
33+
34+
- 全面支持`Lambda`表达式
35+
- 数据类`Data classes`
36+
- 函数字面量和内联函数`Function literals & inline functions`
37+
- 函数扩展`Extension functions`
38+
- 空安全`Null safety`
39+
- 智能转换`Smart casts`
40+
- 字符串模板`String templates`
41+
- 主构造函数`Primary constructors`
42+
- 类委托`Class delegation`
43+
- 类型推判`Type inference`
44+
- 单例`Singletons`
45+
- 声明点变量`Declaration-site variance`
46+
- 区间表达式`Range expressions`
47+
48+
3149
上面说简洁简洁,到底简洁在哪里?这里先用一个例子开始,在`Java`开发过程中经常会写一些`Bean`类:
3250
```java
3351
package com.charon.kotlinstudydemo;
@@ -110,7 +128,7 @@ import android.os.Bundle
110128
// 定义类,继承AppCompatActivity
111129
class MainActivity : AppCompatActivity() {
112130

113-
// 重写方法用overide,函数名用fun声明 参数是a: 类型的形式 ?是啥?它是指明该对象可能为null
131+
// 重写方法用overide,函数名用fun声明 参数是a: 类型的形式 ?是啥?它是指明该对象可能为null,如果有了?那在调用该方法的时候参数可以传递null进入,如果没有?传递null就会报错
114132
override fun onCreate(savedInstanceState: Bundle?) {
115133
// super
116134
super.onCreate(savedInstanceState)
@@ -145,43 +163,44 @@ var weight = 70.5 // double
145163
```
146164

147165
`Kotlin`中,一切都是对象。没有像`Java`中那样的原始基本类型。
148-
当然,像`Integer``Float`或者`Boolean`等类型仍然存在,但是它们全部都会作为对象存在的。基本类型的名字和它们工作方式都是与`Java`非常相似的,但是有一些不同之处你可能需要考虑到:
166+
当然,像`Integer``Float`或者`Boolean`等类型仍然存在,但是它们全部都会作为对象存在的。基本类型的名字和它们工作方式都是与`Java`非常相似的,但是有一些不同之处你可能需要考虑到:
149167

150168
- 数字类型中不会自动转型。举个例子,你不能给`Double`变量分配一个`Int`。必须要做一个明确的类型转换,可以使用众多的函数之一:
151169

152-
```kotlin
153-
private var age = 18
154-
private var weight = age.toFloat()
155-
```
156-
- 字符(`Char`)不能直接作为一个数字来处理。在需要时我们需要把他们转换为一个数字:
157-
```kotlin
158-
val c: Char='c'
159-
val i: Int = c.toInt()
160-
```
161-
- 位运算也有一点不同。在`Android`中,我们经常在`flags`中使用``:
162-
163-
```java
164-
// Java
165-
int bitwiseOr = FLAG1 | FLAG2;
166-
int bitwiseAnd = FLAG1 & FLAG2;
167-
```
168-
169-
```kotlin
170-
// Kotlin
171-
val bitwiseOr = FLAG1 or FLAG2
172-
val bitwiseAnd = FLAG1 and FLAG2
173-
```
174-
175-
- 一个`String`可以像数组那样访问,并且被迭代:
176-
```kotlin
177-
var s = "charon"
178-
var c = s[2]
179-
180-
for (a in s) {
181-
Log.e("@@@", a +"");
182-
}
183-
184-
```
170+
```kotlin
171+
private var age = 18
172+
private var weight = age.toFloat()
173+
```
174+
- 字符(`Char`)不能直接作为一个数字来处理。在需要时我们需要把他们转换为一个数字:
175+
176+
```kotlin
177+
val c: Char='c'
178+
val i: Int = c.toInt()
179+
```
180+
- 位运算也有一点不同。在`Android`中,我们经常在`flags`中使用``:
181+
182+
```java
183+
// Java
184+
int bitwiseOr = FLAG1 | FLAG2;
185+
int bitwiseAnd = FLAG1 & FLAG2;
186+
```
187+
188+
```kotlin
189+
// Kotlin
190+
val bitwiseOr = FLAG1 or FLAG2
191+
val bitwiseAnd = FLAG1 and FLAG2
192+
```
193+
194+
- 一个`String`可以像数组那样访问,并且被迭代:
195+
196+
```kotlin
197+
var s = "charon"
198+
var c = s[2]
199+
200+
for (a in s) {
201+
Log.e("@@@", a +"");
202+
}
203+
```
185204

186205

187206
##### 编译期常量

KotlinCourse/Kotlin学习教程(五).md

Lines changed: 73 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,11 +99,28 @@ outter.Inner().execute()
9999
匿名内部类
100100

101101
```kotlin
102+
// 通过对象表达式来 创建匿名内部类的对象,可以避免重写抽象类的子类和接口的实现类,这和Java中匿名内部类的是接口和抽象类的延伸一致。
102103
text.setOnClickListener(object : View.OnClickListener{
103104
override fun onClick(p0: View?) {
104105
Log.d("test", p0.string())
105106
}
106107
})
108+
109+
110+
mViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
111+
override fun onPageScrollStateChanged(state: Int) {
112+
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
113+
}
114+
115+
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
116+
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
117+
}
118+
119+
override fun onPageSelected(position: Int) {
120+
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
121+
}
122+
123+
})
107124
```
108125

109126

@@ -172,6 +189,17 @@ val s = when(x){
172189
val s = try { x as String } catch(e: ClassCastException) { null }
173190
```
174191

192+
### 对象`(Object)`
193+
194+
声明对象就如同声明一个雷,你只需要用保留字`object`替代`class`,其他都相同。只需要考虑到对象不能有构造函数,因为我们不调用任何构造函数来访问它们。
195+
事实上,对象就是具有单一实现的数据类型。
196+
197+
```kotlin
198+
object Resource {
199+
val name = "Name"
200+
}
201+
```
202+
175203
### 单例
176204

177205
```kotlin
@@ -180,6 +208,50 @@ object Resource {
180208
}
181209
```
182210

211+
因为对象就是具有单一实现的数据类型,所以在`kotlin`中对象就是单例。
212+
对象的实例在我们第一次使用时,被创建。所以这里有一个懒惰实例化:如果一个对象永远不会被使用,这个实例永远不会被创建。
213+
214+
### 对象表达式
215+
216+
对象也能用于创建匿名类实现。
217+
218+
```java
219+
recycler.adapter = object : RecyclerView.Adapter() {
220+
override fun onBindViewHolder(holder: RecyclerView.ViewHolder?, position: Int) {
221+
}
222+
223+
override fun getItemCount(): Int {
224+
}
225+
226+
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): RecyclerView.ViewHolder {
227+
}
228+
}
229+
```
230+
例如,每次想要创建一个接口的内联实现,或者扩展另一个类时,你将使用上面的符号。
231+
232+
233+
### 伴生对象`(Companion Object)`
234+
235+
每个类都可以实现一个伴生对象,它是该类的所有实例共有的对象。它将类似于`Java`中的静态字段。
236+
```java
237+
class App : Application() {
238+
companion object {
239+
lateinit var instance: App
240+
private set
241+
}
242+
243+
override fun onCreate() {
244+
super.onCreate()
245+
instance = this
246+
}
247+
}
248+
```
249+
250+
在这例子中,创建一个由`Application`扩展的(派送)的类,并且在`companion object`中存储它的唯一实例。
251+
`lateinit`表示这个属性开始是没有值得,但是,在使用前将被赋值(否则,就会抛出异常)。
252+
`private set`用于说明外部类不能对其进行赋值。
253+
254+
183255
### 委托(代理)
184256

185257
##### 类委托
@@ -215,8 +287,7 @@ BaseImpl -> 5
215287

216288
##### 属性委托
217289

218-
语法是`val/var <属性名>: <类型> by <表达式>`。在`by`后面的表达式是该委托,因为属性对应的`get()``set()`会被委托给它的`getValue()``setValue()`方法。 属性的委托不必实现任何的接口,但是需要提供一个`getValue()`函数(和`setValue()`——对于`var属性)。
219-
290+
语法是`val/var <属性名>: <类型> by <表达式>`。在`by`后面的表达式是该委托,因为属性对应的`get()``set()`会被委托给它的`getValue()``setValue()`方法。 属性的委托不必实现任何的接口,但是需要提供一个`getValue()`函数(和`setValue()`——对于`var`属性)。
220291

221292
```kotlin
222293
class Example {

KotlinCourse/Kotlin学习教程(四).md

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
Kotlin学习教程()
1+
Kotlin学习教程()
22
===
33

44

@@ -282,6 +282,26 @@ studentArray[0] = Student("james")
282282
`Kotlin`没有专门的语法结构创建`list``set`。要用标准库的方法如`listOf()``mutableListOf()``setOf()``mutableSetOf()`。创建`map`可以用`mapOf(a to b, c to d)`
283283

284284
```kotlin
285+
fun main(args : Array<String>) {
286+
var lists = listOf("a", "b", "c")
287+
for(list in lists) {
288+
println(list)
289+
}
290+
}
291+
```
292+
293+
```kotlin
294+
fun main(args : Array<String>) {
295+
var map = TreeMap<String, String>()
296+
map["0"] = "0 haha"
297+
map["1"] = "1 haha"
298+
map["2"] = "2 haha"
299+
300+
println(map["1"])
301+
}
302+
```
303+
304+
```kotlin
285305
val numbers: MutableList<Int> = mutableListOf(1, 2, 3)
286306
val readOnlyView: List<Int> = numbers
287307
println(numbers) // 输出 "[1, 2, 3]"
@@ -311,7 +331,7 @@ value2 = null // 编译能通过
311331
```kotlin
312332
var str : String? = null
313333
str.length // 编译不错误
314-
str?.length // 编译能通过
334+
str?.length // 编译能通过,这表示如果str不为空的时候执行length方法
315335
```
316336

317337
那么问题来了,我们知道在`java``String.length`返回的是`int`,上面的`str?.length`既然编译通过了,那么它返回了什么?我们可以这么写:
@@ -449,7 +469,15 @@ loop@ for (i in 1..100) {
449469

450470
### Ranges
451471

452-
`Range`表达式使用一个`..`操作符。
472+
`Range`表达式使用一个`..`操作符。表示就是一个该范围内的数据的数组,包含头和尾
473+
474+
```kotlin
475+
var nums = 1..100
476+
for(num in nums) {
477+
println(num)
478+
// 打印出1 2 3 ....100
479+
}
480+
```
453481

454482
```kotlin
455483
if(i >= 0 && i <= 10)
@@ -458,7 +486,7 @@ if(i >= 0 && i <= 10)
458486
转换成
459487

460488
```kotlin
461-
if (i in 0..10)
489+
if (i in 0..10)
462490
println(i)
463491
```
464492
Ranges默认会自增长,所以如果像以下的代码:
@@ -478,6 +506,18 @@ for (i in 1..4 step 2) println(i)
478506
for (i in 4 downTo 1 step 2) println(i)
479507
```
480508

509+
### Until
510+
511+
上面的`Range`是包含了头和尾,那如果只想包含头不包含尾呢? 就要用`until`
512+
513+
```kotlin
514+
var nums = 1 until 100
515+
for(num in nums) {
516+
println(num)
517+
// 这样打印出来是1 2 3 .....99
518+
}
519+
```
520+
481521

482522
---
483523

0 commit comments

Comments
 (0)