Scala入门系列(五):面向对象之类
定义类
// 定义类,包含field以及method
class HelloWorld {
private var name = "Leo"
def sayHello() { println("Hello" + name)}
def getName = name
}
defined class HelloWorld
// 创建类对象,并调用其方法
scala> val helloworld = new HelloWorld
helloworld: HelloWorld = HelloWorld@4f49f6af
scala> helloworld.sayHello() // 也可以不加括号
HelloLeo
scala> print(helloworld.getName) // 不能加括号,因为定义方法的时候没有加括号
Leo
封装(setter与getter)
- 定义不加参数的var filed,Scala会将该字段定义为private,并提供public的getter和setter方法
- 如果使用private修饰field, 则生成的getter和setter也是private的
- 如果定义val field, 则只会生成getter方法
- 如果使用private[this]修饰field,则不会生成getter和setter方法
总结:Scala提供的四种修饰符:var、val、private、private[this]
class Student {
var name = "sparks"
}
defined class Student
scala> val spark = new Student
spark: Student = Student@6337c201
// 调用自动生成的setter和getter方法
scala> print(spark.name)
sparks
scala> spark.name = "hahah"
spark.name: String = hahah
如果希望能够自己对getter和setter进行控制,则可以自定义getter与setter方法,使用field和fild_=的方式。
class Student{
private var myName = "Sparks"
def name = "Your name is" + myName
def name_=(newName: String) {
myName = newName
}
}
val spark = new Student
print(spark.name)
spark.name = "Leo"
注意:自义定setter方法一定要注意scala的语法限制,签名、_=参数间不能有空格。
private[this]的详解
如果字段是private修饰的,那么代码这个字段时私有的,在类的方法中,可以直接访问类的其他对象的private field。
例如:
class Student {
private var myAge = 0
def age_=(newValue: Int){
if(newValue>0) { myAge = newValue}
else print("illegal age!")
}
def age = myAge
def older(s: Student) = {
myAge > s.myAge // 调用另一个对象s的私有字段并不报错
}
}
但是如果是用private[this]修饰,那么意味着该对象私有字段只有本对象内才可以访问,上面的代码就会报错
<console>:16: error: value myAge is not a member of Student
myAge > s.myAge // 调用另一个对象s的私有字段并不报错
Java风格的getter和setter方法
如果要让scala自动生成java风格的getter和setter方法,只要给field添加@BeanProperty注解即可。
此时会生成4个方法,name: String、 name_=(newValue: String): Unit、 getName(): String、 setName(newValue: String): Unit
// 定义类
import scala.reflect.BeanProperty
class Student{
@BeanProperty var name: String = _
}
defined class Student
// 测试类
scala> val s = new Student
s: Student = Student@5f303ecd
scala> s.setName("leo")
scala> s.getName()
res9: String = leo
scala> s.name
res10: String = leo
scala> s.name = "spark"
s.name: String = spark
scala> s.getName()
res11: String = spark
// 定义Java风格类的第二种方式
class Student(@BeanProperty var name: String)
构造函数
主构造函数
在Scala中,主constructor是与类名放在一起的,而且类中没有定义在任何方法或者是代码块之中的代码,就是主constructor的代码,这点很新颖,但感觉没有java清晰。
class Student(val name: String, val age: Int) {
println("your name is " + name + ", your age is " + age)
}
defined class Student
scala> val s = new Student("spark", 30)
your name is spark, your age is 30
s: Student = Student@43b40233
// 还可以使用默认参数
class Student(val name: String = "leo", val age: Int = 30) {
println("your name is " + name + ", your age is " + age)
}
defined class Student
// 这样新建对象时就不用传递参数了
scala> val s = new Student
your name is leo, your age is 30
注意:如果主constucutor传入的参数什么修饰都没有,比如name: String, 那么如果类内部的方法使用到了,则会生命为private[this] name; 否则没有该field,就只能被constructor代码使用而已。
辅助构造函数(this)
Scala中,可以给类定义多个辅助constructor,类似于java中的构造函数重载
辅助constructor之间可以互相调用,而且必须第一行调用主constructor
// 定义类
class Student{
private var name = ""
private var age = 0
def this(name: String){
this() // 必须调用主构造函数
this.name = name
}
def this(name: String, age:Int) {
this(name) // 必须调用主构造函数
this.age = age
}
}
defined class Student
// 测试类
scala> val s1 = new Student
s1: Student = Student@387bf2d9
scala> val s2 = new Student("sparks")
s2: Student = Student@5e746d37
scala> val s3 = new Student("spark", 23)
s3: Student = Student@5524b72f
类部类
在Scala中,同样可以在类中定义内部类;但是与java不同的是,每个外部类对象的内部类,都是不同的类
// 定义内部类
import scala.collection.mutable.ArrayBuffer
class Class{
class Student(val name: String){}
val students = new ArrayBuffer[Student]
def getNewStudent(name: String) = {
new Student(name)
}
}
defined class Class
scala> val c1 = new Class
scala> val s1 = c1.getNewStudent("spark")
scala> c1.students += s1
scala> val c2 = new Class
scala> val s2 = c2.getNewStudent("leo")
scala> c1.students += s2
// 出错,因为每个外部类对象的内部类都是不同的类
<console>:15: error: type mismatch;
found : c2.Student
required: c1.Student
c1.students += s2
^
Scala入门系列(五):面向对象之类的更多相关文章
- C语言高速入门系列(五)
C语言高速入门系列(五) C语言指针初涉 ------转载请注明出处:coder-pig 本节引言: 上一节我们对C ...
- Scala入门系列(九):函数式编程
引言 Scala是一门既面向对象,又面向过程的语言,Scala的函数式编程,就是Scala面向过程最好的佐证.也真是因此让Scala具备了Java所不具备的更强大的功能和特性. 而之所以Scala一直 ...
- Go语言入门系列(五)之指针和结构体的使用
Go语言入门系列前面的文章: Go语言入门系列(二)之基础语法总结 Go语言入门系列(三)之数组和切片 Go语言入门系列(四)之map的使用 1. 指针 如果你使用过C或C++,那你肯定对指针这个概念 ...
- Scala入门系列(七):面向对象之继承
extends 与Java一样,也是使用extends关键字,使用继承可以有效复用代码 class Person { private var name = "leo" def ge ...
- Scala入门系列(八):面向对象之trait
基础知识 1 将trait作为接口使用 此时Trait就与Java中的接口非常类似,不过注意,在Scala中无论继承还是trait,统一都是extends关键字. Scala跟Java 8前一样不支持 ...
- Scala入门系列(六):面向对象之object
object object相当于class的单个实例,类似于Java中的static,通常在里面放一些静态的field和method. 第一次调用object中的方法时,会执行object的con ...
- spring cloud 入门系列五:使用Feign 实现声明式服务调用
一.Spring Cloud Feign概念引入通过前面的随笔,我们了解如何通过Spring Cloud ribbon进行负责均衡,如何通过Spring Cloud Hystrix进行服务断路保护,两 ...
- Scala入门系列(一):基础语法
Scala基础语法 Scala与JAVA的关系 Scala是基于Java虚拟机,也就是JVM的一门编程语言,所有Scala的代码都需要经过编译为字节码,然后交由Java虚拟机来运行. 所以Scala和 ...
- Scala入门系列(四):Map & Tuple
Map 创建Map // 创建一个不可变的Map scala> val ages = Map("Leo" -> 30, "Sparks" -> ...
随机推荐
- Spring MVC前后端的数据传输
本篇文章主要介绍了Spring MVC中如何在前后端传输数据. 后端 ➡ 前端 在Spring MVC中这主要通过Model将数据从后端传送到前端,一般的写法为: @RequestMapping(va ...
- 基于Lua脚本解决实时数据处理流程中的关键问题
摘要 在处理实时数据的过程中需要缓存的参与,由于在更新实时数据时并发处理的特点,因此在更新实时数据时经常产生新老数据相互覆盖的情况,针对这个情况调查了Redis事务和Lua脚本后,发现Redis事务并 ...
- Problem E
Problem Description 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).现得到城镇道路统计 ...
- two.js之实现动画效果
一.什么是two.js? Two.js 是面向现代 Web 浏览器的一个二维绘图 API.Two.js 可以用于多个场合:SVG,Canvas 和 WebGL,旨在使平面形状和动画的创建更方便,更简洁 ...
- touch pointer
在早期的浏览器,输入的事件其实相对单纯,只有考虑到鼠标和键盘两种:而当时的鼠标事件,其实就是 click.mousedown.mouseup 等等的事件.但是当手机.平板开始流行时候,再移动装置上的主 ...
- vue初级学习--idea的环境搭建
一.导语 最近接触了下idea,虽然我对于各种"代码界的神器"没有多大感冒,一个eclipse或者myeclipse,一个Notepad++ .一个就可以把我征服,但还是蛮喜欢id ...
- js基础——运算符
爱创课堂前端培训--js基础 运算符一.运算符 运算符(Operators,也翻译为操作符),是发起运算的最简单形式.分类:(运算符的分类仁者见智,本课程进行一下分类.)数学运算符(Arithmeti ...
- JAVA提高十二:HashMap深入分析
首先想说的是关于HashMap源码的分析园子里面应该有很多,并且都是分析得很不错的文章,但是我还是想写出自己的学习总结,以便加深自己的理解,因此就有了此文,另外因为小孩过来了,因此更新速度可能放缓了, ...
- JSP内容复习
JSP的3个编译指令,7个动作指令,9个内置对象 三个编译指令(通知servlet引擎的处理消息,只在JSP转换成Servlet时起作用) 1.编译指令 page page指令用户定义JSP页面中的全 ...
- gulp 打包合并
1.安装node.js 下载地址: http://nodejs.cn/ 打开node.js 命令行,输入: node -v ,有版本号,则正确安装. 2.安装淘宝镜像 :命令行输入 : npm i ...