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;
}