Android Kotlin 用法对比Java使用小结

发布于:2025-06-22 ⋅ 阅读:(18) ⋅ 点赞:(0)

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。

六、性能与互操作性

  1. 性能
    • Kotlin 编译后的字节码与 Java 接近,性能无显著差异
    • 某些特性(如扩展函数)可能产生极轻微的性能开销
  2. 互操作性
    • 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需要系统的学习一下,并且进行一些实际训练。

PS:学习这东西任何时候都不算晚


网站公告

今日签到

点亮在社区的每一天
去签到