文章目录
前言
你们好我是啊晨
首先呢,内容很多,分为几篇,选择阅读就好,很详细。
请:
一、类
1、类的定义
//在Scala中,类的定义可以通过class关键字实现,类并不用声明为public。
//Scala源文件中可以包含多个类,所有这些类都具有公有可见性。
//文件名称和类名没有强制性的关系
class Dog {
//属性必须有初始值,如果不想有初始值初始化为_下划线,赋值为_是必须指定数据类型,,并且 需要使用var声明
private var leg = 4
def shout(content: String) {
println(content)
}
def currentLeg = leg
}
使用这个类:
//在Scala中,类并不用声明为public。
val dog = new Dog
//调用方法,通过对象.方法 对象+空格+方法
dog shout "汪汪汪"
dog.shout("汪汪汪")
println(dog currentLeg)
println(dog.currentLeg)
//访问属性,通过对象.属性 对象+空格+属性
dog.leg = 4
println(“leg = “+dog.leg)
dog leg = 4
println(dog leg)
//在Scala中,类并不用声明为public。
//Scala源文件中可以包含多个类,所有这些类都具有公有可见性。
class Person {
//用val修饰的变量是只读属性,有getter但没有setter
//(相当与Java中用final修饰的变量)
val id = "9527"
//用var修饰的变量既有getter又有setter
var age: Int = 18
// _代表初始值,使用时属性必须指定类型。并且是var声明
var color:Strng = _
//类私有字段,只能在伴生对象和类的内部使用
private var name: String = "唐伯虎"
//对象私有字段,访问权限更加严格的,当前对象的字段只能被Person类的方法访问到
//对象私有字段,只能在类的内部使用
private[this] val pet = "小强"
}
尖叫提示:在Scala中,类并不声明为Public,一个Scala源文件可以包含多个类。所有这些类都具有公有可见性。调用无参方法时,可以加(),也可以不加;如果方法定义中不带括号,那么调用时就不能带括号。
2、Getter Setter方法
对于scala类中的每一个属性,编译后,会有一个私有的字段和相应的getter、setter方法生成:
//getter
println(dog leg)
//setter
//对象.属性_=(值)
dog.leg_=(10)
println(dog currentLeg)
当然了,你也可以不使用自动生成的方式,自己定义
getter和setter方法
class Dog2 {
private var _leg = 4
def leg = _leg
def leg_=(newLeg: Int) {
_leg = newLeg
}
}
使用之:
val dog2 = new Dog2
dog2.leg_=(10)
println(dog2.leg)
@BeanProperty
**尖叫提示:**自己手动创建变量的getter和setter方法需要遵循以下原则:
- 字段属性名以“_”作为前缀,如:_leg
- getter方法定义为:def leg = _leg
- setter方法定义时,方法名为属性名去掉前缀,并加上后缀,后缀是:“leg_=”,如例子所示
3、Bean属性
JavaBeans规范定义了Java的属性是像getXXX()和setXXX()的方法。许多Java工具都依赖这个命名习惯。为了Java的互操作性。将Scala字段加@BeanProperty时,这样的方法会自动生成。
创建一个Bean,使用@BeanProperty注解标识某个属性变量
import scala.beans.BeanProperty
class Person {
@BeanProperty var name: String = _
}
通过getName、setName访问属性
val person = new Person
person.setName("Nick")
person.getName
println(person.name)
尖叫提示:
Person将会生成四个方法:
–name:String
–name_=(newValue:String): Unit
–getName():String
–setName(newValue:String):Unit
4、构造器
scala中构造分为主构造器和辅助构造器
注意:主构造器会执行类定义中的所有语句
/**
*每个类都有主构造器,主构造器的参数直接放置类名后面,与类交织在一起
*/
class Student(val name: String, val age: Int){
//主构造器会执行类定义中的所有语句
println("执行主构造器")
private var gender = "male"
//用this关键字定义辅助构造器
def this(name: String, age: Int, gender: String){
//每个辅助构造器必须以主构造器或其他的辅助构造器的调用开始
this(name, age)
println("执行辅助构造器")
this.gender = gender
}
}
//主构造器中name属性没有初始值,age属性有初始值,那么在调用主构造创建对象是,可以不传age这个参数的值
class Teacher(var name:String,var age:Int=30) {
}
//如果在主构造器中属性有初始值,那么在调用主构造创建对象是,可以不传这个参数的值
val t01 = new Teacher("xiaoming")
println(" t01 name "+t01.name)
println("t01 age = "+t01.age)
/**
*如果在主构造器中定义的参数不带val或var,这定义的参数不是类的属性,不能通过
对象.参数名称 调用
*如果在主构造器中定义的参带val或var,这定义的参数提升为类的属性,能通过
对象.参数名称 调用
*构造器参数可以不带val或var,如果不带val或var的参数至少被一个方法所使用,
*那么它将会被提升为字段,
*/
//在类名后面加private就变成了私有的,伴生对象中可以调用主构造器
class Queen private(val name: String, prop: Array[String], private var age: Int = 18){
println(prop.size)
//prop被下面的方法使用后,prop就变成了不可变得对象私有字段,等同于private[this] val prop
//如果没有被方法使用该参数将不被保存为字段,仅仅是一个可以被主构造器中的代码访问的普通参数
def description = name + " is " + age + " years old with " + prop.toBuffer
}
object Queen{
def main(args: Array[String]) {
//私有的构造器,只有在其伴生对象中使用
val q = new Queen("hatano", Array("蜡烛", "皮鞭"), 20)
println(q.description())
}
}
二、对象
1、单例对象
在Scala中没有静态方法和静态字段,但是可以使用object这个语法结构来达到同样的目的
1.存放工具方法和常量
2.高效共享单个不可变的实例
3.单例模式
class SingleTon private() {
}
object SingleTon{