经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Scala » 查看文章
Scala(三):类
来源:cnblogs  作者:奋斗的only  时间:2018/12/17 10:34:45  对本文有异议
  1. 类:Class
    1.简单类和无参方法
    2.gettersetter属性
    3.只带getter属性
    4.对象私有字段
    5.Bean属性
    6.辅助构造器
    7.主构造器
    8.嵌套类
  1. 1.简单类和无参方法
    Scala中的简单类和Java中很相似
  1. class ClassOps{
  2. private var value = 0 //你必须初始化字段
  3. def increment(){value += 1} //方法默认是公有的
  4. def current() = value
  5. }
  6. /*
  7. *在Scala中类并不声明为public,,Scala源文件包括多个类,所以这些类都具有公共可见性
  8. * 使用该类需要做的就是构造对象并按照通常的方式调用方法
  9. */
  10. object Class {
  11. def main(args: Array[String]): Unit = {
  12. val myCounter = new ClassOps
  13. myCounter.increment()
  14. println(myCounter.current)//此处调用无参构造时,()可加也可不加
  15. }
  16. }

2.带getter和setter属性

  1. /**
  2. *public class Person{
  3. * public Int age //Java中并不推荐这样使用
  4. * private String name
  5. * public String getName(){return name;}
  6. * public void setName(String name){this.name=name}
  7. *}
  8. * 像这样一对getter/setter通常叫做属性(property)
  9. * Scala中对每个字段都给生成getter/setter方法,不过我们可以控制这个过程
  10. * 如果字段私有,则getter/setter也是私有的
  11. * 如果字段被val修饰,那么只有getter生成
  12. * 如果你不需要getter/setter,那么可以将字段声明为private[this]
  13. */
  14. //Scala中每个字段都提供getter和setter方法
  15. class Person{
  16. // var age = 0
  17. /*
  18. *Scala生成面向JVM的类,其中有一个私有字段age字段和相应的getter/setter方法,
  19. *在Scala中此处,getter和setter分别为age和age_=
  20. */
  21. //重写getter和setter
  22. private var privateAge = 0 //变成私有并改名
  23. def age = privateAge //getter
  24. def age_(newValue : Int ){ //setter方法
  25. if(newValue > privateAge) privateAge = newValue
  26. }
  27. }
  28. object Person{
  29. def main(args: Array[String]): Unit = {
  30. val p = new Person
  31. println(p.age)
  32. p.age_(40)
  33. println(p.age) //打印结果:40
  34. p.age_(30)
  35. println(p.age) //打印结果:40
  36. }
  37. }

3.对象私有字段

 在Scala中,方法可以访问该类的所有对象的私有字段

  1. class atm{
  2. private var momey = 0
  3. def drawMoney(){momey += 1}
  4. def spendMoney(other : atm) = momey < other.momey
  5. //之所以访问other.money是合法的是因为other也是atm对象
  6. //Scala允许我们定义更加严格的访问限制,通过private[this]
  7. private[this] var foods = null //在这对象.value行不通
  8. //类私有字段,Scala会生成私有getter/setter,但是对象私有的字段不会生成
  9. //private[类名],这样的只有指定类才能访问
  10. }

4.Bean属性

  当你将Scala字段标注为@BeanProperty时,会自动生成四个方法

  1. import scala.reflect.BeanProperty
  2. class superMan{
  3. @BeanProperty var name : String = _
  4. }
  5. /*
  6. *将会生成如下四个方法:
  7. * name :String
  8. * name_=(newValue:String):Unit
  9. * getName():String
  10. * setName(newValue:String):Unit
  11. */

5.辅助构造器

  1. Scala中有主构造器和辅助构造器
    辅助构造器和Java中的构造器很相似,只有两处不同
    1.辅助构造器名称是thisJava中构造器名和类名相同
    2.每一个辅助构造器必须以一个先前已定义的其他辅助构造器或主构造器的调用开始
  1. class SuperWoman{
  2. private var name = ""
  3. private var age = 0
  4. def this(name:String ) {
  5. this() //调用主构造器
  6. this.name=name
  7. }
  8. def this(name :String ,age :Int){
  9. this(name) //调用前一个辅助构造器
  10. this.age=age
  11. }
  12. //一个类中没有显式的定义主构造器,那么会默认的定义一个无参的主构造器
  13. }
  14. object superWoman {
  15. //三种方式构建对象
  16. val s1 = new SuperWoman
  17. val s2 = new SuperWoman("John")
  18. val s3 = new SuperWoman("John",30)
  19. }

6.主构造器

  1. Scala中,每个类都有主构造器,主构造器并不以this方法定义,而是与类定义交织在一起
    主构造器的参数被编译成字段,其值被初始化成构造时传入的参数
    Scala中,类也接受参数,和方法一样
  1. class SuperBoy(val name:String,val age:Int){
  2. //(...)中的内容就是主构造器的参数
  3. println("this is construct")
  4. override def toString = s"SuperBoy($name, $age)"
  5. }
  6. //构造参数也可以是普通的方法参数,不带val或者var,这样的参数如何处理取决于它们在类中如何被使用
  7. //如果不带val或者var的参数至少被一个方法使用,它将被升级为字段
  8. class SuperGirl(name:String,age:Int){
  9. def description=name + "is" + age + "years old"
  10. }
  11. //上述代码声明并初始化了不可变字段name和age,而这两个字段都是对象私有的,类似于private[this]
  12. //当你把主构造器的参数看做是类参数时,不带val或var的参数就变得易于理解了,这样的参数的作用域覆盖整个类,因此你可以在方法中使用,同时
  13. //你这样做了,编译器自动帮你将它保存成字段
  14. //如果你想把主构造器变为私有,如下
  15. class OldMan private(val name:String,val age:Int){}//这样只能通过辅助构造器来创建对象

7.嵌套类

  1. 函数中定义函数,类中定义类
  1. import scala.collection.mutable.ArrayBuffer
  2. class NetWork{
  3. class Member(val name:String){
  4. val contacts = new ArrayBuffer[Member]()
  5. }
  6. private val Members=new ArrayBuffer[Member]()
  7. def join(name:String)={
  8. val m =new Member(name)
  9. Members += m
  10. m
  11. }
  12. }
  13. object NetWork{
  14. def main(args: Array[String]): Unit = {
  15. //如有如下两个网络
  16. val chatter = new NetWork
  17. val myFace= new NetWork
  18. //在两个网络中添加成员
  19. val fred=chatter.join("fred")
  20. val wilma=chatter.join("wilma")
  21. fred.contacts += wilma
  22. val barney = myFace.join("barney")
  23. //fred.contacts += barney 不允许这样做
  24. /*
  25. *如果你不希望是这个效果,两种方式解决
  26. * 1.可以将Member类移动到NetWork的伴生对象中
  27. * 2.使用类型投影:NetWork#Member
  28. * eg :
  29. * class NetWork{
  30. * class Member(val name:String){
  31. * val contacts = new ArrayBuffer[NetWork#Member]()
  32. * }
  33. * }
  34. */
  35. //在内嵌类中,可以通过外部类.this的方式来访问内部类的this引用,和Java一样
  36. }
  37. }

 

  1. 提示:有不妥的地方希望大家能够批评指正,一起学习,一起进步
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号