全民 Kotlin:Java 我們不一樣

本文章已授權鴻洋微信公眾號轉載

隨著 Kotlin 越來越火爆,學習 Kotlin 已經成為我們必經之路

多余的話就不說了,代碼是最好的老師

目錄

  • 集成 Kotlin

  • new 關鍵字

  • this 關鍵字

  • class 關鍵字

  • extends 關鍵字

  • volatile 關鍵字

  • synchronized 關鍵字

  • final 關鍵字

  • 變量

  • 靜態常量

  • 定義方法

  • 重載方法

  • 基本數據類型

  • 比較類型

  • 比較對象

  • 轉換符

  • 數組

  • 循環

  • 角標循環

  • 高級循環

  • 判斷器

  • 構造函數

  • 創建類

  • 私有化 set 方法

  • 私有化 get 方法

  • 枚舉

  • 接口

  • 匿名內部類

  • 內部類

  • 內部類訪問外部類同名變量

  • 抽象類

  • 靜態變量和方法

  • 可變參數

  • 泛型

  • 構造代碼塊

  • 靜態代碼塊

  • 方法代碼塊

  • 三元運算符

  • 權限修飾符

  • 抑制代碼警告

  • 注解處理器

集成 Kotlin

  • 需要先在項目 app 模塊下的 build.gradle 文件中加入配置
apply plugin: 'kotlin-android'

android {

    kotlinOptions {
        jvmTarget = '1.8'
    }
}
  • 然后在項目根目錄下的 build.gradle 文件中加入 Kotlin 插件配置
buildscript {

    dependencies {
        // Kotlin 插件:https://plugins.jetbrains.com/plugin/6954-kotlin
        // noinspection GradleDependency
        classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.31'
    }
}
  • 需要注意的是,這里以 Android Studio 4.2 為例,集成的是 kotlin-gradle-plugin:1.5.31 版本是沒有問題的,這個 Kotlin 插件使用的版本和當前 Android Studio 版本相關,如果遇到集成失敗的,需要自行修改到合適的版本。

new 關鍵字

  • Java 的寫法
Intent intent = new Intent();
  • Kotlin 的寫法
var intent = Intent()

this 關鍵字

  • Java 的寫法
MainActivity.this
  • Kotlin 的寫法
this@MainActivity

class 關鍵字

  • Java 的寫法
MainActivity.class
  • Kotlin 的寫法
MainActivity::class.java

extends 關鍵字

  • Java 的寫法
public class MainActivity extends AppCompatActivity {
    
}
  • Kotlin 的寫法(在 Kotlin 中被繼承類必須被 open 關鍵字修飾)
class MainActivity : AppCompatActivity() {
    
}

volatile 關鍵字

  • Java 的寫法
volatile ThreadPoolManager instance
  • Kotlin 的寫法
@Volatile
var instance: ThreadPoolManager

synchronized 關鍵字

  • Java 的寫法
// 方法上面定義同步鎖
public synchronized ThreadPoolManager getInstance() {
    
}
// 方法里面定義同步鎖
public ThreadPoolManager getInstance() {

    synchronized (ThreadPoolManager.class) {

    }
}
  • Kotlin 的寫法
@Synchronized
fun getInstance(): ThreadPoolManager? {

}
fun getInstance(): ThreadPoolManager? {

    synchronized(ThreadPoolManager::class.java, {
        
    })
}

final 關鍵字

  • Java 的寫法
// 表示變量不可重新賦值
final String text = "";
// 表示方法不能被重寫
public final void test() {

}
// 表示類不能被繼承
public final class MainActivity extends AppCompatActivity {
    
}
  • Kotlin 的寫法
// 表示變量不可重新賦值
val text = ""
// 表示方法不能被重寫
fun test() {

}
// 表示類不能被繼承
class MainActivity : AppCompatActivity() {
    
}
  • 需要注意的是:Kotlin 的類和方法默認是不能被繼承和重寫的,如果想要被繼承或者重寫必須要使用 open 關鍵字進行修飾

變量

  • Java 的寫法
String text = "";
  • Kotlin 的寫法
var text: String = ""

靜態常量

  • Java 的寫法
public class MainActivity extends AppCompatActivity {
    
    static final String TEXT = "";
}
  • Kotlin 的寫法(有兩種寫法,二選一即可)
class MainActivity : AppCompatActivity() {

