小提示:可以通过:paste进入 Scala 的多行模式,输入对应的代码块之后,按ctrl + D退出多行模式,然后再调用刚才输入的函数或者方法进行测试

//定义类,包含 field 以及方法
class HelloWorld {
private var name = "0mifang"
def sayHello() {print("Hello, " + name)}
def getName = name
} //创建类对象,并调用其方法
val helloWorld = new HelloWorld
helloWorld.sayHello()
print(helloWorld.getName) //如果定义方法时不带括号,则调用方法时也可以不带括号

getter与setter方法

  • 定义不带 parivate 的 var field,此时 scala 生成的面向 JVM 的类时,会定义为 private 的字段,并提供 public 的 getter 和 setter 方法
  • 而如果使用 private 修饰 field,则生成的 getter 和 setter 也是 private 的
  • 如果定义 val field,则只会生成 getter 方法
  • 如果不希望生成 getter 和 setter 方法,则将 field 声明为 private[this]
// 小例子
class Student {
var name = "0mifang"
} //调用 getter 和 setter 方法,分别叫做 name 和 name_
val mifang = new Student
print(mifang.name)
jack.name = "mifang_edit"

自定义getter与setter方法

class Student {
private var myName = "omifang"
def name = "your name is " + myName //自定义getter方法
def name_=(newName: String): Unit = { //自定义setter方法,使其无法修改名字
print("you cannot edit your name!!!")
}
} val student = new Student
print(student.name)
student.name = "0mifang_edit"

仅暴露field的getter方法

如果你不希望 field 有 setter 方法,则可以定义为 val,但是此时就再也不能更改 field 的值了,如果希望能够仅仅暴露出一个 getter 方法,并且还能通过某些方法更改 field 的值,那么需要综合使用 private 以及自定义 getter 方法,此时,由于 field 是 private 的,所以 setter 和 getter 都是 private,对外界没有暴露,自己可以实现修改 field 值的方法,自己可以覆盖 getter 方法。

class Student {
private var myName = "0mifang"
def name = "your name is " + myName //定义getter方法
def updateName(newName:String): Unit = { //定义方法提醒用户无法修改名字
if(newName == "0mifang") myName = newName
else print("not accept this new name!!")
}
}

private[this]

如果将 field 使用 private 来修饰,那么代表这个 field 是类私有的,在类的方法中,可以直接访问类的其他对象的 private field 。这种情况下,如果不希望 field 被其他对象访问到,那么可以使用private[this],意味着对象私有的 field ,只有本对象可以访问到。

class Student {
private[this] var myAge = 0
def age = myAge //定义getter方法
def age_=(newAge: Int): Unit = { //定义setter方法
if(newAge > 0) myAge = newAge
else print("illegal age!!")
} def older(s:Student): Unit = { //当使用了parivate[this]之后,这个方法就失去了意义
if (myAge > s.myAge) {
print("I'm older than him...")
}
}
}

Java风格的getter和setter方法

如果要让 Scala 自动生成 Java 风格的 getter 和 setter 方法,只要给 field 添加 @BeanProperty 注解即可,此时会生成4个方法:

  • name: String
  • name_ = (newValue: String): Unit
  • getName(): String
  • setName(newValue: String): Unit
import scala.beans.BeanProperty

// 方法一
class Student {
@BeanProperty var name: String = _
}
val s = new Student
s.setName("0mifang")
s.getName() // 方法二
class Student(@BeanProperty var name: String)
val s = new Student("0mifang")
s.getName()

主constructor

class Student(val name: String, val age: Int): Unit = {
println("your name is " + name + ", your age is " + age)
} //主 constructor 中还可以通过使用默认参数,来给参数默认的值
class Student(val name: String = "0mifang", val age: Int = 18): Unit = {
println("your name is " + name + ", your age is " + age)
} //如果主 constrcutor 传入的参数什么修饰都没有,比如 name: String ,那么如果类内部的方法使用到了,则会声明为 private[this] name ;否则没有该 field ,就只能被 constructor 代码使用而已

辅助constructor

辅助 constructor 之间可以互相调用,但是必须第一行调用主 constructor

class Student {
private var name = ""
private var age = 0
def this(name: String) {
this() //调用父类的constructor
this.name = name
}
def this(name: String, age: Int) {
this(name) //调用上面定义的辅助constructor
this.age = age
}
}





欢迎关注,本号将持续分享本人在编程路上的各种见闻。

