JavaRush /Java 博客 /Random-ZH /Kotlin 和 Java 有什么区别吗?
Paul Soia
第 26 级
Kiyv

Kotlin 和 Java 有什么区别吗?

已在 Random-ZH 群组中发布
大家好。我想告诉你一些关于 Kotlin 语言的基本知识,这对初学者很有用。恰巧的是,现在只用一种语言进入 Android 开发将会很困难——大多数新项目开始用 Kotlin 编写,大多数现成的项目都是用 Java 编写的。 Kotlin 和 Java 有什么区别吗? - 1目前我有 4 个项目在工作:两个在 Kotlin 中,两个在 Java 中(一个大的主项目,三个小的供内部使用)。当公司决定用 Kotlin 编写新项目时,这个决定对我来说似乎很奇怪。为什么要混合不同的语言?让别人用Kotlin写,我们为什么需要它?但没有出路,所以我决定尝试一门新语言并开始学习。当然,第一个代码完全是用 Java 风格编写的,这进一步加深了误解:为什么我需要一门新语言?但随着我的使用,我发现了越来越多的优点,现在(我已经用 Kotlin 写了近 2 年了)我可以说 Kotlin 在 Android 开发中更方便。我想展示一些细微差别,对于决定在 Java 之后开始学习 Kotlin 的人来说,这些细微差别并不明显。我还要提醒您,Android 使用 Java 8,当前版本为 14。因此,首先 -变量:Java:
Int a = 1;
String s = "test";
科特林:
val a = 1
var b = 2
val c: Int
val d = "test"
Kotlin 中有两种类型的变量:val(只读)和 var(读写)。建议尽可能使用 val。如果变量已经初始化,则无需声明变量的类型。其次 - if/else、switch 语句:您在 Java 中使用此语句链的频率是多少:
if (вариант 1)
{...}
else if (вариант 2)
{...}
...
else
{...}
或者像这样:
switch(выражениеДляВыбора) {
        case (meaning 1):
                Код1;
                break;
        case (meaning 2):
                Код2;
                break;
...
        case (meaning N):
                КодN;
                break;
        default:
                КодВыбораПоУмолчанию;
                break;
        }
在 Kotlin 中,when 运算符用于此类表达式(尽管也可以使用 if/else):
val x = 5
val result = when(x) {
        0, 1 -> "cool"
        2 -> "bad"
        5 -> "normal"
        else -> "error"
}
System.out.println(result)
这里我们不仅遍历了条件链,还立即将整个表达式分配给结果变量,这节省了相当多的代码行。但是,如果分支中只有两个选项,我建议使用通常的 if..else。仅在三种变体中,when 结构会更短。让我们继续 -构造函数。这里是童话故事。只需比较 Java 和 Kotlin 中的代码即可。爪哇:
public class Person {

    private String firstName;
    private String lastName;
    private int age;

    public Person(String firstName, String lastName, int age) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
科特林:
class Person(private val firstName: String,
             private val lastName: String,
             private var age: Int) {
}
Kotlin 代码中似乎还有一些未完成的事情。但不,这是不同语言的两个相同的代码。让我们稍微弄清楚一下。在 Kotlin 中,构造函数可以直接写在类名的主体中(但如果你愿意,你可以用老式的方式来实现,就像在 Java 中一样)。因此,我们编写了三个变量,在 Java 中,我们为年龄变量创建了一个构造函数、getter 和一个 setter。我们记得,在 Kotlin 中, val 变量是只读的,因此这些变量的 setter 不可用(Kotlin 在内部实现了 getter-setter)。var 变量允许您使用 setter。结果,我们几乎用一行写了Java中十几行的内容。在这里我建议阅读更多有关 Kotlin 中数据类的内容。但这并不是 Kotlin 构造函数所擅长的全部。但是如果您需要两个构造函数怎么办?如果是三个呢?在 Java 中,它看起来像这样:
public Person(String firstName, String lastName, int age) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }

public Person(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

public Person(String firstName) {
        this.firstName = firstName;
    }
没什么复杂的,只要需要多少设计师,他们就是这么做的。在 Kotlin 中,您只需一个构造函数即可完成。如何?很简单 - 默认值。
class Person(private val firstName: String,
             private val lastName: String? = null,
             private var age: Int = 5) {
}
我们在构造函数中分配了默认值,现在调用它们将如下所示:
Person(firstName = "Elon", lastName = "Mask", age = 45)
Person(firstName = "Elon", age = 45)
Person(firstName = "Elon", lastName = "Mask")
可能会出现这样的问题:这是什么:
private val lastName: String? = null
这些其他问号是什么?是的,如果值可以为 null,那么它就被设置了?。还有一个像这样的选项 - !!(如果变量不能接受 null)。你自己读一下吧,很简单。我们继续讨论下一点。 扩展。这是 Kotlin 中一个非常酷的工具,但 Java 中没有。有时在项目中我们使用在许多类中重复的模板方法。例如,像这样:
Toast.makeText(this, "hello world :)", Toast.LENGTH_SHORT).show();
在 Kotlin 中我们可以扩展一个类:
fun Context.toast(message: CharSequence) = Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
然后在整个项目中这样使用它:
context?.toast("hello world")
我们对 Context 类进行了扩展。现在,只要上下文可用,它的新 toast 方法就可用。这可以对任何类完成:String、Fragment、您的自定义类,没有任何限制。我们要讨论的最后一点是使用字符串。这里一切都很简单。在Java中是这样写的:
String s = "friends";
int a = 5;
System.out.println("I have" + a + s + "!");
在 Kotlin 中更容易:
val s = "friends"
val a = 5
println("I have $a $s!")
这些是我在开始学习 Kotlin 时偶然发现的细微差别,希望对您有所帮助。
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION