Android Kotlin 用法对比Java使用小结
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/Setter
public 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 {
@Override
public 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() {
@Override
public 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() {
@Override
public void run() {
// 后台任务
final String result = fetchData();
// 回到主线程
runOnUiThread(new Runnable() {
@Override
public 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需要系统的学习一下,并且进行一些实际训练。