美文网首页kotlinAndroid开发Kotlin 学习
全民Kotlin:Java我们不一样

全民Kotlin:Java我们不一样

作者: Android轮子哥 | 来源:发表于2019-02-25 11:22 被阅读2078次

    本文章已授权鸿洋微信公众号预发布中

    随着 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 = {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 = 1; i < array.length; i++) {
        System.out.println(array[i]);
    }
    

    Kotlin 的写法(这种写法在 Kotlin 中称之为区间)

    val array = arrayListOf("1", "2", "3")
    
    for (i in IntRange(1, array.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 : 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(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<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 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 仅对自己类可见

    Android技术讨论Q群:78797078

    相关文章

      网友评论

        本文标题:全民Kotlin:Java我们不一样

        本文链接:https://www.haomeiwen.com/subject/kdmwyqtx.html