作者: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 = {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 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 | 僅對自己類可見 |