
类主构造器
主构造器的定义与类的定义交织在一直,将构造器参数直接放在类名称之后,如下代码:

//当在创建对象时,需要进行相关初始化操作时,可以将初始化语句放在类体中,同样也可以在类中添加或重写相关方法
class Person(val name:String,val age:Int){
//println将作为主构建器中的一部分,在创建对象时被执行
println("constructing Person ........")
//重写toString()方法
override def toString()= name + ":"+ age
}
scala> val p=new Person("john",29)
constructing Person ........
p: Person = john:29
主构造器还可以使用默认参数
//默认参数的主构建器
class Person(val name:String="",val age:Int=18){
println("constructing Person ........")
override def toString()= name + ":"+ age
}
scala> val p=new Person
constructing Person ........
p: Person = :18
scala> val p=new Person("john")
constructing Person ........
p: Person = john:18
辅助构造器
//具有主构建函数和辅助构建函数的Person类
class Person(var name:String,var age:Int){
//类成员
private var sex:Int=0
//辅助构造器
def this(name:String,age:Int,sex:Int){
this(name,age)
this.sex=sex
}
}
禁用主构造器
可以将主构造器设置为private来禁用主构造器
//禁用主构造函数
class Person private(var name:String,var age:Int)
{
//类成员
private var sex:Int=0
//辅助构造器
def this(name:String,age:Int,sex:Int)
{
this(name,age)
this.sex=sex
}
}
综上可知scala的构造还是只是简化了下,写在类的参数中。。真的是函数式编程。
单例对象
在某些应用场景下,我们可能不需要创建对象,而是想直接调用方法,但是Scala语言并不支持静态成员,Scala通过单例对象来解决该问题。单例对象的创建方式如下:

伴生对象与伴生类
在前面单例对象的基础之上,我们在object Student所在的文件内定义了一个class Student,此时object Student被称为class Student的伴生对象,而class Student被称为object Student的伴生类:

从上面的代码中不难看出,其实伴生对象与伴生类本质上是不同的两个类,只不过伴生类与伴生对象之间可以相互访问到对主的成员包括私有的成员变量或方法,例如:

apply方法
通过利用apply方法可以直接利用类名创建对象,例如可以通过val intList=List(1,2,3)这种方式创建初始化一个列表对象,其实它相当于调用val intList=List.apply(1,2,3),只不过val intList=List(1,2,3)这种创建方式更简洁一点,但我们必须明确的是这种创建方式仍然避免不了new,它后面的实现机制仍然是new的方式,只不过我们自己在使用的时候可以省去new的操作。下面就让我们来自己实现apply方法,代码如下:

应用程序对象
利用IDE开发scala应用程序时,在运行程序时必须指定main方法作为程序的入口,例如:
object Student {
//必须定义mian方法作为程序的入口才能执行
def main(args: Array[String]): Unit = {
val s1=Student("john",29)
println(s1.name)
println(s1.age)
}
}
除了这种方式之外,scala还提供了一种机制,即通过扩展App,在Scala IDE for Eclipse里是通过new->scala app方式创建的 。也可在代码直接指定:
//扩展App后,程序可以直接运行,而不需要自己定义main方法,代码更简洁
object AppDemo extends App {
println("App Demo")
}
抽象类
抽象类是一种不能被实例化的类,抽象类中包括了若干不能完整定义的方法,这些方法由子类去扩展定义自己的实现。
//scala中的抽象类定义
abstract class Animal {
def eat:Unit
}
除抽象方法外,抽象类中还可以有抽象字段:
abstract class Animal {
//抽象字段(域)
//一般类中定义字段的话必须初始化,而抽象类中则没有这要求
var height:Int
//抽象方法
def eat:Unit
}
//Person继承Animal,对eat方法进行了实现
//通过主构造器对height参数进行了初始化
class Person(var height:Int) extends Animal{
//对父类中的方法进行实现,注意这里面可以不加override关键字
def eat()={
println("eat by mouth")
}
}
//通过扩展App创建程序的入口
object Person extends App{
new Person(10).eat()
}
网友评论