2021年大数据常用语言Scala(二十九):scala面向对象 单例对象
目錄
單例對象
定義object - 掌握
伴生對象 - 掌握
apply方法 - 掌握
main方法
單例對象
Scala中沒有static關鍵字,但是它支持靜態
如果要定義靜態的東西,統統定義到object中
語法:
object?xxx{
??// 內容
}
反向理解,class中的東西, 全部是 非靜態的
?
定義object - 掌握
定義單例對象和定義類很像,就是把class換成object
示例:定義一個工具類,用來格式化日期時間
object?DateUtils {// 在object中定義的成員變量,相當于Java中定義一個靜態變量// 定義一個SimpleDateFormat日期時間格式化對象val?simpleDateFormat =?new?SimpleDateFormat("yyyy-MM-dd HH:mm")// 構造代碼println("構造代碼")// 相當于Java中定義一個靜態方法def?format(date:Date)?=?simpleDateFormat.format(date)// main是一個靜態方法,所以必須要寫在object中def?main(args:?Array[String]):?Unit?=?{println {?DateUtils.format(new?Date())?};}
}
?
使用object 單例對象名定義一個單例對象,可以用object作為工具類或者存放常量
在單例對象中定義的變量,類似于Java中的static成員變量
在單例對象中定義的方法,類似于Java中的static方法
object單例對象的構造代碼可以直接寫在花括號中
調用單例對象的方法,直接使用單例對象名.方法名,訪問單例對象的成員變量也是使用單例對象名.變量名
單例對象只能有一個無參的主構造器,不能添加其他參數
?
伴生對象 - 掌握
在Java中,經常會有一些類,同時有實例成員又有靜態成員。如下:
public?class?CustomerService {private?static?Logger?logger =?Logger.getLogger("customerService");public?void?save(String?customer)?{logger.info("添加一個用戶");// 保存客戶}public?static?void?main(String[]?args)?{new?CustomerService().save("客戶");}
}
?
在scala中,可以使用伴生對象來實現。
?
一個class和object具有同樣的名字。這個object稱為伴生對象,這個class稱為伴生類
?
實例1:使用scala重寫上面的案例。
?
class?CustomerService {private?val?serviceName =?"CustomerService"def?save(customer:String):Unit?=?{// 在類中可以獲取伴生對象的私有成員變量CustomerService.logger.info("添加一個用戶")// 新增客戶}
}// 定義一個伴生對象
object?CustomerService {// 定義一個日志器private?val?logger =?Logger.getLogger("CustomerService")def?main(args:?Array[String]):?Unit?=?{val?customerService =?new?CustomerService()customerService.save("張三")// 在伴生對象中也可以訪問伴生類的私有方法println(customerService.serviceName)}
}
?
伴生類和伴生對象的名字必須是一樣的
伴生類和伴生對象需要在一個scala源文件中
伴生類和伴生對象可以互相訪問private的屬性
?
apply方法 - 掌握
我們之前使用過這種方式來創建一個Array對象。
?
// 創建一個Array對象
val?a =?Array(1,2,3,4)
?
這種寫法非常簡便,不需要再寫一個new,然后敲一個空格,再寫類名。如何直接使用類名來創建對象呢?
?
查看scala源代碼:
?
?
答案就是:實現伴生對象的apply方法
伴生對象的apply方法用來快速地創建一個伴生類的對象。
?
示例1:
class?Person(var?name:String,?var?age:Int)?{override?def?toString =?s"Person($name, $age)"
}object?Person {// 實現apply方法// 返回的是伴生類的對象def?apply(name:String,?age:Int):?Person =?new?Person(name,?age)// apply方法支持重載def?apply(name:String):Person =?new?Person(name,?20)def?apply(age:Int):Person =?new?Person("某某某",?age)def?apply():Person =?new?Person("某某某",?20)
}object?Main2 {def?main(args:?Array[String]):?Unit?=?{val?p1 =?Person("張三",?20)val?p2 =?Person("李四")val?p3 =?Person(100)val?p4 =?Person()println(p1)println(p2)println(p3)println(p4)}
}
?
當遇到類名(參數1, 參數2...)會自動調用apply方法,在apply方法中來創建對象
定義apply時,如果參數列表是空,也不能省略括號(),否則引用的是伴生對象
?
main方法
scala和Java一樣,如果要運行一個程序,必須有一個main方法。而在Java中main方法是靜態的,而在scala中沒有靜態方法。在scala中,這個main方法必須放在一個object中。
?
示例1:
object?Main5 {def?main(args:Array[String])?=?{println("hello, scala")}
}
?
也可以繼承自App Trait(特質),然后將需要編寫在main方法中的代碼,寫在object的構造方法體內。
示例2:
object?Main5 extends?App {println("hello, scala")
}
?
總結
以上是生活随笔為你收集整理的2021年大数据常用语言Scala(二十九):scala面向对象 单例对象的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021年大数据常用语言Scala(二十
- 下一篇: 2021年大数据常用语言Scala(三十