第 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
 

这就证实了预期的行为:该变量可以公开初始化,但是后续的写入将由其他访问级别来控制。

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