小提示:可以通过: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. 深入java面向对象二:final关键字

    文章内容源于对<疯狂java讲义>及<疯狂Java:突破程序员基本功的16课>学习和总结. 一. final成员变量 final 修饰变量时,表示该变量一旦获取了值就不可以改变 ...

  2. 【u238】暴力摩托

    Time Limit: 1 second Memory Limit: 64 MB [问题描述] 晚会上大家在玩一款"暴力摩托"的游戏,它拥有非常逼真的画面和音响效果! 当然了,车子 ...

  3. Chrome 里的请求报错 " Provisional headers are shown"

    之所以会出现这个警告,是因为去获取该资源的请求其实并(还)没有真的发生; 背景:提交表单,按钮点击<button>标签,触发事件,ajax发送请求,服务器返回信息; <button& ...

  4. mpvue的坑,持续更新-.-

    mpvue... 坑 怎么说呢,去github看一下,发现还是有很多问题没有解决... 不支持filter 亲,到现在还没有支持filter哦.只能用替代方法了,用computed或者渲染前先处理数据 ...

  5. 安装 Sureface Hub 系统 Windows 10 team PPIPro 系统

    本文告诉大家如何安装这个系统 本文的方法我自己没试过,如果失败了,不要打我 下载地址 中文版 https://pan.baidu.com/s/1gAJSSE6KB9JHXo4BT_VfmA 其他请看 ...

  6. ASP.NET MVC 实现页落网资源分享网站+充值管理+后台管理(14)之会员中心管理

    源码下载地址:http://www.yealuo.com/Sccnn/Detail?KeyValue=c891ffae-7441-4afb-9a75-c5fe000e3d1c 会员中心,主要包含了会员 ...

  7. tf.contrib.learn.preprocessing.VocabularyProcessor()

    tf.contrib.learn.preprocessing.VocabularyProcessor (max_document_length, min_frequency=0, vocabulary ...

  8. layui框架实现多图片手动上传和随表单提交方法

    首先在官方文档并没有手动上传的说明文档,这里手动实现上传原理是:在表单中有三个按钮,分别是上传图片按钮.隐藏上传按钮.表单提交按钮,点击上传图片按钮之后,图片添加在前端但是并没有真正的上传,而是在点击 ...

  9. C++Review1_多态和虚函数

    继承是实现多态的基础.虚函数是实现多态的方法.虚函数.多态.继承都是紧密相关的概念.而继承是所有概念的基础: 多态:简单来讲就是接口一样,实现多样.多态是指通过基类的指针或者引用,在运行时动态调用实际 ...

  10. .Net Core 3.0 的 docker 容器中运行 无法 访问 Oracle数据库

    .Net  Core 3.0 的 docker 容器中运行 无法 访问 Oracle数据库  , 一直报下面的错误 ORA-00604: error occurred at recursive SQL ...