Scala进阶之路-面向对象编程之类的成员详解
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.Scala中的object对象及apply方法
1>.scala 单例对象
在Scala中,是没有static这个东西的,但是它也为我们提供了单例模式的实现方法,那就是使用关键字object。注意:object 对象是不能带参数的。
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 4 EMAIL:y1053419035@qq.com 5 */ 6 package cn.org.yinzhengjie.scalaClass 7 8 /** 9 * 1>.在scala中的object是一个单例对象,没办法new,因为它的构造方法被私有化了 10 * 2>.Object中定义的成员变量和方法都是静态的 11 * 3>.可以通过"类名.方法"或者 "对象名.成员变量" 12 * 13 */ 14 object ScalaStatic { 15 val name:String = "尹正杰" 16 var age:Int = 18 17 18 def sayHello(): Unit ={ 19 println("Hi,I'm yinzhengjie !") 20 } 21 22 //注意:如果调用者没有指定方法,默认会调用apply方法哟! 23 def apply(habby:String) = { 24 println(s"我的爱好是:${habby}") 25 } 26 }
2>.接下来我们一起测试如何访问一个Object的成员变量和方法,具体代码如下:
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 4 EMAIL:y1053419035@qq.com 5 */ 6 package cn.org.yinzhengjie.scalaClass 7 8 object Demo { 9 def main(args: Array[String]): Unit = { 10 //直接“类名.成员变量”就可以访问非私有的变量 11 var res1 = ScalaStatic.age 12 print(s"res1=====> ${res1}\n") 13 //对单例模式的类中的非私有成员变量进行修改操作,但前提是这个变量需要用关键字var来声明 14 ScalaStatic.age = 26 15 print(s"res1=====> ${res1}\n") 16 17 ScalaStatic.sayHello() 18 19 //如果没有指定方法,默认会调用apply方法哟! 20 ScalaStatic.apply("篮球") 21 ScalaStatic("乒乓球") 22 } 23 }
3>.验证Object编译后文件内容
二.Scala中类的定义及构造器的使用
1>.子定义Scala的Teacher类
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 4 EMAIL:y1053419035@qq.com 5 */ 6 package cn.org.yinzhengjie.scalaClass; 7 8 /** 9 * 关于构造器的注意事项: 10 * 11 * 1>.在Scala中定义类用class关键字修饰,这个类名称后面的构造器叫主构造器。类的主构造器中的属性会定义成类的成员变量。一个类 12 * 只能有一个主构造器,但是可以有多个辅助构造器; 13 * 2>.如果住构造器中成员属性没有val或者var修饰的话,该属性不能被访问,相当于对外没有提供get方法; 14 * 3>.如果成员属性使用var修饰的话,相当于对外提供了getter和setter方法; 15 * 4>.如果成员属性使用val修饰的话,相当于对外只提供了getter方法,因为val用于修饰不可变数据类型,类似与Java中定义常量的关键字“final”; 16 * 5>.辅助构造器是完成赋值操作的,辅助构造器是内部需要调用主构造器或者其它辅助构造器; 17 */ 18 class Teacher(var name:String,val age:Int) { 19 20 //定义sex和blog成员变量,让其默认值为null,我们可以用"_"表示为null。 21 var sex:String = _ 22 var blog:String = _ 23 24 //定义辅助构造器一,辅助构造器需要调用主构造器 25 def this(name:String,age :Int,sex:String)={ 26 //在辅助构造器中必须先调用主构造器 27 this(name,age) 28 this.sex = sex 29 } 30 31 //定义辅助构造器二,辅助构造器如果不调用主构造器那么必须得调用其它的辅助构造器 32 def this(name:String,age:Int,sex:String,blog:String)={ 33 //调用其它辅助构造器,在上面的一个辅助构造器中调用了主构造器 34 this(name,age,sex) 35 this.blog = blog 36 } 37 38 }
2>.使用Scala的单列类调用自定义Teacher类
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 4 EMAIL:y1053419035@qq.com 5 */ 6 package cn.org.yinzhengjie.scalaClass 7 8 object Demo { 9 10 def main(args: Array[String]): Unit = { 11 //调用带有两个参数的主构造器 12 val t1 = new Teacher("尹正杰",18) 13 println(s"姓名:${t1.name},年龄:${t1.age}") 14 15 //调用带有3个参数的辅助构造器 16 val t2 = new Teacher("尹正杰",20,"男") 17 println(s"姓名:${t2.name},年龄:${t2.age},性别:${t2.sex}") 18 19 //调用带有4个参数的辅助构造器 20 val t3 = new Teacher("尹正杰",26,"男","https://www.cnblogs.com/yinzhengjie") 21 println(s"姓名:${t3.name},年龄:${t3.age},性别:${t3.sex},博客:${t3.blog}") 22 } 23 } 24 25 26 27 /* 28 以上代码输出几个如下: 29 姓名:尹正杰,年龄:18 30 姓名:尹正杰,年龄:20,性别:男 31 姓名:尹正杰,年龄:26,性别:男,博客:https://www.cnblogs.com/yinzhengjie 32 */
三.Scala类的访问权限
1>.Scala类的构造器访问权限
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 4 EMAIL:y1053419035@qq.com 5 */ 6 package cn.org.yinzhengjie.scalaClass; 7 8 /** 9 * 关于构造器的访问权限: 10 * 在构造器前加修饰权限就可以设置相应的相应的访问权限,如果你想让主构造器私有化,只需要在主构造器前加private修饰即可。当然这种方法也适用于辅助构造器 11 */ 12 class Teacher private (var name:String,val age:Int) { 13 14 //定义sex和blog成员变量,让其默认值为null,我们可以用"_"表示为null。 15 var sex:String = _ 16 var blog:String = _ 17 18 //定义辅助构造器一,辅助构造器需要调用主构造器,我们想要将这个辅助构造器私有化,只需要在def前面加一个private修饰符即可。 19 private def this(name:String,age :Int,sex:String)={ 20 //在辅助构造器中必须先调用主构造器 21 this(name,age) 22 this.sex = sex 23 } 24 25 //定义辅助构造器二,辅助构造器如果不调用主构造器那么必须得调用其它的辅助构造器 26 def this(name:String,age:Int,sex:String,blog:String)={ 27 //调用其它辅助构造器,在上面的一个辅助构造器中调用了主构造器 28 this(name,age,sex) 29 this.blog = blog 30 } 31 }
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 4 EMAIL:y1053419035@qq.com 5 */ 6 package cn.org.yinzhengjie.scalaClass 7 8 object Demo { 9 10 def main(args: Array[String]): Unit = { 11 //调用带有4个参数的辅助构造器 12 val t3 = new Teacher("尹正杰",26,"男","https://www.cnblogs.com/yinzhengjie") 13 println(s"姓名:${t3.name},年龄:${t3.age},性别:${t3.sex},博客:${t3.blog}") 14 } 15 } 16 17 18 19 /* 20 以上代码输出几个如下: 21 姓名:尹正杰,年龄:26,性别:男,博客:https://www.cnblogs.com/yinzhengjie 22 */