学习JavaFX脚本语言----10,11(完)

[size=16px]Lesson 10: Packages[/size]

目录

- 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。


[size=16px]Lesson 11: Access Modifiers[/size]

目录

- 默认访问权限
- 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》。 :D
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 支持向量机非线性回归通用MATLAB程序解析 #### 一、概述 本文将详细介绍一个基于MATLAB的支持向量机(SVM)非线性回归的通用程序。该程序采用支持向量机方法来实现数据的非线性回归,并通过不同的核函数设置来适应不同类型的数据分布。此外,该程序还提供了数据预处理的方法,使得用户能够更加方便地应用此程序解决实际问题。 #### 二、核心功能与原理 ##### 1. 支持向量机(SVM) 支持向量机是一种监督学习模型,主要用于分类和回归分析。对于非线性回归任务,SVM通过引入核技巧(kernel trick)将原始低维空间中的非线性问题转换为高维空间中的线性问题,从而实现有效的非线性建模。 ##### 2. 核函数 核函数的选择直接影响到模型的性能。本程序内置了三种常用的核函数: - **线性核函数**:`K(x, y) = x'y` - **多项式核函数**:`K(x, y) = (x'y + 1)^d` - **径向基函数(RBF)**:`K(x, y) = exp(-γ|x - y|^2)` 其中RBF核函数被广泛应用于非线性问题中,因为它可以处理非常复杂的非线性关系。本程序默认使用的是RBF核函数,参数`D`用于控制高斯核函数的宽度。 ##### 3. 数据预处理 虽然程序本身没有直接涉及数据预处理的过程,但在实际应用中,对数据进行适当的预处理是非常重要的。常见的预处理步骤包括归一化、缺失值处理等。 ##### 4. 模型参数 - **Epsilon**: ε-insensitive loss function的ε值,控制回归带宽。 - **C**: 松弛变量的惩罚系数,控制模型复杂度与过拟合的风险之间的平衡。 #### 三、程序实现细节 ##### 1. 函数输入与输出 - **输入**: - `X`: 输入特征矩阵,维度为(n, l),其中n是特征数量,l是样本数量。 - `Y`: 目标值向量,长度为l。 - `Epsilon`: 回归带宽。 - `C`: 松弛变量的惩罚系数。 - `D`: RBF核函数的参数。 - **输出**: - `Alpha1`: 正的拉格朗日乘子向量。 - `Alpha2`: 负的拉格朗日乘子向量。 - `Alpha`: 拉格朗日乘子向量。 - `Flag`: 标记向量,表示每个样本的类型。 - `B`: 偏置项。 ##### 2. 核心代码解析 程序首先计算所有样本间的核矩阵`K`,然后构建二次规划问题并求解得到拉格朗日乘子向量。根据拉格朗日乘子的值确定支持向量,并计算偏置项`B`。 - **核矩阵计算**:采用RBF核函数,通过`exp(-(sum((xi-xj).^2)/D))`计算任意两个样本之间的相似度。 - **二次规划**:构建目标函数和约束条件,使用`quadprog`函数求解最小化问题。 - **支持向量识别**:根据拉格朗日乘子的大小判断每个样本是否为支持向量,并据此计算偏置项`B`。 #### 四、程序扩展与优化 - **多核函数支持**:可以通过增加更多的核函数选项,提高程序的灵活性。 - **自动调参**:实现参数自动选择的功能,例如通过交叉验证选择最优的`Epsilon`和`C`值。 - **并行计算**:利用MATLAB的并行计算工具箱加速计算过程,特别是当样本量很大时。 #### 五、应用场景 该程序适用于需要进行非线性回归预测的场景,如经济预测、天气预报等领域。通过调整核函数和参数,可以有效应对各种类型的非线性问题。 ### 总结 本程序提供了一个支持向量机非线性回归的整实现框架,通过灵活的核函数设置和参数调整,能够有效地处理非线性问题。对于需要进行回归预测的应用场景,这是一个非常实用且强大的工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值