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

出门莫恨无人随,书中车马多如簇。这篇文章主要讲述scala中object和class的理解---apply方法是初始化方法相关的知识,希望能为你提供帮助。
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怎么用它来实现单例模式
【scala中object和class的理解---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. }  

    推荐阅读