第 11 課:訪問修飾符

 第 11 課:訪問修飾符

既然您已經瞭解了軟件包,我們可以討論 JavaFX Script 編程語言提供的各種訪問修飾符了。通過這些特殊的關鍵字可以爲變量、函數和類設置各種可見性級別。
 
目錄

 

默認訪問
package 訪問修飾符
protected 訪問修飾符
public 訪問修飾符
public-read 訪問修飾符
public-init 訪問修飾符
 

默認訪問稱爲“僅腳本”,是指在未提供訪問修飾符的情況下獲得的訪問。我們在本教程中大多數都在使用這種訪問。

下面是一些示例:

var x;
var x : String;
var x = z + 22;
var x = bind f(q);
 

使用此訪問級別,只能從腳本內部初始化、覆蓋、讀取、指定或綁定變量。其他任何源文件都不能讀取或訪問這些信息。

要使變量、函數或類可供同一個軟件包中的其他代碼訪問,請使用 package 訪問修飾符:

package var x;
 

一定不要將該訪問修飾符與前一課中介紹的軟件包聲明相混淆!

示例:

// Inside file tutorial/one.fx
package tutorial; // places this script in the "tutorial" package
package var message = "Hello from one.fx!"; // this is the "package" access modifier
package function printMessage() {
println("{message} (in function printMessage)");
}

// Inside file tutorial/two.fx
package tutorial;
println(one.message);
one.printMessage();
 

可以使用以下命令(從 tutorial 父目錄中)編譯並運行此示例:

javafxc tutorial/one.fx tutorial/two.fx
javafx tutorial/two
 

輸出爲:

Hello from one.fx!
Hello from one.fx! (in function printMessage)
 

protected 訪問修飾符使變量或函數可供同一個軟件包中的其他代碼以及任何軟件包中的子類訪問。

示例:

// Inside file tutorial/one.fx
package tutorial;
public class one {
protected var message = "Hello!";
}

// Inside file two.fx
import tutorial.one;
class two extends one {
function printMessage() {
println("Class two says {message}");
}
};

var t = two{};
t.printMessage();
 

編譯並運行以下演示代碼:

javafxc tutorial/one.fx two.fx
javafx two
 

輸出爲:

Class two says Hello!
 

注意:不能對類應用此訪問修飾符,這就是我們爲什麼將類 one 標記爲 public 的原因。

public 類、變量或函數的可見性最高。可以從任何軟件包中的任何類或腳本對其進行訪問。

示例:

// Inside file tutorial/one.fx
package tutorial;
public def someMessage = "This is a public script variable, in one.fx";
public class one {
public var message = "Hello from class one!";
public function printMessage() {
println("{message} (in function printMessage)");
}
}

// Inside file two.fx
import tutorial.one;
println(one.someMessage);
var o = one{};
println(o.message);
o.printMessage();
 

編譯並運行以下示例:

javafxc tutorial/one.fx two.fx
javafx two
 

輸出:

This is a public script variable, in one.fx
Hello from class one!
Hello from class one! (in function printMessage)
 

public-read 訪問修飾符定義可公開讀取但(在默認情況下)只能從當前腳本內部寫入的變量。爲了擴大該變量的寫入訪問級別,可以在該修飾符前面添加 packageprotected 修飾符(即 package public-readprotected public-read)。這會將該變量的寫入訪問級別設置爲 packageprotected

示例:

// Inside file tutorial/one.fx
package tutorial;
public-read var x = 1;

// Inside tutorial/two.fx
package tutorial;
println(one.x);
 

編譯並運行以下示例:

javafxc tutorial/one.fx tutorial/two.fx
javafx tutorial/two
 

輸出爲 "1",這證明了可以從 tutorial/one.fx 腳本外部讀取 x

現在,讓我們嘗試修改其值:

// Inside tutorial/two.fx
package tutorial;
one.x = 2;
println(one.x);
 

結果爲編譯時錯誤:

tutorial/two.fx:3: x has script only (default) write access in tutorial.one
one.x = 2;
^
1 error
 

爲了能夠修改該變量的值,我們必須擴大 x 的寫入訪問級別:

// Inside file tutorial/one.fx
package tutorial;
package public-read var x = 1;

// Inside tutorial/two.fx
package tutorial;
one.x = 2;
println(one.x);
 

此示例現在將進行編譯並將 "2" 輸出到屏幕上。

public-init 訪問修飾符定義可以由任何軟件包中的對象字面值公開初始化的變量。但是,後續的寫入訪問將按照與 public-read 相同的方式進行控制(默認情況下寫入訪問級別是腳本級別,但是該修飾符前面的 packageprotected 將相應地擴大訪問級別)。始終可以從任何軟件包讀取此變量的值。

示例:

// Inside file tutorial/one.fx
package tutorial;
public class one {
public-init var message;
}

// Inside file two.fx
import tutorial.one;
var o = one {
message: "Initialized this variable from a different package!"
}
println(o.message);
 

編譯並運行以下示例:

javafxc tutorial/one.fx two.fx
javafx two
 

這將輸出 "Initialized this variable from a different package!",從而證明了其他軟件包中的對象字面值可以初始化 message 變量。但是,由於後續的寫入訪問級別是“僅腳本”級別,因此我們無法更改此變量的值:

// Inside file two.fx
import tutorial.one;
var o = one {
message: "Initialized this variable from a different package!"
}
o.message = "Changing the message..."; // WON'T COMPILE
println(o.message);
 

編譯時錯誤爲:

two.fx:12: message has script only (default) write access in tutorial.one
o.message = "Changing the message..."; // WON'T COMPILE
^
1 error
 

這就證實了預期的行爲:該變量可以公開初始化,但是後續的寫入將由其他訪問級別來控制。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章