Scala语言(三)
面向对象基础
scala类中可以传参,这是与java不同的地方
(object不能传参)
传参一定要指明类型,类中的属性默认有getter()和setter()
package com.scala class Person(val xname:String, xage:Int){ val name = xname var age = xage } object scala_obj { def main(args: Array[String]): Unit = { val p = new Person("zhangsan",20) println(p.name) p.age = 30 println(p.age) println(p.xname) } }
类中传参,如果定义的是val,可以在外面直接调用
方法的定义
package com.scala class Person(val xname:String, xage:Int){ val name = xname var age = xage def sayName() = { println("hello world..." + scala_obj.name) } } object scala_obj { val name = "wangwu" def main(args: Array[String]): Unit = { val p = new Person("zhangsan",20) p.sayName() } }
从这也可以看出来object中定义的都是静态方法,可以直接类名.方法名调用的
类中重写构造
类中重写构造时,构造中第一行必须先调用默认的构造
def this()
package com.scala class Person(val xname:String, xage:Int){ val name = xname var age = xage var gender = 'M' def this(yname:String, yage:Int, ygender:Char){ this(yname,yage) this.gender = ygender } def sayName() = { println("hello world..." + scala_obj.name) } } object scala_obj { val name = "wangwu" def main(args: Array[String]): Unit = { val p = new Person("zhangsan",20) val p1 = new Person("diaochan",18,'F') println(p1.gender) } }
scala中当new class时,类中除了方法不执行(构造方法执行),其他都执行
package com.scala class Person(val xname:String, xage:Int){ val name = xname var age = xage var gender = 'M' println("**************Person Class*************") def this(yname:String, yage:Int, ygender:Char){ this(yname,yage) this.gender = ygender } def sayName() = { println("hello world..." + scala_obj.name) } println("======Person Class======") } object scala_obj { val name = "wangwu" def main(args: Array[String]): Unit = { val p1 = new Person("diaochan",18,'F') } }
会执行类中的println语句
scala中可以这样,java写println这样的语句必须写在方法里面
object是不可以传参的,除非使用apply方法
object scala_obj { def apply(i:Int) = { println("Score is " + i) } def main(args: Array[String]): Unit = { scala_obj(1000) } }
在同一个scala文件中,class名称和object名称一样时,这个类叫做这个对象的伴生类,这个对象叫做这个类的伴生对象,他们之间可以互相访问私有变量
Scala和Java一样,建议不要直接去暴露public字段,设置为私有,也提供了getter和setter方法,帮你读取和写入变量值
但getter和setter的实现和Java有点不太一样
这里的value_=是一个方法名称,可不是一个赋值的概念
没有参数的方法在定义的时候是可以把圆括号省略掉的
如果定义的时候把括号省略,那么后面调用的时候一定也不能加括号(如果定义的时候又括号,那么调用的时候可省略也可以带着)
并且这里的圆括号也可以用大括号{}来代替
如果整个方法体只有一条语句,也可以把大括号省略掉
当方法的返回结果类型可以从表达式推断出来的时候,可以省略结果的类型,不用再改方法名后面写个冒号属于什么类型
构造器
Scala构造器和Java的很大区别就是可以在类的名称后面的圆括号里面直接给出一些参数,而且如果构造器里面这个参数加了val或var这个关键字去修饰的话,系统会自动把它变成自己内部的成员字段,并且给它提供getter和setter方法。如果没有加val或var,则它不会变成一个内部字段,只是简单地起到往里传参的作用
运行
对象(单例对象)
这些都是Scala特有的
所有定义到单例对象当中的字段、方法都是静态的
互相能访问对方内部的成员变量和成员方法
apply方法
声明数组的时候Java和Scala的区别
实际上就称为工厂,会不断生成新的类的对象
那么Scala为什么不像Java那样new一个对象然后生成实例呢
是为了保持对象和函数的一致性
Scala融合面向对象和函数式编程两种风格
括号调用是函数调用
点方法是面向对象方法
同理,Scala对象也可以被看做是函数
如果类中已经定义了apply方法的话,就可以转换成函数式的调用风格
函数式方法可以在后台自动给你转成对象方法,因为有了apply调用
update和unapply方法