Lesson 10: Packages
目录
- Step 1: 选择一个包名
- Step 2: 创建目录
- Step 3: 添加包声明
- Step 4: 添加访问权限
- Step 5: 编译源码
- Step 6: 使用类
到这里,你对javaFX的基础应该比较熟悉了。但是对于源文件的存放,你可能还不是很清楚(你现在可能是用的一个文件夹来存放所有的例子代码)我们将把代码放到包中,来改变你对存放代码的认识。(We can improve our overall organization by placing our code into packages.)
包能够让你按功能来将代码分类保存。它还给你的类一个唯一的命名空间。我们将在下面一步步的来将Address类存放到一个特殊的包内。
-Step 1: 选择一个包名
在我们修改代码前,我们需要给包起个名字。由于我们的Address类是假设用在addressbook应用上的,所以我们使用"addressbook"作为包名。
-Step 2: 创建目录
接着,我们必须创建一个addressbook目录。这个目录里面将包含所有我们设计的属于addressbook这个包的.fx文件。你可以在任意的地方创建目录。我们在例子里面使用
/home/demo/addressbook,但是脚本必须在一个和包名相同的目录里面,这里就是
addressbook
-Step 3: 添加包声明
现在,到addressbook目录里面创建Address.fx源代码文件。粘贴下面的代码到源代码文件里面去。第一行提供了一个包声明,这将表示这个类属于addressbook这个包。
package addressbook;
class Address {
var street: String;
var city: String;
var state: String;
var zip: String;
}
注意了,如果源代码里面有包声明,它必须在其它代码的前面,即源码文件的第一行。没个源文件只能有一个包声明。
-Step 4: 添加访问权限
接下来,我们需要在Address的类和变量上加上pulic关键字。
package addressbook;
public class Address {
public var street: String;
public var city: String;
public var state: String;
public var zip: String;
}
这个关键字是5个访问限制修饰符里面的一个。我们会在下一节介绍访问限制修饰符。现在你只要知道,public关键字使得这段代码能够被其他的类和脚本访问。
-Step 5:编译源码
依然在addressbook目录里面,像平时一样使用javafxc Address.fx命令编译即可。编译完成后,这个文件夹里面将包含编译得到的.class文件。
-Step 6: 使用类
现在我们能够测试修改后的Address类了。但是我们必须先返回到父目录 /home/demo。这里我们创建一个简单的脚本packagetest.fx类测试如何使用addressbook包。
我们有两种方法来访问这个类:
// Approach #1
addressbook.Address {
street: "1 Main Street";
city: "Santa Clara";
state: "CA";
zip: "95050";
}
Approach #1使用完整的类名创建了一个对象(addressbook.Address)。对比另一种方法,这种方法比较的笨拙,但是你还是需要知道有这种写法。
// Approach #2
import addressbook.Address;
Address {
street: "1 Main Street";
city: "Santa Clara";
state: "CA";
zip: "95050";
}
Approach #2使用import关键字,import关键字允许你以简短的名字在脚本里面使用类。当程序比较大时,推荐使用这种方法,因为它是self-documenting。
Lesson 11: Access Modifiers
目录
- 默认访问权限
- package访问权限修饰符
- protected访问权限修饰符
- public访问权限修饰符
- public-read访问权限修饰符
- public-init访问权限修饰符
-默认访问权限
当你不提供任何访问权限控制符的时候,就是默认的访问权限,也就是"script-only".这也是我们在教程里面最常使用的权限。
例子:
var x;
var x : String;
var x = z + 22;
var x = bind f(q);
这一级别的访问权限使得变量只能在脚本内被initialized, overridden, read, assigned, 或 bound.其他文件无法访问。
-package访问权限修饰符
为了让变量,方法或类能被包里的其他代码访问到,使用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();
你能使用下面的命令编译和运行这个例子:
javafxc tutorial/one.fx tutorial/two.fx
javafx tutorial/two
输出:
Hello from one.fx!
Hello from one.fx! (in function printMessage)
-protected访问权限修饰符
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!
Note:这个访问权限修饰符不能用在类上,这就是为什么我们在类one前面写的是public的原因。
-public访问权限修饰符
一个pulibc的类,变量,方法具有最大可见度,即,它可以被任意的类或脚本访问,不管是不是在一个包内。
例子:
// 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访问权限修饰符
public-read访问权限修饰符修饰的变量是公共的但是对外是只读的,只能被当前的脚本修改。如果想扩大它的可被修改的权限范围,在前面加上package或protected(ackage public-read 或者 protected public-read)这样的话,可以使得package或protected范围的代码能修改此变量。
例子:
// 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",这证明了x能够被tutorial/one.fx外的其他代码读取到。
现在我们来试着修改它的值:
// 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-init访问权限修饰符修饰的变量能被任何包里的对象初始化。初始化后的写操作权限限制,却是和public-read类似的访问控制。(默认是脚本级别的写操作,前面加上package或 protected就扩大了访问权限了)
例子:
// 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变量。但是,接下来的写操作权限却是script-only,我们不能修改它的值。
// 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
这证明了这个很特别的行为:对象能够被任意对象初始化,但是初始化以后却是受不同的访问级别控制的。
ps:呼!花了一周时间,终于翻译完了!还好语法比较简单,翻译难度不大!如果有时间和精力,还会翻译《Building GUI Applications With JavaFX》。