类与对象
JavaFX中声明类的语法:在class关键字后面跟着类名,接着是可选的extends关键字和由逗号分割的基类名列表,一个开放的大括号(),在大括号中间的每一个语法逻辑行都使用分号结尾。
例如:
class Person {
attribute name: String;
attribute parent: Person inverse Person.children;
attribute children: Person* inverse Person.parent;
function getFamilyIncome(): Number;
function getNumberOfChildren(): Number;
operation marry(spouse: Person);
}
属性的声明方式:attribute关键字后面跟着属性名,一个冒号,属性类型,可选的重数(cardinality)说明(?代表不确定,*代表零个或者更多,+代表一个或者更多),一个可选的、用来说明与类中另一属性之间双向关系的反向子句(inverse clause),并使用分号结束。
attribute AttributeName : AttributeType Cardinality inverse ClassName.InverseAttributeName;
如果反向子句出现在对象属性定义中,那么当此属性值被修改时JavaFX解释器将自动更新其反向属性(根据更新的类型和属性的重数进行插入、删除或者替换)。
多值属性(例如那些使用*或者+重数描述符声明的属性)被表示为数组,并能够通过[]操作符访问,并使用insert和delete操作符更新。
和Java方法不同,所有的JavaFX成员操作体和成员函数体都被定义在类声明外部,例如:
function Person.getNumberOfChildren() {
return sizeof this.children;
}
在类声明中对操作和函数的声明都需要对参数和返回值类型进行声明,而在操作体和函数体的具体定义中则可被忽略。
属性声明
在JavaFX中可以声明属性的初始值。在新建对象上下文中的初始化程序按照声明顺序被逐一求值(见下例的粗体部分):
import java.lang.System;
class X {
attribute a: Number;
attribute b: Number;
}
attribute X.a = 10;
attribute X.b = -1;
var x = new X();
System.out.println(x.a); // prints 10
System.out.println(x.b); // prints -1
还可以通过bind操作将增量式求值表达式(incrementally evaluated expression)声明为属性值:
import java.lang.System;
class X {
attribute a: Number;
attribute b: Number;
attribute c: Number;
}
attribute X.a = 10;
attribute X.b = bind a + 10;
attribute X.c = bind lazy b + 10;
var x = new X();
System.out.println(x.a); // prints 10
System.out.println(x.b); // prints 20
System.out.println(x.c); // prints 30
x.a = 5;
System.out.println(x.a); // prints 5
System.out.println(x.b); // prints 15
System.out.println(x.c); // prints 25
对象声明
JavaFX使用由类名、用大括号包含的属性初始化程序列表构成的说明性语法来完成对象的初始化。每个初始化程序由属性名、冒号、定义属性值的表达式(JavaFX也支持在上下文中进行增量式求值,详见下面的章节)构成:
var chris = Person {
name: "Chris"
children:
[Person {
name: "Dee"
},
Person {
name: "Candice"
}]
};
JavaFX也支持Java对象的初始化语法。你可以象在Java中一样传递参数给类构造器:
import java.util.Date;
import java.lang.System;
var date1 = new Date(95, 4, 23); // call a java constructor
var date2 = Date { // create the same date as an object literal
month: 4
date: 23
year: 95
};
System.out.println(date1 == date2); // prints true
JavaFX允许在对象中声明本地变量。这些变量只在对象本身的范围内可见。另外,一个引用被初始化对象的变量可以通过var关键字声明为假属性(pseudo-attribute),就如下例中的child1和child2一样:
var chris = Person {
var: me
name: "Chris"
var child1 = Person {
name: "Dee"
parent: me
}
var child2 = Person { name: "Candice" }
children: [child1, child2]
};