scala中的object 和class
Scala中的class与java类似,但是类名不是必须和文件名相同且一个文件可以定义多个class.同时scala中的class不存在静态成员,java中 的静态成员由scala中的object对象代替,当object对象名和class名相同时称object 为class的伴生对象,反过来class为object的伴生类,它们必须在同一文件中.
1.1 定义类
scala> class Hiscala{
| private val name:String="zhangsan"
| def sayName(){
| println(name)
| }
| def getName=name
| }
defined class Hiscala
scala> val hiscala=new Hiscala
hiscala: Hiscala = Hiscala@16edb8ee
scala> hiscala.sayName
zhangsan
scala> hiscala.getName
res3: String = zhangsan
1.2 定义object
object本身有默认的constructor ,这个constructor 只会被调用一次
scala> object Person{ println("Scala")
| val age=10
| def getAge=age
| }
defined object Person
scala> Person.getAge
Scala //第一次调用constructor
res0: Int = 10
scala> Person.getAge //不再调用
res1: Int = 10
伴生对象可以访问伴生类的私有成员
1.3 继承
与java很像,一继承多实现
//定义抽象类
abstract class Animal{
def eat={
println("Eat food!!!")
}
def run
}
//cat 继承Animal,实现了run方法并重写了eat方法
class Cat extends Animal{
override def eat:Unit={
println("Eat mouse!!!")
}
override def run:Unit={
println("Running...")
}
}
> 子类不能重写父类中的 `final`修饰的方法和属性
1.4 主构造器和辅助构造器
scala默认构造器就在类上 ,可以通过以下方式重载
class Person(name:String){
println(this.name)
def this(name:String,age:Int){
this(name) //重载构造器第一行必须是默认构造器或者其他构造器
println(name+":"+age)
}
def this(name:String,age:Int,sex:String)
{
this(name,age)
println(name+":"+age+":"+sex)
}
}
1.5 类的字段和方法
定义一个 Person类
class Person{
var name:String ="zhangsan"
var age =30
val sex ="famale"
def sayHi=println("Hi!!!")
def increase(age:Int):Int=this.age+age
}
//访问对象属性
val p=new Person
p.name
p.name="lisi"
p.sex
这里注意的是,scala中的
val
会有getter方法,var
会有setter 和getter方法.,这些方法都会自动生成,但是对于private
属性的setter和getter就需要自己写了,否则对象无法访问. scalc默认方法是public
的 ,若在方法的前面加上private
,则对象实例无法访问方法.
对于无参数的方法,无论定义时带不带括号,调用时都可以不带括号.建议都不要带括号,省事.
对于scala中的setter
和getter
方法的区别在下面的例子中说明
class Person{
private var myName="Frank" //定义一个私有对象,显然对象不能访问
//定义getter
def name=this.myName
//定义setter
def name_=(newName:String){
myName=newName
println("Hi:"+myName)
}
}
val person =new Person
println(person.name)
person.name="zhangsan" //这里实际调用的是name_ 系统会自动找这个函数
注意 def name_=(newName :String) 等号两边不能有空格
当然还可以用另外一种定义方式,这种方式就是直接在一个public函数里给它赋值,但是调用的时候就不是直接用person.name="zhangsan"
这种方式了,而是使用定义的函数名(比如update)person.update(newName)
然后就是神奇的
_
下划线,在scala中貌似妙用无穷,让我很懵逼,暂时写到这里吧.