    companion object {

        const val TEXT: String = ""
    }
}
const val TEXT: String = ""
    
class MainActivity : AppCompatActivity() {
    
}

定義方法

  • Java 的寫法
public void test(String message) {

}
  • Kotlin 的寫法(Unit 跟 void 一樣效果)
fun test(message: String): Unit {

}
// 在 Kotlin 可以省略 Unit 這種返回值
fun test(message: String) {

}

重載方法

  • Java 的寫法
public class MainActivity extends AppCompatActivity {
    
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
}
  • Kotlin 的寫法
class MainActivity : AppCompatActivity() {
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }
}

基本數據類型

  • Java 的寫法
int i = 1;
long l = 2;
boolean b = true;
float f = 0;
double d = 0;
char c = 'A';
String s = "text";
  • Kotlin 的寫法
var i: Int = 1
var l: Long = 2
var b: Boolean = true
var f: Float = 0F
var d: Double = 0.0
var c: Char = 'A'
var s: String = "text"
// 更簡潔點可以這樣,自動推導類型
var i = 1
var l = 2
var b = true
var f = 0F
var d = 0.0
var c = 'A'
var s = "text"

比較類型

  • Java 的寫法
if ("1" instanceof String) {

}

if (!("2" instanceof String)) {

}
  • Kotlin 的寫法
if ("1" is String) {

}

if ("2" !is String) {

}

比較對象

  • Java 的寫法
// 比較兩個對象內容是否一樣
if (object1.equals(object2)) {

}
if (!object3.equals(object4)) {

}

// 比較兩個對象是否是同一個
if (object5 == object6) {

}

if (object7 != object8) {

}
  • Kotlin 的寫法
// 比較兩個對象內容是否一樣
if (object1 == object2) {

}
if (object3 != object4) {

}

// 比較兩個對象是否是同一個
if (object5 === object6) {

}

if (object7 !== object8) {

}
  • 需要注意的是:Kotlin 中 == 和 Java 中的 equals 效果是一樣的,而 Kotlin 中 ===Java== 的效果是一樣的。

轉換符

  • Java 的寫法
int number = 100;
System.out.println(String.format("商品數量有%d", number));
  • Kotlin 的寫法
var number = 100
println("商品數量有${number}")
// 換種簡潔的寫法
var number = 100
println("商品數量有$number")
// 如果不想字符串被轉義可以使用\$
var number = 100
println("商品數量有\$number")

數組

  • Java 的寫法
int[] array1 = {1, 2, 3};
float[] array2 = {1f, 2f, 3f};
String[] array3 = {"1", "2", "3"};
  • Kotlin 的寫法
val array1 = intArrayOf(1, 2, 3)
val array2 = floatArrayOf(1f, 2f, 3f)
val array3 = arrayListOf("1", "2", "3")

循環

  • Java 的寫法
String[] array = {"1", "2", "3"};

for (int i = 0; i < array.length; i++) {
    System.out.println(array[i]);
}
  • Kotlin 的寫法
val array = arrayListOf("1", "2", "3")

for (i in array.indices) {
    println(array[i])
}

角標循環

  • Java 的寫法
String[] array = {"1", "2", "3"};

for (int i = 0; i < array.length; i++) {
    System.out.println(array[i]);
}
  • Kotlin 的寫法(這種寫法在 Kotlin 中稱之為區間)
val array = arrayListOf("1", "2", "3")

for (i in IntRange(0, array.size - 1)) {
    println(array[i])
}
// 換種更簡潔的寫法
val array = arrayListOf("1", "2", "3")

for (i in 0..array.size - 1) {
    println(array[i])
}
// 編譯器提示要我們換種寫法
val array = arrayListOf("1", "2", "3")

for (i in 0 until array.size) {
    println(array[i])
}

高級循環

  • Java 的寫法
String[] array = {"1", "2", "3"};

for (String text: array) {
    System.out.println(text);
}
  • Kotlin 的寫法
val array = arrayListOf("1", "2", "3")

for (text in array) {
    println(text)
}

判斷器

  • Java 的寫法
int count = 1;

switch (count) {
    case 0:
        System.out.println(count);
        break;
    case 1:
    case 2:
    case 3:
        System.out.println(count);
        break;
    case 5:
    case 7:
        System.out.println(count);
        break;
    default:
        System.out.println(count);
        break;
}
  • Kotlin 的寫法
