Android Kotlin 用法对比Java使用小结
Android Kotlin 用法对比Java使用小结
文章目录
- Android Kotlin 用法对比Java使用小结
- **一、基础语法对比**
- 1. **变量声明**
- 2. **空安全**
- 3. **函数 / 方法**
- **二、类与对象**
- 1. **类定义与继承**
- 2. **接口与实现**
- **三、集合与 Lambda 表达式**
- 1. **集合操作**
- 2. **Lambda 表达式**
- **四、Android 开发特有功能**
- 1. **布局文件绑定**
- 2. **协程(异步编程)**
- 3. **扩展函数**
- **五、空安全与异常处理**
- 1. **空安全特性**
- 2. **异常处理**
- **六、性能与互操作性**
- **七、总结与建议**
- PS:学习这东西任何时候都不算晚
Kotlin 作为 Android 官方推荐的语言,相比 Java 具有更简洁的语法、空安全特性和更多现代语言特性。
几年之前是学习过kotlin,但是没怎么使用,大部分都忘记了,最近Android13系统的代码也逐渐增加kotlin代码了,
比如系统framework中的SystemUI,Permission的关键代码是Kotlin代码写的,所以想重新看看Kotlin的代码。
本文介绍一些入门级的Kotlin简单用法,可以对Kotlin的代码使用有个大致了解。
以下是 Kotlin 与 Java 在 Android 开发中核心差异的详细对比:
一、基础语法对比
1. 变量声明
Java:
// 必须指定类型,不可省略
String name = "John";
final int age = 30; // 不可变变量需加 final
int score; // 可先声明后赋值
score = 90;
Kotlin:
var name: String = "John" // 可变变量
val age: Int = 30 // 不可变变量(类似 final)
val score: Int // 声明时不初始化,则必须标记为 lateinit 或可空
lateinit var address: String // 延迟初始化非空变量
2. 空安全
Java:
// 可能导致 NullPointerException
String text = null;
int length = text.length(); // 运行时崩溃// 需要手动判空
if (text != null) {length = text.length();
}
Kotlin:
// 默认不可为空
var text: String = null // 编译错误// 显式声明可为空
var nullableText: String? = null
val length = nullableText?.length // 使用安全调用符,返回 null 或长度// 非空断言(谨慎使用)
val forceLength = nullableText!!.length // 若为 null 则抛出异常// Elvis 操作符
val safeLength = nullableText?.length ?: 0 // 为空时返回默认值
3. 函数 / 方法
Java:
// 传统方法
public int add(int a, int b) {return a + b;
}// 无返回值
public void printMessage(String message) {System.out.println(message);
}
Kotlin:
// 简洁语法,可省略返回类型(类型推断)
fun add(a: Int, b: Int): Int = a + b// 无返回值(Unit 可省略)
fun printMessage(message: String): Unit {println(message)
}// 单表达式函数
fun getMessage() = "Hello, Kotlin!"// 默认参数
fun greet(name: String = "Guest") = "Hello, $name"
二、类与对象
1. 类定义与继承
Java:
// 基类
public class Person {private String name;private int age;// 构造函数public Person(String name, int age) {this.name = name;this.age = age;}// Getter/Setterpublic String getName() { return name; }public void setName(String name) { this.name = name; }
}// 子类
public class Student extends Person {private String studentId;public Student(String name, int age, String studentId) {super(name, age);this.studentId = studentId;}
}
Kotlin:
// 基类(默认 final,需显式声明 open 才能被继承)
open class Person(val name: String, var age: Int) {// 无需显式定义 Getter/Setter
}// 子类(主构造函数直接调用父类构造)
class Student(name: String, age: Int, val studentId: String) : Person(name, age)// 数据类(自动生成 equals、hashCode、toString 等)
data class User(val id: Long, val name: String)
2. 接口与实现
Java:
// 接口
public interface ClickListener {void onClick(View view);
}// 实现
public class MyButton implements ClickListener {@Overridepublic void onClick(View view) {// 处理点击事件}
}
Kotlin:
// 接口(可包含默认实现)
interface ClickListener {fun onClick(view: View)
}// 实现(无需显式 override 关键字,除非接口有多个同名方法)
class MyButton : ClickListener {override fun onClick(view: View) {// 处理点击事件}
}// 匿名内部类(SAM 转换)
button.setOnClickListener { view ->// 处理点击事件
}
三、集合与 Lambda 表达式
1. 集合操作
Java:
// 创建列表
List<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");// 遍历
for (String name : names) {System.out.println(name);
}// 过滤和映射
List<String> filteredNames = new ArrayList<>();
for (String name : names) {if (name.length() > 3) {filteredNames.add(name.toUpperCase());}
}
Kotlin:
// 创建不可变列表
val names = listOf("Alice", "Bob")// 遍历(更简洁)
names.forEach { name ->println(name)
}// 过滤和映射(函数式风格)
val filteredNames = names.filter { it.length > 3 }.map { it.uppercase() }
2. Lambda 表达式
Java:
// 传统匿名内部类
button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(context, "Clicked", Toast.LENGTH_SHORT).show();}
});// Java 8+ Lambda
list.sort((a, b) -> a.compareTo(b));
Kotlin:
// 简洁的 Lambda
button.setOnClickListener {Toast.makeText(context, "Clicked", Toast.LENGTH_SHORT).show()
}// 集合操作
val sortedList = list.sortedBy { it }
四、Android 开发特有功能
1. 布局文件绑定
Java:
// findViewById(繁琐)
TextView textView = findViewById(R.id.textView);
textView.setText("Hello");
Kotlin:
// View Binding(自动生成),需要加载Bind插件
binding.textView.text = "Hello"// 或者使用 Kotlin Android Extensions(已弃用)
textView.text = "Hello"
2. 协程(异步编程)
Java:
// 使用线程池和回调
Executors.newSingleThreadExecutor().execute(new Runnable() {@Overridepublic void run() {// 后台任务final String result = fetchData();// 回到主线程runOnUiThread(new Runnable() {@Overridepublic void run() {textView.setText(result);}});}
});
Kotlin:
// 使用协程(结构化并发)
lifecycleScope.launch {val result = withContext(Dispatchers.IO) {fetchData() // 耗时操作}textView.text = result // 自动在主线程执行
}
3. 扩展函数
Java:
// 需要创建工具类
public class ViewUtils {public static void showToast(Context context, String message) {Toast.makeText(context, message, Toast.LENGTH_SHORT).show();}
}// 使用
ViewUtils.showToast(context, "Message");
Kotlin:
// 直接扩展 View 类
fun View.showToast(message: String) {Toast.makeText(context, message, Toast.LENGTH_SHORT).show()
}// 使用
button.showToast("Clicked")
五、空安全与异常处理
1. 空安全特性
Java:
// 手动判空链
String result = "";
if (user != null && user.getProfile() != null) {result = user.getProfile().getName();
}
Kotlin:
// 安全调用链
val result = user?.profile?.name ?: "Default"
2. 异常处理
Java:
// 传统 try-catch
try {int value = Integer.parseInt(text);
} catch (NumberFormatException e) {e.printStackTrace();
}
Kotlin:
// 使用 try 作为表达式
val value = try {text.toInt()
} catch (e: NumberFormatException) {0 // 默认值
}
上面知识Java和Kotlin的一部分区别的知识,还有其他的可以一边用,一边学习,
其他的知识比如kotlin没有switch,需要使用when。
六、性能与互操作性
- 性能:
- Kotlin 编译后的字节码与 Java 接近,性能无显著差异
- 某些特性(如扩展函数)可能产生极轻微的性能开销
- 互操作性:
- Kotlin 与 Java 100% 互操作,可以混合使用
- Kotlin 代码可轻松调用 Java 库,反之亦然
七、总结与建议
特性 | Java | Kotlin |
---|---|---|
语法简洁性 | 冗长,样板代码多 | 简洁,减少 40% 以上代码量 |
空安全 | 手动判空,易出错 | 编译时强制空安全检查 |
函数式编程 | 有限支持(Java 8+ Lambda) | 全面支持,集合操作更流畅 |
异步编程 | 线程池、回调、RxJava | 协程(结构化并发) |
Android 集成 | findViewById、Handler | View Binding、协程、Flow |
学习曲线 | 入门简单,高级特性复杂 | 入门稍难,掌握后效率提升显著 |
建议:
- 新项目优先选择 Kotlin
- 现有项目逐步迁移(Kotlin 与 Java 可共存)
- 利用 Kotlin 的空安全、协程、扩展函数等特性提升开发效率
通过对比可以看出,Kotlin 在保持与 Java 兼容性的同时,提供了更现代、更安全、更高效的编程体验,是 Android 开发的首选语言。
现在从Android Java想要学习kotlin其实没有那么难,
因为现在新版本的Android Studio兼容Java和Kotlin;
Android Studio新建一个Kotlin项目代码,里面可以写Java代码也可以写Kotlin代码,
xml布局写法不变,另外Java代码可以调用到Kotlin的类,Kotlin的类也可以调用Java的代码;
另外,Kotlin的代码复制到Java的类,会提示是否转换为Kotlin的代码;
最狠的一个:Java代码可以右键一键转换成Kotlin代码(虽然不一定完全准确)。
上面的知识只是一些简单的入门知识,如果要学好kotlin需要系统的学习一下,并且进行一些实际训练。