JavaFx中的类和对象
import类
JavaFx中的import跟Java中的是完全一样的。
import 包名.类名;
import 包名.*;
import 语句应该放在程序的最开头,在其他语句之前。JavaFx内建的类都放在javafx.*下面,不过,我们还是可以直接引入Java的包。就像这样:
import javafx.application.*;
import java.lang.System;
package
声明自己的包,这个语法和Java中也是完全一样的。比如我们的用例代码中,都声明为:
package example;
编译的时候,生成的.class文件,会放在example文件夹内。
定义类
定义一个类,需要用到class关键字。跟Java不同的是,JavaFx支持多继承,所以在extends后面可以出现多个基类。语法定义如下:
class 类名 [extends 基类1, 基类2...] {
定义类属性和类方法...
}
鉴于JavaFx支持多继承,所以会有一些跟Java不同的规则
简单类直接或者间接继承于Java类
复合类肯定不是简单类
默认情况下,JavaFx中定义的类,是复合类
类最多可以继承一个简单类。如果继承于简单类,这个类也是简单类。一个类可以继承任意多个复合类,或者是Java中定义的接口。
注:简单类目前是编译作一个Java类,复杂类编译成为一个Java类和一个Java接口。
定义类的时候,只有定义成public的才能被其他的脚本访问;否则的话,只有当前脚本内可以访问。默认是不带public的。
JavaFx的类不支持构造函数,必须使用类初始化的方式。如果需要模拟构造函数,可以定义一个静态方法,方法中返回一个新的实例。我们看一段脚本:classobject01.fx
package example;
import java.lang.System;
import java.util.Date;public class PlainClass extends Date {
}public class Fruite {
public function ready():Boolean {
return true;
}
}public class Food {
public function ok():Boolean {
return false;
}
}class Apple extends Fruite, Food {
attribute weight:Number;
}var a = Apple { weight: 100}
System.out.println("ready:{a.ready()}, ok:{a.ok()}, weight:{a.weight}");
我们把这个脚本编译起来,然后解释一下:
#javafxc classobject01.fx -d .#javafx example.classobject01
ready:true, ok:false, weight:100.0
接下来,我们看一下example包里面,被编译出什么来:
#dir example
classobject01.class
classobject01$Intf.class
classobject01$Food.class
classobject01$Food$Intf.class
classobject01$Fruite.class
classobject01$Fruite$Intf.class
classobject01$Apple.class
classobject01$Apple$Intf.class
classobject01$PlainClass.class
我们看到classobject01.fx编译出来不少内容。首先,我们的classobject01.fx脚本对应了两个Java Class,classobject01.class和classobject01$Intf.class,说明一个脚本被编译成为一个复合类,一个Java类,一个Java接口。脚本里面,有一个PlainClass,直接继承于java.utils.Date类,根据第四项规则,java.utils.Date是一个简单类,继承简单类的PlainClass也是简单类,简单类被编译成为一个Java Class,所以只有classobject01$PlainClass.class个文件。其他定义Fruite和Food,以及他们的子类Apple,都是复合类,因此都对应了两个Java Class,一个Java类,一个Java接口。Fruite和Food是定义在JavaFx中的类,作为复合类来对待。Apple继承于复合类,所以也是复合类。这里Apple用了多继承,最后还是被编译成两个.class文件。
创建实例
两种方式来创建实例,一种是用初始化,另一种是用new。
类名 { 属性:属性值... }
new 类名(参数,...)
比如:
var a = Apple { weight: 100};
System.out.println("ready:{a.ready()}, ok:{a.ok()}, weight:{a.weight}");
//这个是不允许的,new和初始化器不能混用
//var b = new Apple {weight:101};
var b = new Apple();
b.weight = 101;
System.out.println("ready:{b.ready()}, ok:{b.ok()}, weight:{b.weight}");
初始化器在JavaFx中比较常用,类名后面跟一个{...}。在花括号中,是一些属性初始化,属性名:表达式。