Kotlin 屬性的聲明修飾符在 Java 中的作用

Kotlin 版本:Kotlin 1.3

[@JvmField] [public|protected|private] [open] <var|val> <propertyName>

中括號的爲可選修飾符
如果要實現靜態屬性可採用

companion object{
	[@JvmField] [public|protected|private] [open] <var|val> <propertyName>
}

先做一個總結吧

非靜態屬性

open 修飾符等價於 Java 中子類能不能重寫 get、set 方法,即在 Java 中 get、set 有 final 修飾。默認有 final 修飾。

var 和 val 的區別就是在 Java 中屬性是否有 final 修飾,前者沒有 final。

使用 @JvmField 註解和 Java 直接聲明屬性沒什麼區別,即沒有自動生成 get、set 方法。可見性修飾符默認是 public。沒有使用的時候 get、set 的可見性由聲明時決定,且屬性始終是 private。默認 get、set 方法爲 public,當聲明爲 private 時,沒有 get、set 方法。

靜態屬性

open 修飾無效

var 和 val 區別和非靜態屬性一樣

使用 @JvmField 註解的效果也是和非靜態屬性一樣,唯一不同的是沒使用註解在 Java 中是使用靜態內部類實現靜態屬性和方法。

頂級屬性

隸屬於文件的屬性(這種說法似乎不太準確),詳細看代碼吧(最後一個例子)

各種修飾的情況對應到 Java 當中 (非靜態屬性帶註解沒列舉出來,不過可以用靜態屬性的例子來類比,或者手動用一下 Android Studio 的 Kotlin 轉 Java 看一下)

var a : Int

private int a;
public final int getA(){
	return a;
}
public final int setA(int a){
	this.a = a;
}
//--------------------
val a : Int

private final int a;
public final int getA(){
	return this.a;
}
//--------------------
private var a : Int

private int a;
//--------------------
private val a : Int

private final int a;
//--------------------
protected var a : Int

private int a;
protected final int getA() {
   return this.a;
}
protected final void setA(int a) {
   this.a = a;
}
//--------------------
protected val a : Int

private final int a;
protected final int getA() {
   return this.a;
}
//--------------------
public var a : Int

private int a;
public final int getA() {
   return this.a;
}
public final void setA(int a) {      
   this.a = a;
}
//--------------------
public val a : Int

private final int a;
public final int getA() {
   return this.a;
}
//--------------------
open var a : Int

private int a;
public int getA(){
	return a;
}
public int setA(int a){
	this.a = a;
}
//--------------------
open val a : Int

private final int a;
public int getA(){
	return this.a;
}
//--------------------
/*
  Compile Error
  這兩個寫法編譯報錯,private 和 open 不能一起用
*/
private open var a : Int
private open val a : Int
//--------------------
protected open var a : Int

private int a;
protected int getA() {
   return this.a;
}
protected void setA(int a) {
   this.a = a;
}
//--------------------
protected open val a : Int

private final int a;
protected int getA() {
   return this.a;
}
//--------------------
public open var a : Int

private int a;
public int getA() {
   return this.a;
}
public void setA(int a) {      
   this.a = a;
}
//--------------------
public open val a : Int

private final int a;
public int getA() {
   return this.a;
}
//--------------------
companion object{
    var a : Int					//open 對伴生對象的成員不起作用,public 也不起作用
}

/*
  靜態內部類實現靜態方法和屬性
*/
private static int a;
public static final class Companion {
    public final int getA() {
       return BaseFragment.a;
    }
    public final void setA(int a) {
       BaseFragment.a = a;
    }
    private Companion() {
    }
    // $FF: synthetic method
    public Companion(DefaultConstructorMarker $constructor_marker) {
       this();
    }
}
//--------------------
companion object{
    val a : Int
}

private static final int a;
public static final class Companion {
   public final int getA() {
      return BaseFragment.a;
   }
   private Companion() {
   }
   // $FF: synthetic method
   public Companion(DefaultConstructorMarker $constructor_marker) {
      this();
   }
}
//--------------------
companion object{
    private var a : Int
}

private static int a;
public static final class Companion {
   private Companion() {
   }
   // $FF: synthetic method
   public Companion(DefaultConstructorMarker $constructor_marker) {
       this();
   }
}
//--------------------
companion object{
    private val a : Int
}

private static final int a;
public static final class Companion {
   private Companion() {
   }
   // $FF: synthetic method
   public Companion(DefaultConstructorMarker $constructor_marker) {
       this();
   }
}
//--------------------
companion object{
   protected var a : Int
}

private static int a;
public static final class Companion {
   protected final int getA() {
      return BaseFragment.a;
   }
   protected final void setA(int a) {
      BaseFragment.a = a;
   }
   private Companion() {
   }
   // $FF: synthetic method
   public Companion(DefaultConstructorMarker $constructor_marker) {
      this();
   }
}
//--------------------
companion object{
    protected val a : Int
}

private static final int a;
public static final class Companion {
   protected final int getA() {
      return BaseFragment.a;
   }
   private Companion() {
   }
   // $FF: synthetic method
   public Companion(DefaultConstructorMarker $constructor_marker) {
      this();
   }
}
//--------------------
companion object{
    @JvmField var a : Int		//通過 @JvmField 註解可以實現真正的靜態方法和屬性,不能和 private 修飾符一起使用
}

public static int a;
//--------------------
companion object{
    @JvmField val a : Int
}

public static final int a;
//--------------------
companion object{
    @JvmField protected var a : Int
}

protected static int a;
//--------------------
companion object{
    @JvmField protected val a : Int
}

protected static final int a;
//--------------------
const val a

/*
  類的名字由變量聲明所在的文件名
  例如在 BaseFragment.kt 中聲明類的名字就是 BaseFragmentKt
 */
public final class BaseFragmentKt{	
	public static final int a;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章