Scala之旅-class和object详解

来源:互联网 发布:gitbash windows 编辑:程序博客网 时间:2024/06/06 16:14

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. }  
0 0
原创粉丝点击