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进阶之路-面向对象编程之类的成员详解

 

二.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  */
Demo.scala 文件内容(调用辅助构造方法案例展示)

相关文章:

  • 2021-12-19
  • 2021-08-09
  • 2021-11-06
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-12-26
  • 2021-12-18
  • 2022-12-23
  • 2022-01-31
  • 2021-07-22
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案