標籤:blank 單例模式 lib rem 友元類 private star bar board
1.class
Scala的類和C#中的類有點不一樣,諸如: 聲明一個未用priavate修飾的欄位 var age,scala編譯器會欄位幫我們生產一個私人欄位和2個公有方法get和set ,這和C#的簡易屬性類似;若使用了private修飾,則它的方法也將會是私人的。這就是所謂的統一訪問原則。
細節的東西太多,還是上代碼在注釋裡面細講吧
[java] view plain copy
- //類預設是public層級的
- class Person{
- var age=18 //欄位必須得初始化()
- def Age=age //這個是方法,沒有參數可以省略()
- def incremen(){this.age+=1}
- }
-
-
- class Student{
- var age=20 //底層編譯器會自動為私人的age添加get和set的公有方法,可以理解為偽public類型
- private[this] var gender="male" //private[this] 只有該類的this可以使用
- private var name="clow" //聲明了private,底層編譯器會自動為私人的name添加get和set的私人方法
- //但是可以自己定義屬性方法
- def getName=this.name
- def setName(value:String){this.name=value}
- }
-
- //構造器的使用
- class Teacher {
- var age: Int = _
- var name: String = _ //可以預留
-
- //重載的構造器和C#裡面的public Teacher(){}類似
- def this(age: Int, name: String){
- this() //必須得調用一次主構造器
- this.age=age
- this.name=name
- }
- }
類的構造器細節
[java] view plain copy
- //1.主構造器在類名後,參數會被聲明欄位,若參數沒有使用var或者val聲明,則會被聲明稱私人欄位
- //2.執行個體化類的時候,類中的語句會被執行:println("person")
- class Person(name:String,var age:Int) {
- println("person")
-
- def show(): Unit = {
- println("show.."+name)
- }
-
- var gender:String=_
-
- //次構造器必須調用主構造器,參數不能使用var
- def this(name:String,age:Int, gender:String){
- this(name,age)
- this.gender=gender
- }
- }
2.scala沒有靜態修飾符,但object下的成員都是靜態 ,若有同名的class,這其作為它的伴生類。在object中一般可以為伴生類做一些初始化等操作,如我們常常使用的val array=Array(1,2,3) (ps:其使用了apply方法)
[java] view plain copy
- object Dog{
- private var age=0
- def Age={
- age+=1
- age
- }
- }
-
- class Dog{
- var age1=Dog.age //Dog.age是object Dog的私人欄位。這不禁讓我回想起了C++的友元類
- }
3.Apply的使用
[java] view plain copy
- class ApplyTest{
-
- val name="clow";
- def apply() {
- println("class ApplyTest--apply()...");
- }
-
- }
-
- //object下的成員預設都是靜態
- object ApplyTest{
- def apply() = {
- println("object ApplyTest--apply()...");
- new ApplyTest()
- }
- }
-
-
- object Basic4 {
-
- def main(args: Array[String]) {
- //類名()->調用了對應object下的apply方法
- var a1=ApplyTest()
- println(a1.name)
- //對象名()->調用了對應class的apply方法
- a1() //輸出:class ApplyTest--apply()...
- }
- }
Apply怎麼用它來實現單例模式
[java] view plain copy
- class ApplyTest private{ //添加private隱藏構造器
- def sayHello(){
- println("hello jop")
- }
- }
-
- object ApplyTest{
- var instant:ApplyTest=null
- def apply() ={
- if(instant==null) instant=new ApplyTest
- instant
-
- }
- }
-
- object ApplyDemo {
- def main(args:Array[String]){
- val t=ApplyTest()
- t.sayHello()
- }
- }
scala中object和class的理解---apply方法是初始化方法