日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

学习Kotlin(三)类和接口

發布時間:2025/3/21 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 学习Kotlin(三)类和接口 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

推薦閱讀:
學習Kotlin(一)為什么使用Kotlin
學習Kotlin(二)基本語法
學習Kotlin(三)類和接口
學習Kotlin(四)對象與泛型
學習Kotlin(五)函數與Lambda表達式
學習Kotlin(六)擴展與委托
學習Kotlin(七)反射和注解
學習Kotlin(八)其他技術
Kotlin學習資料總匯

目錄

一、類的聲明
二、構造函數
三、函數的參數
四、創建類的實例
五、數據類
六、枚舉類
七、屬性
八、內部類
九、可見性修飾符
十、繼承
十一、接口


一、類的聲明

Java聲明一個類

public class Foo {}

Kotlin聲明一個類

class Foo

如果只聲明一個空的類,Java和Kotlin的區別還是不大的。在Kotlin中如果沒有類體,Kotlin可以省略大括號{}。

二、構造函數

一個類當中可以有一個主構造函數和多個次構造函數。

1.主構造函數

在Java中,如果不指定構造方法,編譯器會默認生成一個不帶參數的構造方法

public class User{public User() {//默認生成//可以在構造方法里修改代碼} }

在Kotlin中,主構造函數是類頭的一部分:它跟在類名后

class User constructor(userName: String) { }

如果主構造函數沒有任何注解或者可見性修飾符,可以省略這個 constructor 關鍵字

class User(userName: String) { }

Kotlin的主構造函數不能包含任何的代碼。初始化的代碼可以放到以 init 關鍵字作為前綴的代碼塊中

class User(userName: String) {init { //...} }

2.次構造函數

Java中的構造方法

public class User {public User(String userName) {}//次構造函數public User(String userName, int age) {}//次構造函數public User(String userName, int age, String sex) {} }

Kotlin的次構造函數前面必須加constructor關鍵字

class User(userName: String) {//主構造函數的實現部分init {println(userName)}//次構造函數,可通過this調主構造函數constructor() : this("czh")//次構造函數,可通過this調主構造函數constructor(age: Int) : this("czh") {println(age)}//次構造函數,通過this調主構造函數constructor(sex: String, age: Int) : this("czh") {println("$sex$age")} }//實例化User User() User("Czh") User(2) User("男",22)

運行代碼,得到結果:

?

注意:在實例初始化期間,可以有多個init代碼塊,按照它們出現在類體中的順序執行,如:

init {println(1)} init {println(3)}init {println(2)}

執行該段代碼,打印順序就是1->3->2

三、函數的參數

1.Kolin函數中的默認參數

Kotlin支持默認參數,在調用函數時不指定參數,就會使用默認參數,而Java并不支持默認參數。舉個例子:

class User(userName: String = "Czh", age: Int = 22)

如果我們在實例化User的時候不傳入參數,userName默認就是Czh,age默認就是22,如下所示:

var user = User()

如果在設置了默認值后,不想用默認值的話可以在創建實例時傳入參數,如下所示:

var user = User("ABC" , 123)

2.Kolin函數中的命名參數

如果一個默認參數在一個無默認值的參數之前,那么該默認值只能通過使用命名參數調用該函數來使用,如下所示:

class User(userName: String = "Czh", age: Int) var user = User(age = 22)

四、創建類的實例

Java使用關鍵字new創建類的實例:

new User();

Kotlin沒有new關鍵字,所以直接創建類的實例:

User()

五、數據類

在Kotlin中,存在數據類這樣一個概念,我們經常創建一些保存數據的類,并標記為 data,相當于Java中擁有Set和Get方法的實體類。下面來作個對比:Java實體類:

public class User {String userName;int age;public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;User user = (User) o;if (age != user.age) return false;return userName != null ? userName.equals(user.userName) : user.userName == null;}@Overridepublic int hashCode() {int result = userName != null ? userName.hashCode() : 0;result = 31 * result + age;return result;}@Overridepublic String toString() {return "User{" +"userName='" + userName + '\'' +", age=" + age +'}';} }

對應的Kotlin數據類:

data class User(var userName: String, var age: Int)

數據類用關鍵字data標識,會自動創建下面的方法:

  • getter/setter方法;
  • equals()/hashCode()?對;
  • toString()?格式是?"User(name=Czh, age=22)";
  • componentN()?函數?按聲明順序對應于所有屬性;
  • copy()?函數。

創建數據類需要注意的是:

