类参数
在创建类的对象时,有时候是需要通过传递某些信息进行初始化的,此时可以使用类参数。类参数看起来跟方法参数列表一样,但它是位于类名的后面,类似于其他高级语言的构造器(构造函数)。 我们定义了类ClassArg并制定了一个参数,使用new关键字创建对象时,需要指定参数a,我们还可以看到 val ca = new ClassArg(10); 会执行类体的打印语句,即使它在f()方法之前,这涉及到Scala 类的初始化过程:看似在f()之前执行;但其实类的所有的定义(值、方法)会在类体执行前初始化,也就是f()方法是先于打印语句初始化的。
如果使用 ca.a; 则会提示编译错误,因为a是在类ClassArg之外不可见的参数;如果要想类参数在类之外可见,可以使用 var、val修饰。 我们给处了示例类ClassArg2,通过ca2.a是可以获取参数a的值的。
在Scala常量、变量 一节中我们已经知道 val修饰的是不可变量,但是下面这段代码确实可运行的:
val ca2 = new ClassArg2(10) println(ca2.a) ca2.a = 17;
我们可以修改ca2的a值,这好比 ca2是我们的房子,a是里面的电视机(因为是var修饰的),我们虽然不可以变更房子,但是可以替换电视机。
可变类参数
有时候我们想使用更多的类参数来定义类,那么可以使用 可变元参数列表 来支持任意数量的参数,方法是在末尾加上一个 * 。
以下是关于Scala类参数的一个完整实例程序,
代码语言:javascript复制package com.byron4j.scala.basic
/**
* 类参数
*/
object ClassArgDemo {
def main(args: Array[String]): Unit = {
val ca = new ClassArg(10);
//提示a不是类ClassArg的成员变量
//ca.a;
val ca2 = new ClassArg2(10)
println(ca2.a)
ca2.a = 17;
//ca2被定义成了val,但是可以更改其成员变量的值,只要不是直接修改ca2引用。
println(ca2.a)
//ca2 = new ClassArg2(10) //ERROR:重新赋值
new ClassArg3(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
}
}
//a 在类的外面是不可见的
class ClassArg(a: Int){
//看似在f()之前执行;但其实类的所有的定义(值、方法)会在类体执行前初始化,也就是f()方法是先于打印语句初始化的
println( f() )
def f(): Int = { a * 10 }
}
//要想使a在类外面可见,可以使用var、val修饰
class ClassArg2(var a: Int){
//看似在f()之前执行;但其实类的所有的定义(值、方法)会在类体执行前初始化,也就是f()方法是先于打印语句初始化的
println( f() )
def f(): Int = { a * 10 }
}
class ClassArg3(a: Int *){
println("ClassArg3.result() = " result())
def result(): Int = {
var sum = 0;
for( ele <- a ){
sum = ele
}
sum
}
}
可以尝试运行输出结果:
100 100 10 17 ClassArg3.result() = 55
具名参数、可变参数
具名参数
具名参数 即在参数列表中指定名字的参数,创建具有参数列表的类的实例时,可以指定参数的名字;调用函数时同样可以指定参数名。
具名参数 对于提高代码的阅读性比较有用,尤其是长且复杂的参数列表。 具名参数显得很清楚的话,读者甚至无需再查阅文档。
代码语言:javascript复制package com.byron4j.scala.basic
object NamedArgDemo {
def main(args: Array[String]): Unit = {
// 具名参数实例 satrt...
new Color(80, 9, 100);
// 创建具有参数列表的类实例时,可以指定参数名字
new Color(red = 80, blue = 9, green = 100);
// 具名参数实例 end.
render(red = 1, blue = 2, green = 3);
}
def render(red: Int, blue: Int, green: Int): Unit= {
println("red=" red ", blue=" blue ", green=" green)
}
}
class Color(red: Int, blue: Int, green: Int)
缺省参数
具名参数 与 缺省参数 一块使用时,具名参数显得更有用。 这里的 缺省参数 指的是在类定义中给出其缺省值:
render4Default函数第二、三个参数有缺省值,所以在调用时可以通过以下方式使用:
//调用缺省值的函数时,缺省参数可以不指定 render4Default(red = 1);
示例代码如下:
代码语言:javascript复制package com.byron4j.scala.basic
object NamedArgDemo {
def main(args: Array[String]): Unit = {
// 具名参数实例 satrt...
new Color(80, 9, 100);
// 创建具有参数列表的类实例时,可以指定参数名字
new Color(red = 80, blue = 9, green = 100);
// 具名参数实例 end.
render(red = 1, blue = 2, green = 3);
//调用缺省值的函数时,缺省参数可以不指定
render4Default(red = 1);
}
def render(red: Int, blue: Int, green: Int): Unit= {
println("red=" red ", blue=" blue ", green=" green)
}
//缺省值
def render4Default(red: Int, blue: Int = 10, green: Int = 20): Unit= {
println("red=" red ", blue=" blue ", green=" green)
}
}
class Color(red: Int, blue: Int, green: Int)
输出:
red=1, blue=2, green=3 red=1, blue=10, green=20
如果所有参数都是缺省的,则创建类实例、调用函数时可以省略参数列表
函数:
def render4AllDefault(red: Int = 5, blue: Int = 10, green: Int = 20): Unit= { println(“red=” red “, blue=” blue “, green=” green) }
调用:
render4AllDefault()
类参数全部缺省:
class Color4AllDefault(red: Int = 4, blue: Int = 6, green: Int = 7){ println(“创建 Color4AllDefault 实例”) }
创建类实例:
var v = new Color4AllDefault
创建实例 v 的同时,我们看到执行了类体,在控制台输出了:创建 Color4AllDefault 实例