2019独角兽企业重金招聘Python工程师标准>>>

在Scala中直接在类名后面跟上参数,即可定义类的主构造方法。

scala> :paste
// Entering paste mode (ctrl-D to finish)class Person(var firstName: String, var lastName:String) {println("The construct begins.")var age = 18println(this)println("The construct ends.")override def toString = s"$firstName $lastName is $age years old."
}// Exiting paste mode, now interpreting.defined class Person

接下来我们通过主构造方法来实例化这个类,看看发生了什么。所有定义在类体内部的可执行性代码都被执行了,也就是说整个类内部都是这个主构造方法的方法体。

scala> val p = new Person("wang", "wei")
The construct begins.
wang wei is 18 years old.
The construct ends.
p: Person = wang wei is 18 years old.

至此,主构造方法的参数和方法体部分都已经说明了。

接下来我们尝试访问一下类的几个属性,你会发现可以直接用类名加属性名来访问。

scala> p.firstName
res4: String = wangscala> p.lastName
res5: String = weiscala> p.age
res6: Int = 18

由于所有属性都是使用var关键字来定义的,所以我们可以改变他们的值。

scala> p.firstName = "Li"
p.firstName: String = Liscala> p.lastName = "Ming"
p.lastName: String = Mingscala> p.age = 20
p.age: Int = 20scala> println(p)
Li Ming is 20 years old.

接下来我们讨论一下主构造方法中参数的可见性问题。

使用var修饰的主构造方法参数,因为是可变的所有Scala会自动为其生成get和set方法。

scala> class Person(var name: String)
defined class Personscala> val p = new Person("Ming");
p: Person = Person@25d3cfc8scala> p.name
res8: String = Mingscala> p.name = "Ning"
p.name: String = Ningscala> p.name
res9: String = Ning

使用val修饰的主构造方法参数,因为是不可变的所有Scala不会为其生成set方法。

scala> class Person(val name: String)
defined class Personscala> val p = new Person("Ming")
p: Person = Person@5edc70edscala> p.name
res10: String = Mingscala> p.name = "Ning"
<console>:13: error: reassignment to valp.name = "Ning"^

不适用val或者var关键字修饰的主构造方法参数,Scala将采取最严格的访问限制,set和get方法都不会被提供,并且这个参数是不可变的。

scala> class Person(name: String)
defined class Personscala> val p = new Person("Ming")
p: Person = Person@36aa52d2scala> p.name
<console>:14: error: value name is not a member of Personp.name^scala> p.name = "Ning"
<console>:15: error: value name is not a member of Person
val $ires8 = p.name^
<console>:13: error: value name is not a member of Personp.name = "Ning"^

如果强行为无关键字修饰的主构造方法参数添改变其值的方法,会导致编译报错。

scala> :paste
// Entering paste mode (ctrl-D to finish)class Person(name: String) {def getName = println(name)def setName(_name: String) { this.name = _name }
}// Exiting paste mode, now interpreting.<console>:13: error: reassignment to valdef setName(_name: String) { this.name = _name }^

在val或者var关键字前面加上private关键字,那么Scala同样不会为这个参数生成get和set方法。那么我们如果想定义一个可变但不可访问的参数该怎么办呢:private var argument。这样Scala不会为其生成set和get方法,但是你可以在类的内部自定义一些方法来改变这个参数的值。

scala> :paste
// Entering paste mode (ctrl-D to finish)class Person(private var name: String) {def printName = println(name)def setName(_name: String) { this.name = _name }
}// Exiting paste mode, now interpreting.defined class Personscala> val p = new Person("Ming")
p: Person = Person@5d342959scala> p.printName
Mingscala> p.setName("Ning")scala> p.printName
Ning

总结:主构造方法参数可见性一共有这么几种

  • 使用var修饰:Scala会为其生成get和set方法。
  • 使用val修饰:Scala会为其生成get方法。
  • 不使用修饰:Scala不会为其生成get和set方法,并且参数值不可改变。(效果等同于private val)
  • 使用private修饰:Scala不会为其生成get和set方法,但参数可变性由var和val来决定。

注意:使用case class来定义的类的主构造方法参数,如果你不适用任何修饰默认使用val修饰。

scala> case class Person(name: String)
defined class Personscala> val p = new Person("Ming")
p: Person = Person(Ming)scala> p.name
res15: String = Mingscala> p.name = "Ning"
<console>:14: error: reassignment to valp.name = "Ning"^

转载于:https://my.oschina.net/nenusoul/blog/802244

