scala中object和class的理解---apply方法是初始化方法

來源:互聯網
上載者:User

標籤:blank   單例模式   lib   rem   友元類   private   star   bar   board   

1.class

Scala的類和C#中的類有點不一樣,諸如: 聲明一個未用priavate修飾的欄位 var age,scala編譯器會欄位幫我們生產一個私人欄位和2個公有方法get和set ,這和C#的簡易屬性類似;若使用了private修飾,則它的方法也將會是私人的。這就是所謂的統一訪問原則。

細節的東西太多,還是上代碼在注釋裡面細講吧

 

[java] view plain copy 
  1. //類預設是public層級的  
  2. class Person{  
  3.   var age=18  //欄位必須得初始化()  
  4.   def Age=age //這個是方法,沒有參數可以省略()  
  5.   def incremen(){this.age+=1}  
  6. }  
  7.   
  8.   
  9. class Student{  
  10.   var age=20     //底層編譯器會自動為私人的age添加get和set的公有方法,可以理解為偽public類型  
  11.   private[this] var gender="male" //private[this] 只有該類的this可以使用  
  12.   private var name="clow" //聲明了private,底層編譯器會自動為私人的name添加get和set的私人方法  
  13.   //但是可以自己定義屬性方法  
  14.   def getName=this.name  
  15.   def setName(value:String){this.name=value}  
  16. }  
  17.   
  18. //構造器的使用  
  19. class Teacher {  
  20.   var age: Int = _  
  21.   var name: String = _  //可以預留  
  22.   
  23.   //重載的構造器和C#裡面的public Teacher(){}類似  
  24.   def this(age: Int, name: String){  
  25.     this() //必須得調用一次主構造器  
  26.     this.age=age  
  27.     this.name=name  
  28.   }  
  29. }  

 

類的構造器細節

 

[java] view plain copy 
  1. //1.主構造器在類名後,參數會被聲明欄位,若參數沒有使用var或者val聲明,則會被聲明稱私人欄位  
  2. //2.執行個體化類的時候,類中的語句會被執行:println("person")  
  3. class Person(name:String,var age:Int) {  
  4.   println("person")  
  5.   
  6.   def show(): Unit = {  
  7.     println("show.."+name)  
  8.   }  
  9.   
  10.   var gender:String=_  
  11.   
  12.   //次構造器必須調用主構造器,參數不能使用var  
  13.   def this(name:String,age:Int, gender:String){  
  14.     this(name,age)  
  15.     this.gender=gender  
  16.   }  
  17. }  
 

 

 

2.scala沒有靜態修飾符,但object下的成員都是靜態 ,若有同名的class,這其作為它的伴生類。在object中一般可以為伴生類做一些初始化等操作,如我們常常使用的val array=Array(1,2,3)  (ps:其使用了apply方法)

 

[java] view plain copy 
  1. object Dog{  
  2.   private var age=0  
  3.   def Age={  
  4.     age+=1  
  5.     age  
  6.   }  
  7. }  
  8.   
  9. class Dog{  
  10.   var age1=Dog.age //Dog.age是object Dog的私人欄位。這不禁讓我回想起了C++的友元類  
  11. }  

 

3.Apply的使用

 

[java] view plain copy 
  1. class ApplyTest{  
  2.   
  3.   val name="clow";  
  4.   def apply()  {  
  5.     println("class ApplyTest--apply()...");  
  6.   }  
  7.   
  8. }  
  9.   
  10. //object下的成員預設都是靜態  
  11. object ApplyTest{  
  12.   def apply() = {  
  13.     println("object ApplyTest--apply()...");  
  14.     new ApplyTest()  
  15.   }  
  16. }  
  17.   
  18.   
  19. object Basic4 {  
  20.   
  21.   def main(args: Array[String]) {  
  22.     //類名()->調用了對應object下的apply方法  
  23.     var a1=ApplyTest()  
  24.     println(a1.name)  
  25.     //對象名()->調用了對應class的apply方法  
  26.     a1() //輸出:class ApplyTest--apply()...  
  27.   }  
  28. }  

 

 

Apply怎麼用它來實現單例模式

 

[java] view plain copy 
    1. class ApplyTest private{  //添加private隱藏構造器  
    2.   def sayHello(){  
    3.     println("hello jop")  
    4.   }  
    5. }  
    6.   
    7. object ApplyTest{  
    8.   var instant:ApplyTest=null  
    9.   def apply() ={  
    10.     if(instant==null) instant=new ApplyTest  
    11.     instant  
    12.   
    13.   }  
    14. }  
    15.   
    16. object ApplyDemo {  
    17.   def main(args:Array[String]){  
    18.       val t=ApplyTest()  
    19.       t.sayHello()  
    20.   }  
    21. }  

scala中object和class的理解---apply方法是初始化方法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.