1. var 和 val
var理解成java中的变量,val理解成被 final 修饰的常量。
var id1 : String = "vicent"
id1 = "sfa"
val id2 : String = "112erf"
id2 = "dfs"http:// 会 报错
fun main() {
// kotlin 的安全设计对于声明可为空的参数,在使用时要进行空判断处理
// 有两种处理方式:字段后加!!像java一样抛出空异常,另一种字段后加?
var info: String?= null
// println(info?.length)// 为空不执行后面的代码
// println(info!!.length)// 自己负责info, == java
println(test("b"))
// 如果一定要输出null 就输出 "你狠牛逼"
println(info?.length ?: "你狠牛逼")
}
// : int? == 允许返回null
fun test(name : String) : Int? {
if (name == "a") {
return 100
}
return null
}
类型推导
var name2 = "vicent"http:// 类型推倒
var name3 = 18
var name4 = 'A'
2. 函数
// void == : Unit 可以不写Unit
fun main() : Unit {
println(add2(1, 4))
lenMethod(1,2,3)
}
fun add(number1: Int, number2: Int) : Int {
return number1 + number2
}
// 类型推导
fun add2(number1: Int, number2: Int) = number1 + number2
fun lenMethod(vararg value : Int) {// 可变参数
for (i in value) {
println(i);
}
}
3. 字符串模板
var name = "张三"
var name2 = 18
var name3 = 'A'
println("name:$name, name2:$name2, name3=$name3")
// 换行
val infoMsg = """
AAAA
BBBB
ccccc
ddddddd
""".trimIndent()// 去掉这个之后会有前置空格
println(infoMsg)
4. NULL检查机制
// kotlin 的安全设计对于声明可为空的参数,在使用时要进行空判断处理
// 有两种处理方式:字段后加!!像java一样抛出空异常,另一种字段后加?
var info: String?= null
println(info?.length)// 为空不执行后面的代码
println(info!!.length)// 自己负责info, == java
5. in 区间
fun main() {
for (i in 1..9) {
// println(i)
}
// 不会输出
for (i in 9..1) {
// println(i)
}
for (i in 9 downTo 1) {
// println(i)
}
// 区间判断
val value = 9
if (value in 1..100) {
// println("包含了")
}
// 指定步长
for (i in 1..20 step 2) {
println(i)
}
// 排除最后元素
for (i in 1 until 10) {
println(i)
}
}
6. 比较两个值
fun main() {
var name1: String = "张三"
var name2: String = "张三"
println(name1.equals(name2))
println(name1==name2) // 推荐使用
// 比较对象地址 ===
var age1:Int? = 10000
var age2:Int? = 10000
println(age1 === age2)// false
}
7. 数组
fun main() {
val numbers = arrayOf(1,2,4,5)
for (i in numbers) {
println(i)
}
val number2 = Array(10, {value: Int -> (value + 100) })
for (value in number2) {
println(value)
}
}
8. if 条件判断
fun main() {
val number1: Int = 99
val number2: Int = 88
val maxValue = if (number1 > number2) number1 else number2
println(maxValue)
val number = 5
when (number) {
1 -> println("11")
2 -> println("22")
3 -> println("33")
4 -> println("44")
5 -> println("55")
else -> println("其他")
}
when (number) {
in 1..100 -> println("11")
in 101..200 -> println("22")
else -> println("其他")
}
val result = when (number) {
1 -> {
println("很开心")
"今天是星期一"
}
2 -> {
println("很开心")
"今天是星期二"
}
else -> "其他"
}
println(result)
}
9. 循环和标签
fun main() {
abcd@for (i in 1..10) {
for (j in 1..10) {
println("i:$i, j:$j")
if (i == 5) {
// break
break@abcd
}
}
}
var items = listOf<String>("aa", "bb", "cc")
for (item in items) {
// println(item)
}
// items.forEach { println(it) }
// 下标
for (index in items.indices) {
}
}
// 自带的标签
class Dayang {
val I = "aaa"
fun show() {
println(I)
println(this.I)
println(this@Dayang.I)
}
}
10. 类
// 默认 public final class person 不能被集成,在class前面加上open就可以被集成
class Person(id : Int) {// 主构造
// 次构造 必须委托给主构造
constructor(id: Int, name : String) : this(id) {
}
// 次构造
constructor(id: Int, sex : Char) : this(id) {
}
}
Java 单例模式和Kotlin单例模式对比
Java
public class NetManager {
static class Holder {
private static NetManager instance = new NetManager();
}
public static NetManager getInstance() {
return Holder.instance;
}
}
Kotlin
class NetManager {
// 被objec 修饰的类 只实例一次 不需要()
object Holder {
val instance = NetManager()
}
// 派生操作 类被创建的时候一起被创建 看不到 static
companion object {
// 全部都是 相当于 Java static
fun getInstance() : NetManager = Holder.instance;
}
}
懒汉式单例Java
public class NetManager2 {
private static NetManager2 instance = null;
public static NetManager2 getInstance() {
if (instance == null) {
instance = new NetManager2();
}
return instance;
}
}
kotlin
class NetManager {
companion object {
private var instance : NetManager?= null
fun getInstance() : NetManager {
if (instance == null) {
instance = NetManager();
}
return instance!!;
}
}
}
内部类和嵌套类
class Test {
val I = "aaaa"
// 这个不是内部类是嵌套类
class Sub {
fun show() {
println(I);// 会报错
}
}
// inner修饰内部类
inner class Sub2 {
fun show() {
println(I);// 会报错
}
}
}
实例类,so easy, 相当于java bean,会默认帮我们创建get set方法,以及toString equals copy 等方法
data class User(val id: Int, val name : String)
public final class User {
private final int id;
@NotNull
private final String name;
public final int getId() {
return this.id;
}
@NotNull
public final String getName() {
return this.name;
}
public User(int id, @NotNull String name) {
Intrinsics.checkParameterIsNotNull(name, "name");
super();
this.id = id;
this.name = name;
}
public final int component1() {
return this.id;
}
@NotNull
public final String component2() {
return this.name;
}
@NotNull
public final User copy(int id, @NotNull String name) {
Intrinsics.checkParameterIsNotNull(name, "name");
return new User(id, name);
}
// $FF: synthetic method
public static User copy$default(User var0, int var1, String var2, int var3, Object var4) {
if ((var3 & 1) != 0) {
var1 = var0.id;
}
if ((var3 & 2) != 0) {
var2 = var0.name;
}
return var0.copy(var1, var2);
}
@NotNull
public String toString() {
return "User(id=" + this.id + ", name=" + this.name + ")";
}
public int hashCode() {
int var10000 = this.id * 31;
String var10001 = this.name;
return var10000 + (var10001 != null ? var10001.hashCode() : 0);
}
public boolean equals(@Nullable Object var1) {
if (this != var1) {
if (var1 instanceof User) {
User var2 = (User)var1;
if (this.id == var2.id && Intrinsics.areEqual(this.name, var2.name)) {
return true;
}
}
return false;
} else {
return true;
}
}
}