目录
一、类
语法:
[修饰符] class 类名 {
类体
}
(1)Scala语法中默认就是public
(2)一个Scala源文件可以包含多个类
class stu {
}
二、属性
属性是类的一个组成部分
语法:
[修饰符] var|val 属性名称 [:类型] = 属性值
注:Bean属性(@BeanPropetry),可以自动生成规范的setXxx/getXxx方法
var name: String = "ls" //定义属性
var age: Int = _ // _表示给属性一个默认值
//val修饰的属性不能赋默认值,必须显示指定
//Bean属性(@BeanProperty)
@BeanProperty var sex: String = "男"
三、单例对象(伴生对象)
语法:
object stu{
val name:String="zz"
}
(1)单例对象采用object关键字声明
(2)单例对象对应的类称之为伴生类,伴生对象的名称应该和伴生类名一致。
(3)单例对象中的属性和方法都可以通过伴生对象名(类名)直接调用访问。
//伴生对象采用object关键字声明
object stu {
var name: String = "zz"
}
//伴生对象对应的类称之为伴生类,伴生对象的名称应该和伴生类名一致。
class stu {
var age: Int = 18
}
object Test {
def main(args: Array[String]): Unit = {
//伴生对象中的属性和方法都可以通过伴生对象名(类名)直接调用访问。
println(stu.name)
}
}
四、apply方法
(1)通过伴生对象的apply方法,实现不使用new方法创建对象。
(2)如果想让主构造器变成私有的,可以在()之前加上private。
(3)apply方法可以重载。
(4)Scala中obj(arg)的语句实际是在调用该对象的apply方法,即obj.apply(arg)。用以统一面向对象编程和函数式编程的风格。
(5)当使用new关键字构建对象时,调用的其实是类的构造方法,当直接使用类名构建对象时,调用的其实时伴生对象的apply方法。
object applydemo {
def main(args: Array[String]): Unit = {
val stu01 : Stu = Stu.apply()
val stu02 : Stu = Stu.getStu()
// apply方法在调用的时候 可以不写方法名称
val stu03 : Stu = Stu()
// 如果一个方法不写方法名称 一定是调用apply方法 举例:
val ints: Array[Int] = Array(1, 2, 3, 4)
// 类的apply方法需要使用创建好的类的对象去调用
stu03()
}
}
class Stu private(){
// 在类中也可以有apply方法
// 并且apply方法的功能也是完全可以自定义的
def apply(): Unit = println("apply方法")
}
object Stu {
def getStu() : Stu = new Stu
def apply() : Stu = new Stu()
}
五、单例模式的实现
代码如下,在主方法中创建两个对象判断对象的地址值是否相同来判断是否为单例模式
def main(args: Array[String]): Unit = {
val stu03 : stu = stu()
val stu04 : stu = stu()
println(stu03.eq(stu04))
}
class stu private(){
}
// 懒汉式
// 优点: 节约内存 一直等到对象需要使用的时候 才会创建对象 不会在最开始占用对象的内存
// 缺点: 不是线程安全的 如果多个线程在第一次使用对象的时候 同时进入if判断 会造成错误
// -> 可以通过双层判断添加线程锁来解决
//object stu{
// private var stu01 : stu = null
//
// def apply(): stu = {
// if(stu01 != null){
// stu01 = new stu
// }
// stu01
// }
//}
// 饿汉式
// 优点: 简单好理解
// 缺点: 占用内存 -> 在类加载的时候 即jvm初始化的时候 就已经创建了对象
// -> 大数据资源比较充足 使用饿汉式不会造成影响
object stu{
private var stu02 : stu = new stu
def apply(): stu = stu02
}