Scala学习之类和属性篇(一):定义类的主构造方法相关推荐

  1. Scala学习之路之篇六(类与对象)

    Scala 类和对象 类是对象的抽象,而对象是类的具体实例. 类是抽象的,不占用内存,而对象是具体的,占用存储空间. Scala中的类不声明为public,一个Scala源文件中可以有多个类. 类定义 ...

  2. Scala学习笔记(三)——面向对象、类、抽象类、伴生、内部类、样例类、枚举、泛型类、类型边界、型变、特质、动态混入、包

    Scala面向对象 Scala面向对象 一.基本概念 1.类的概念 2.类成员访问修饰符 二.类 1.类的定义 2.类的继承 3.抽象类 4.单例对象 5.伴生 6.内部类 7.样例类 8.枚举 9. ...

  3. java定义类属性方法_java定义类、属性、方法

    Java是面向对象的程序设计语言,Java语言提供了定义类.定义属性.方法等最基本的功能.类可被认为是一种自定义的数据类型,可以使用类来定义变量,所有使用类定义的变量都是引用变量,它们将会引用到类的对 ...

  4. 快学Scala学习笔记及习题解答(5-8类、对象、包和继承)

    本文scala使用的版本是2.11.7 第五章 类 5.1 基本操作 class Person {// Scala会生成一个私有的final字段和一个getter方法,但没有setterval tim ...

  5. java 设计一个Dog类,有三个属性:名字,年龄和颜色,有一个方法输出叫声“汪汪”。设计要求:定义属性和方法定义一个无参构造方法和一个三参构造方法。另外写一个主类,在main里面使用三参构造方

    public class dog {     String name="啊啊";     String color="白";     int age=1;   ...

  6. 2021小白Python学习记录Day7 面向对象基础(上) (定义类和对象、__init__传参、self、魔术方法)

    目录 一.定义类和对象 1.定义类 2.创建一个对象 2.1 创建一个实例对象并调用实例方法 2.2 创建另一个实例对象: 2.3 添加实例属性 二.__init__(self) 1. __init_ ...

  7. Python的类和对象的介绍,定义类和对象,定义实例方法和属性以及Python中的魔法方法

    Day09新手小白学python 第九节 Python的类和对象的介绍,定义类和对象,定义实例方法和属性以及Python中的魔法方法 目录 Day09新手小白学python 前言 一.面向对象介绍 二 ...

  8. 定义类的Python示例

    The task to define a class in Python. 在Python中定义类的任务. Here, we are defining a class named Number wit ...

  9. 定义类C++ primer目录

    本文笔者在广东吃饭的时候突然想到的...这段时间就有想写几篇关于定义类的笔记,所以回家到之后就奋笔疾书的写出来发表了 目录 第1章 快速入门 1.1  编写简略的C++程序 1.2 初窥输入/输出 1 ...

最新文章

  1. Docker 仓库管理
  2. python linux arm_[Python]python for ARM/LINUX
  3. android make 没反应
  4. python环境配置与pytorch下载
  5. flume高可用-balance-配置文件编写
  6. 2048java课程设计报告_2048小游戏-Java-课程设计报告书
  7. python traceback_Python 列表操作,节后大放送
  8. [原创]css设置禁止中文换行
  9. Java获得不同格式的系统时间
  10. select下拉列表
  11. 【离散数学】数理逻辑 第一章 命题逻辑(6) 析取范式和合取范式、主析取范式和主合取范式及两者联系
  12. 8年Android开发教你如何写简历,社招面试心得
  13. matlab特征值意义,特征值 - MATLAB Simulink - MathWorks 中国
  14. 高数笔记(六):拉格朗日中值定理,柯西中值定理,洛必达法则,泰勒定理
  15. 2021 Geek re
  16. 安卓选择市区的省市区联动
  17. 提高网站关键词排名优化技巧!
  18. 今日头条推荐算法原理全文详解之一
  19. 汽车价格离群值检测案例
  20. fastapi官方文档翻译 -目录

热门文章

  1. XML错误:缺少所需的空白区
  2. python五十一:动态导入模块,通过字符串导入模块
  3. easyui 删除指定行
  4. 计算机网络实验五:虚拟局域网技术
  5. 百度地图API详解之公交导航
  6. python类的继承-1
  7. C基础——目标代码文件、可执行文件和库
  8. python Hbase Thrift pycharm 及引入包
  9. centos中python报错 SyntaxError: Non-ASCII character ‘\xe7‘ in file car-training.py on line 7, but no en
  10. Adobe Premiere Elements 2021中文版