全民 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阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • 面向对象编程(OOP) 在前面的章节中,我们学习了Kotlin的语言基础知识、类型系统、集合类以及泛型相关的知识。...
    Tenderness4阅读 4,407评论 1 6
  • 一:java概述: 1,JDK:Java Development Kit,java的开发和运行环境,java的开发...
    慕容小伟阅读 1,761评论 0 10
  • 整理来自互联网 1,JDK:Java Development Kit,java的开发和运行环境,java的开发工具...
    Ncompass阅读 1,531评论 0 6
  • 一:java概述:1,JDK:Java Development Kit,java的开发和运行环境,java的开发工...
    ZaneInTheSun阅读 2,603评论 0 11
  • A. 大一学的Linux,基本忘光了,今天看了一下,还记得一些基本命令,比如增删查改,还有挂在光盘下载软件,自己会...
    Liar_f95f阅读 197评论 1 0