  • 主構造方法至少要有一個參數,且參數必須標記為val或var
  • 數據類不能用open、abstract、sealed(封閉類)、inner標識

獲取數據類實例后,直接可以調用這些方法:

?

簡單解釋一下copy()函數。在很多情況下,我們需要復制一個對象改變它的一些屬性,但其余部分保持不變。 copy() 函數就是為此而生成。舉個例子:

var user = User("Czh2",22) var user1 = user.copy(age = 23) Toast.makeText(this, user1.toString(), Toast.LENGTH_SHORT).show()

運行代碼,彈出toast:

?

六、枚舉類

Java的枚舉類跟Kotlin的枚舉類非常相似。Java定義一個枚舉類

enum Color {RED, GREEN, BLUE }

Kotlin定義一個枚舉類

enum class Color {RED, GREEN, BLUE }

Java為枚舉類指定數值

enum Color {RED(0xFF0000), GREEN(0x00FF00), BLUE(0x0000FF);private Color(int rgb) {} }

Kotlin為枚舉類指定數值

enum class Color(rgb: Int) {RED(0xFF0000), GREEN(0x00FF00), BLUE(0x0000FF) }

Java枚舉類與Kotlin枚舉類除了基本語法不同,其他都非常相似。

七、屬性

Kotlin的類可以有屬性。 屬性可以用關鍵字var 聲明為讀寫的,用關鍵字val聲明為只讀的。

1.聲明屬性

Java中的聲明屬性:

public class User {String userName;final String sex = "男"; }

對應的Kotlin代碼:

class User {var userName: Stringval sex: String = "男" }

####2.調用屬性

Java需要加上getter方法和setter方法才可以調用

new User().getSex(); new User().setUserName("Czh");

Kotlin在語法上支持屬性,不用為屬性定義getter和setter方法。要使用一個屬性,只要用名稱引用它即可。

User().sex //getter User().userName = "Czh" //setter

3.屬性的getter與setter

雖然Kotlin在語法上支持屬性,但我們仍然可以在屬性中使用getter和setter。舉個例子:

class User {var name = "Czh"var userName: Stringget() = name //調用User().userName,得到結果是 Czhset(value) {//調用User().userName = "Czh" 把name設為 Czh//然后再調用調用User().userName,得到結果是 Czhname = value}//用val只讀標識只讀val sex: Stringget() = "男"//調用User().sex,得到結果是 男 }
  • field標識符

上面例子的User類中定義了一個name來保存屬性的值,如果不想定義一個字段來保存屬性的值,可以使用field標識符,如下所示:

class User {var userName: String = "Czh"get() = fieldset(value) {field = value} }

通過Kotlin提供的field標識符能夠更簡便地讀寫屬性值。

八、嵌套類

嵌套類指的是在類中定義的類,如下所示:Java中的嵌套類

class User {int age;static class UserName{} }User.UserName user= new User.UserName();

Kotlin用inner關鍵字標記嵌套類

class User {var age: Int = 0inner class UserName {} }var userName: User.UserName = User().UserName()

當我們用inner關鍵字標記嵌套類時,可以通過外部類的實例調用嵌套類。

九、可見性修飾符

Java中的可見性修飾符:

可見性修飾符訪問級別同類同包子類不同包
public公開
protected受保護×
default默認××
private私有×××

Kotlin中的可見性修飾符:

  • private ——本類內部(包含其所有成員)都可見
  • protected ——只在本類內部+子類中可見
  • public ——能見到類聲明的任何客戶端都可以見到其public成員
  • internal——能見到類聲明的本模塊內的任何客戶端都可以見到其public成員

與Java可見性修飾符的可見性修飾符不同的是,多了一個internal,少了一個default。?internal?意味著該成員只在相同模塊內可見。更具體地說, 一個模塊是編譯在一起的一套 Kotlin 文件:

  • 一個 IntelliJ IDEA 模塊;
  • 一個 Maven 項目;
  • 一個 Gradle 源集;
  • 一次 <kotlinc> Ant 任務執行所編譯的一套文件。

十、繼承

1.類的繼承

Java類的繼承

class UserActivity extends AppCompatActivity {}

Kotlin類的繼承

class UserActivity: AppCompatActivity()

Java跟Kotlin都是單繼承的,也就是說,都只能有一個父類。不同的是,Kotlin使用冒號:繼承,而且Kotlin的class默認不允許繼承,如果想讓類可以被繼承,需要用open關鍵字來標識該類,如下所示:

open class Food //用open關鍵字來標識該類class Fruits : Food()

2.重寫方法

在Kotlin中,方法也是默認不可重寫的。如果子類要重寫父類中的方法,要在父類的方法前面加open關鍵字,然后在子類重寫的方法前加override關鍵字,如下所示:

//父類 open class Food {open fun banana() {} } //子類 class Fruits : Food(){override fun banana() {super.banana()} }

十一、接口

Java接口跟Kotlin接口都是用interface關鍵字聲明

interface A{} interface B{}

Java用implements實現接口

class Foods implements A, B {}

Kotlin用冒號:實現接口

class Food : A, B {}

如果Kotlin中同時存在繼承類和實現接口

//繼承Food類和接口AB class Fruits: Food,A, B {}

一個類可以實現多個接口,而且接口中的屬性和方法都是open的,不用另外加open標識。

  • 接口中的方法體

Kotlin接口中的方法可以有默認方法體,有默認方法體的方法可以不重寫。而Java不支持接口里的方法有方法體。舉個例子:

interface UserImpl {fun getName(): Stringfun getAge(): Int{return 22} } //實現接口UserImpl,可以不重寫getName() class User :UserImpl{override fun getName(): String {return "Czh"} }

總結

本篇文章主要對比了Kotlin和Java中對于類和接口的區別,相對來說Kotlin加了一些語法糖,讓代碼編寫更方便。


原文鏈接:https://juejin.im/post/5a7f04d66fb9a063461ff173

總結

以上是生活随笔為你收集整理的学习Kotlin(三)类和接口的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。