本篇文章主要對比Java跟Kotlin中的類和接口的寫法。html
1、類的聲明
2、構造函數
3、函數的參數
4、建立類的實例
5、數據類
6、枚舉類
7、屬性
8、內部類
9、可見性修飾符
10、繼承
11、接口bash
Java聲明一個類微信
public class Foo {}
複製代碼
Kotlin聲明一個類ide
class Foo
複製代碼
若是隻聲明一個空的類,Java和Kotlin的區別仍是不大的。在Kotlin中若是沒有類體,Kotlin能夠省略大括號{}
。函數
一個類當中能夠有一個主構造函數和多個次構造函數。post
在Java中,若是不指定構造方法,編譯器會默認生成一個不帶參數的構造方法學習
public class User{
public User() {//默認生成
//能夠在構造方法裏修改代碼
}
}
複製代碼
在Kotlin中,主構造函數是類頭的一部分:它跟在類名後ui
class User constructor(userName: String) {
}
複製代碼
若是主構造函數沒有任何註解或者可見性修飾符,能夠省略這個 constructor 關鍵字this
class User(userName: String) {
}
複製代碼
Kotlin的主構造函數不能包含任何的代碼。初始化的代碼能夠放到以 init 關鍵字做爲前綴的代碼塊中spa
class User(userName: String) {
init {
//...
}
}
複製代碼
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
Kotlin支持默認參數,在調用函數時不指定參數,就會使用默認參數,而Java並不支持默認參數。舉個例子:
class User(userName: String = "Czh", age: Int = 22)
複製代碼
若是咱們在實例化User的時候不傳入參數,userName默認就是Czh,age默認就是22,以下所示:
var user = User()
複製代碼
若是在設置了默認值後,不想用默認值的話能夠在建立實例時傳入參數,以下所示:
var user = User("ABC" , 123)
複製代碼
若是一個默認參數在一個無默認值的參數以前,那麼該默認值只能經過使用命名參數調用該函數來使用,以下所示:
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;
}
@Override
public 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;
}
@Override
public int hashCode() {
int result = userName != null ? userName.hashCode() : 0;
result = 31 * result + age;
return result;
}
@Override
public 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()
函數。建立數據類須要注意的是:
獲取數據類實例後,直接能夠調用這些方法:
簡單解釋一下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聲明爲只讀的。
Java中的聲明屬性:
public class User {
String userName;
final String sex = "男";
}
複製代碼
對應的Kotlin代碼:
class User {
var userName: String
val sex: String = "男"
}
複製代碼
####2.調用屬性
Java須要加上getter方法和setter方法才能夠調用
new User().getSex();
new User().setUserName("Czh");
複製代碼
Kotlin在語法上支持屬性,不用爲屬性定義getter和setter方法。要使用一個屬性,只要用名稱引用它便可。
User().sex //getter
User().userName = "Czh" //setter
複製代碼
雖然Kotlin在語法上支持屬性,但咱們仍然能夠在屬性中使用getter和setter。舉個例子:
class User {
var name = "Czh"
var userName: String
get() = name //調用User().userName,獲得結果是 Czh
set(value) {
//調用User().userName = "Czh" 把name設爲 Czh
//而後再調用調用User().userName,獲得結果是 Czh
name = value
}
//用val只讀標識只讀
val sex: String
get() = "男"//調用User().sex,獲得結果是 男
}
複製代碼
上面例子的User類中定義了一個name來保存屬性的值,若是不想定義一個字段來保存屬性的值,可使用field標識符,以下所示:
class User {
var userName: String = "Czh"
get() = field
set(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 = 0
inner class UserName {
}
}
var userName: User.UserName = User().UserName()
複製代碼
當咱們用inner
關鍵字標記嵌套類時,能夠經過外部類的實例調用嵌套類。
Java中的可見性修飾符:
可見性修飾符 | 訪問級別 | 同類 | 同包 | 子類 | 不一樣包 |
---|---|---|---|---|---|
public | 公開 | √ | √ | √ | √ |
protected | 受保護 | √ | √ | √ | × |
default | 默認 | √ | √ | × | × |
private | 私有 | √ | × | × | × |
Kotlin中的可見性修飾符:
與Java可見性修飾符的可見性修飾符不一樣的是,多了一個internal
,少了一個default
。 internal
意味着該成員只在相同模塊內可見。更具體地說, 一個模塊是編譯在一塊兒的一套 Kotlin 文件:
Java類的繼承
class UserActivity extends AppCompatActivity {}
複製代碼
Kotlin類的繼承
class UserActivity: AppCompatActivity()
複製代碼
Java跟Kotlin都是單繼承的,也就是說,都只能有一個父類。不一樣的是,Kotlin使用冒號:
繼承,並且Kotlin的class默認不容許繼承,若是想讓類能夠被繼承,須要用open關鍵字來標識該類,以下所示:
open class Food //用open關鍵字來標識該類
class Fruits : Food()
複製代碼
在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(): String
fun getAge(): Int{
return 22
}
}
//實現接口UserImpl,能夠不重寫getName()
class User :UserImpl{
override fun getName(): String {
return "Czh"
}
}
複製代碼
本篇文章主要對比了Kotlin和Java中對於類和接口的區別,相對來講Kotlin加了一些語法糖,讓代碼編寫更方便。
參考文獻:
Kotlin語言中文站、《Kotlin程序開發入門精要》
推薦閱讀:
從Java到Kotlin(一)爲何使用Kotlin
從Java到Kotlin(二)基本語法
從Java到Kotlin(三)類和接口
從Java到Kotlin(四)對象與泛型
從Java到Kotlin(五)函數與Lambda表達式
從Java到Kotlin(六)擴展與委託
從Java到Kotlin(七)反射和註解
從Java到Kotlin(八)Kotlin的其餘技術
Kotlin學習資料總彙
更多精彩文章請掃描下方二維碼關注微信公衆號"AndroidCzh":這裏將長期爲您分享原創文章、Android開發經驗等! QQ交流羣: 705929135