val count = 1

when (count) {
    0 -> {
        println(count)
    }
    in 1..3 -> {
        println(count)
    }
    5, 7 -> {
        println(count)
    }
    else -> {
        println(count)
    }
}
// 換種更簡潔的寫法
val count = 1

when (count) {
    0 -> println(count)
    in 1..3 -> println(count)
    5, 7 -> println(count)
    else -> println(count)
}

構造函數

  • Java 的寫法
public class MyView extends View {

    public MyView(Context context) {
        this(context, null);
    }

    public MyView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
}
  • Kotlin 的寫法
// 第一種寫法
class MyView : View {
    
    constructor(context: Context) : this(context, null) {
    
    }
    
    constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0) {
    
    }
    
    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {
    
    }
}
// 第二種寫法
class MyView : View {
    
    constructor(context: Context) : this(context, null)
    
    constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)
    
    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
    
    init {
    
    }
}
// 第三種寫法
class RegexEditText @JvmOverloads constructor(
    context: Context, attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {

    init {
    
    }
}
// 如果只有一種構造函數的還可以這樣寫
class MyView(context: Context) : View(context) {
    
    init {
    
    }
}

創建類

  • Java 的寫法
public class Person {

    String name;
    int age;

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
Person person = new Person("Android輪子哥", 100);
person.setName("HJQ");
person.setAge(50);
System.out.println("name: " + person.getName() + ", age: " + person.getAge());
  • Kotlin 的寫法(如果不想暴露成員變量的set方法,可以將 var 改成 val )
class Person {
    
    var name: String? = null
    get() = field
    set(value) {field = value}
    
    var age: Int = 0
    get() = field
    set(value) {field = value}
}
// 換種更簡潔的寫法
class Person(var name: String, var age: Int)
var person = Person("Android輪子哥", 100)
person.name = "HJQ"
person.age = 50
println("name: {$person.name}, age: {$person.age}")

私有化 set 方法

  • Java 的寫法
public class Person {

    String name;
    int age;

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

    public String getName() {
        return name;
    }

    private void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    private void setAge(int age) {
        this.age = age;
    }
}
  • Kotlin 的寫法
class Person {
    
    var name: String? = null
    private set
    
    var age: Int = 0
    private set
}

私有化 get 方法

  • Java 的寫法
public class Person {

    String name;
    int age;
    
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    private String getName() {
        return name;
    }
    
    private void setName(String name) {
        this.name = name;
    }
    
    private int getAge() {
        return age;
    }
    
    private void setAge(int age) {
        this.age = age;
    }
}
  • Kotlin 的寫法
class Person {
    
    private var name: String? = null
    
    private var age: Int = 0
}

枚舉

  • Java 的寫法
enum Sex {

    MAN(1), WOMAN(2);

    Sex(int type) {}
}
  • Kotlin 的寫法
enum class Sex (var type: Int) {
    
    MAN(1), WOMAN(2)
}

接口

  • Java 的寫法
public interface Callback {

    void onSuccess();
    
    // JDK 8 新特性,接口方法支持默認實現
    default void onFail() {
    
    }
}
  • Kotlin 的寫法
interface Callback {

    fun onSuccess()
    
    fun onFail() {
    
    }
}

匿名內部類

  • Java 的寫法
post(new Runnable() {
    
    @Override
    public void run() {
        
    }
});
  • Kotlin 的寫法
post(object : Runnable {

    override fun run() {
        
    }
})

內部類

  • Java 的寫法
public class MainActivity extends AppCompatActivity {

    public class MyTask {

    }
}
  • Kotlin 的寫法
class MainActivity : AppCompatActivity() {

    inner class MyTask {
        
    }
}

內部類訪問外部類同名變量

  • Java 的寫法
String name = "Android輪子哥";

public class MyTask {

    String name = "HJQ";

    public void show() {
        System.out.println(name + "---" + MainActivity.this.name);
    }
}
  • Kotlin 的寫法
var name = "Android輪子哥"

inner class MyTask {

    var name = "HJQ"

    fun show() {
        println(name + "---" + this@MainActivity.name)
    }
}

抽象類

  • Java 的寫法
public abstract class BaseActivity extends AppCompatActivity implements Runnable {

    abstract void init();
}
  • Kotlin 的寫法
abstract class BaseActivity : AppCompatActivity(), Runnable {
    
    abstract fun init()
}

靜態變量和方法

  • Java 的寫法
public class ToastUtils {

    public static Toast toast;

    public static void show() {
        toast.show();
    }
}
  • Kotlin 的寫法(在 Kotlin 將這種方式稱之為伴生對象)
companion object ToastUtils {

    var toast: Toast? = null

    fun show() {
        toast?.show()
    }
}

可變參數

  • Java 的寫法
public int add(int... array) {
    int count = 0;
    for (int i: array) {
        count += i;
    }
    return count;
}
  • Kotlin 的寫法
fun add(vararg array: Int): Int {
    var count = 0
    //for (i in array) {
    //    count += i
    //}
    array.forEach {
        count += it
    }
    return count
}

泛型

  • Java 的寫法
public class Bean<T extends String> {

    T data;
    
    public Bean(T t) {
        this.data = t;
    }
}
Bean<String> bean = new Bean<>("666666");
  • Kotlin 的寫法
class Bean<T : Comparable<String>>(t: T) {
    var data = t
}
var bean = Bean<String>("666666")
// 換種更簡潔的寫法
var bean = Bean("666666")

構造代碼塊

  • Java 的寫法
public class MainActivity extends AppCompatActivity {
    
    int number;
    
    {
        number = 1;
    }
}
  • Kotlin 的寫法
class MainActivity : AppCompatActivity() {
    
    var number = 0
    
    init {
        number = 1
    }
}

靜態代碼塊

  • Java 的寫法
public class MainActivity extends AppCompatActivity {
    
    static int number;
    
    static {
        number = 1;
    }
}
  • Kotlin 的寫法
class MainActivity : AppCompatActivity() {
    
    companion object {
        
        var number = 0
        
        init {
            number = 1
        }
    }
}

方法代碼塊

  • Java 的寫法
void test(){
    {
        int a = 1;
    }
}
  • Kotlin 的寫法
fun test() {
    run {
        var a =1
    }
}

三元運算符

  • Java 的寫法
int c = a > b ? a : b;
  • Kotlin 的寫法
var c = if (a > b) a else b

權限修飾符

  • Java 的寫法(默認為 default
修飾符 作用
public 所有類可見
protected 子類可見
default 同一包下的類可見
private 僅對自己類可見
  • Kotlin 的寫法(默認為 public
修飾符 作用
public 所有類可見
internal 同 module 下的類可見
protected 子類可見
private 僅對自己類可見

抑制代碼警告

  • Java 的寫法
@SuppressWarnings("unused")

@SuppressLint("ClickableViewAccessibility")
  • Kotlin 的寫法
@Suppress("unused")

@Suppress("ClickableViewAccessibility")

注解處理器

  • Java 的寫法
annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'
  • Kotlin 的寫法
apply plugin : 'kotlin-kapt'
kapt 'com.github.bumptech.glide:compiler:4.12.0'
  • 如果在 Kotlin 仍然使用 annotationProcessor 來集成注解處理器,那么會導致報錯編譯不過去

下一篇:全民 Kotlin:你沒有玩過的全新玩法

另外推薦一個 Kotlin 語言編寫的開源項目,大家感興趣可以看看:AndroidProject-Kotlin

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,362評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,577評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,486評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,852評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,600評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,944評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,944評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,108評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,652評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,385評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,616評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,111評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,798評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,205評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,537評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,334評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,570評論 2 379

推薦閱讀更多精彩內容

  • 面向對象編程(OOP) 在前面的章節中,我們學習了Kotlin的語言基礎知識、類型系統、集合類以及泛型相關的知識。...
    Tenderness4閱讀 4,470評論 1 6
  • 一:java概述: 1,JDK:Java Development Kit,java的開發和運行環境,java的開發...
    慕容小偉閱讀 1,822評論 0 10
  • 整理來自互聯網 1,JDK:Java Development Kit,java的開發和運行環境,java的開發工具...
    Ncompass閱讀 1,550評論 0 6
  • 一:java概述:1,JDK:Java Development Kit,java的開發和運行環境,java的開發工...
    ZaneInTheSun閱讀 2,686評論 0 11
  • A. 大一學的Linux,基本忘光了,今天看了一下,還記得一些基本命令,比如增刪查改,還有掛在光盤下載軟件,自己會...
    Liar_f95f閱讀 210評論 1 0