歡迎光臨
每天分享高質量文章

全民Kotlin:Java我們不一樣

作者:Android輪子哥

鏈接:https://www.jianshu.com/p/a01e6b957269

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

 

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

物件

Java 的寫法

MainActivity.this

Kotlin 的寫法

 

this@MainActivity

Java 的寫法

MainActivity.class

Kotlin 的寫法

MainActivity::class.java

繼承

Java 的寫法

 

public class MainActivity extends AppCompatActivity {
}

Kotlin 的寫法(在 Kotlin 中被繼承類必須被 open 關鍵字修飾)

 

class MainActivity : AppCompatActivity() {  
}

變數

Java 的寫法

 

Intent intent = new Intent();

 

Kotlin 的寫法

var intent = Intent()

常量

Java 的寫法

final String text = "";

Kotlin 的寫法

val text = ""

靜態常量

Java 的寫法

 

public class MainActivity extends AppCompatActivity {
    static final String text = "";
}

 

Kotlin 的寫法(需要註意的是要把靜態變數定義在類上方)

 

const val text = ""
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 ("" instanceof String) {
}

 

Kotlin 的寫法

 

if ("" is String) {
}

轉換符

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 的寫法

 

String s1 = "text";
String s2 = "text";
if (s1.equals(s2)) {

}

 

Kotlin 的寫法(Kotlin 對字串比較的寫法進行優化了,其他型別物件對比還是要用 equals 方法)

 

var s1 = "text"
var s2 = "text"
if (s1 == s2) {

}

陣列

Java 的寫法

 

int[] array1 = {123};
float[] array2 = {1f2f3f};
String[] array3 = {"1""2""3"};

 

Kotlin 的寫法

 

val array1 = intArrayOf(123)
val array2 = floatArrayOf(1f2f3f)
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 = 1; i array.length; i++) {
    System.out.println(array[i]);
}

 

Kotlin 的寫法(這種寫法在 Kotlin 中稱之為區間)

 

val array = arrayListOf("1""2""3")
for (i in IntRange(1array.size - 1)) {
    println(array[i])
}

// 換種更簡潔的寫法

 

val array = arrayListOf("1""2""3")
for (i in 1..array.size - 1) {
    println(array[i])
}

 

// 編譯器提示要我們換種寫法

 

val array = arrayListOf("1""2""3")
for (i in 1 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:
        System.out.println(count);
        break;
    default:
        System.out.println(count);
        break;
}

 

Kotlin 的寫法

 

var count = 1

when (count) {
    0 -> {
        println(count)
    }
    in 1..2 -> {
        println(count)
    }
    else -> {
        println(count)
    }
}

// 換種更簡潔的寫法

 

var count = 1

// 換種更簡潔的寫法
when (count) {
    0 -> println(count)
    in 1..2 -> 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)
}

 

// 只有一種建構式的還可以這樣寫

 


class MyView(context: Context?) : View(context) {

}

類創建

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 : Stringvar 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(true), WOMAN(false);

    Sex(boolean isMan) {}
}

Kotlin 的寫法

 

enum class Sex (var isMan: Boolean) {

    MAN(true), WOMAN(false)
}

接口

Java 的寫法

 

public interface Callback {
    void onSuccess();
    void onFail();
}

Kotlin 的寫法(Kotlin接口方法裡面是可以自己實現,這裡就不再演示了)

 

interface Callback {
    fun onSuccess()
    fun onFail()
}

匿名內部類

Java 的寫法

 

new Callback() {

    @Override
    public void onSuccess() {

    }

    @Override
    public void onFail() {

    }
};

Kotlin 的寫法

 

object:Callback {

    override fun onSuccess() {

    }

    override fun onFail() {

    }
}

內部類

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 sToast;

    public static void show() {
        sToast.show();
    }
}

Kotlin 的寫法(在 Kotlin 將這種方式稱之為伴生物件)

 

companion object ToastUtils {

    var sToast : Toast? = null

    fun show() {
        sToast!!.show()
    }
}

預設引數

Java 的寫法

 


public void toast(String text) {
    toast(this, text, Toast.LENGTH_SHORT);
}

public void toast(Context context, String text) {
    toast(context, text, Toast.LENGTH_SHORT);
}

public void toast(Context context, String text, int time) {
    Toast.makeText(context, text, time).show();
}


toast("彈個吐司");
toast(this"彈個吐司");
toast(this"彈個吐司", Toast.LENGTH_LONG);

 

Kotlin 的寫法

 

fun toast(context : Context = this, text: String, time: Int = Toast.LENGTH_SHORT) {
    Toast.makeText(context, text, time).show()
}


toast(text = "彈個吐司")
toast(this"彈個吐司")
toast(this"彈個吐司", Toast.LENGTH_LONG)

可變引數

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 bean = new Bean<>("666666");

Kotlin 的寫法

 


class Bean<T : Comparable<String>>(tT{
    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 MainActivity1 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 的寫法(預設為 default)

修飾符 作用
public 所有類可見
protected 子類可見
default 同一包下的類可見
private 僅對自己類可見

Kotlin 的寫法(預設為 public)

修飾符 作用
public 所有類可見
internal 同 Module 下的類可見
protected 子類可見
private 僅對自己類可見

赞(0)

分享創造快樂