Scala 学习(3)之「类——基本概念1」的更多相关文章

  1. Scala 学习(4)之「类——基本概念2」

    目录 内部类 extends override和super override field isInstanceOf和asInstanceOf getClass和classOf 内部类 import s ...

  2. scala学习笔记(3):类

    1 类 (1) scala把主构造函数放到类的定义中,让定义字段及相应方法变得简单起来. class People(age: Int, name: String) scala会自动将这个类变成publ ...

  3. Scala学习文档-样本类与模式匹配(match,case,Option)

    样本类:添加了case的类便是样本类.这种修饰符可以让Scala编译器自动为这个类添加一些语法上的便捷设定. //样本类case class //层级包括一个抽象基类Expr和四个子类,每个代表一种表 ...

  4. scala学习笔记2(类,继承,抽象类)

    class Person{ // _ 是占位符; var name : String = _ val age : Int = 27 // private[this] 定义的内容无法外部使用,起到保护作 ...

  5. scala学习笔记:理解类继承

    scala> import scala.reflect._ import scala.reflect._ scala> class Person(@BeanProperty var nam ...

  6. Scala学习(五)---Scala中的类

    Scala中的类 摘要: 在本篇中,你将会学习如何用Scala实现类.如果你了解Java或C++中的类,你不会觉得这有多难,并且你会很享受Scala更加精简的表示法带来的便利.本篇的要点包括: 1. ...

  7. [Scala]Scala学习笔记四 类

    1. 简单类与无参方法 class Person { var age = 0 // 必须初始化字段 def getAge() = age // 方法默认为公有的 } 备注 在Scala中,类并不声明为 ...

  8. Scala 学习之路(八)—— 类和对象

    一.初识类和对象 Scala的类与Java的类具有非常多的相似性,示例如下: // 1. 在scala中,类不需要用public声明,所有的类都具有公共的可见性 class Person { // 2 ...

  9. Net基础篇_学习笔记_第十一天_面向对象(面向过程与面向对象的区别/类的概念)

    1.面向过程-----> 面向对象 面向过程:面向的是完成这件事儿的过程,强调的是完成这件事儿的动作. 把大象塞进冰箱里1.打开冰箱门2.把大象塞进去,亲下大象的屁股3.关闭冰箱门 孙全 瘦小 ...

随机推荐

  1. Spring与C3p0连接数据库对事务操作

    maven包: <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncodin ...

  2. H3C 显示OSPF路由信息

  3. 【b804】双栈排序

    Time Limit: 1 second Memory Limit: 50 MB [问题描述] Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入 ...

  4. React MVC框架 <某某后台商品管理开源项目> 完成项目总结

    **百货后台商品信息开源项目 1.利用React  app脚手架 2.封装打包 buid 3.更偏向于后台程序员开发思维 4.利用的 react -redux    react-router-dom  ...

  5. BZOJ 4236 "JOIOJI"(前缀和+map+pair)

    传送门: [1]:BZOJ [2]:洛谷 •题解 定义数组 a,b,c 分别表示 'J' , 'O' , 'I' 的前缀和: 要想使区间 (L,R] 满足条件当且仅当 a[R]-a[L] = b[R] ...

  6. H3C 环路避免机制六:触发更新

  7. linux 阻塞 open 作为对 EBUSY 的替代

    当设备不可存取, 返回一个错误常常是最合理的方法, 但是有些情况用户可能更愿意等待 设备. 例如, 如果一个数据通讯通道既用于规律地预期地传送报告(使用 crontab), 也用于根据 用户的需要偶尔 ...

  8. CSS多余文本省略号显示

    CSS多余文本省略号显示 本次案例代码是在 elementui 当中的 table 组件中实际需求 当然使用的是纯 CSS3 代码,所以原生支持度高,兼容性高,所以可多场景应用 对于过长文本进行单行省 ...

  9. Java虚拟机理解-内存管理

    运行时数据区域 jdk 1.8之前与之后的内存模型有差异,方法区有变化(https://cloud.tencent.com/developer/article/1470519). java的内存数据区 ...

  10. Visio图像应用

    图像插入: 直接搜索然后插入 CAD是工程绘图. CAD属性设置框 下面是图像编辑: 通过格式中的旋转进行调整 但是CAD格式的图没有格式 图片可以设置题注 图片层次的使用 CAD图片颜色的修改在 图 ...