scala学习笔记(3):类
1 类
(1)
scala把主构造函数放到类的定义中,让定义字段及相应方法变得简单起来。
class People(age: Int, name: String)
scala会自动将这个类变成public,默认的就是public. 如果我们将age这个字段设为 val age: Int,则scala将其定义成为一个private final 字段,并为它创建一个public方法number() 用以取值。如果var name: String,则定义name为private字段,并同时提供public的getter和setter方法。如果不做修饰,则设定为private的getter和setter方法。
class People{
println("Hello")
}
当new People时会显示输出结果:Hello
除了主构造函数,还可以通过this()副方法构造从构造函数。Scala 里的每一个从构造器的第一个动作都是调用同一个类里面其他的构造器。换句话说 就是,每个 Scala 类里的每个从构造器都是以“this(...)”形式开头的。 这个规则的根本结果就是每一个 Scala 的构造器调用终将结束于对类的 主构造器的调用。因此主构造器是类的唯一入口点。
class People(age: Int, name: String){
private var address: String = _
def this(age: Int, name: String, add: String){
this(age,name)
address = add
}
}
主构造器会执行类定义中的所有语句
scala> class Person(name: String, age: Int){
| println("Hi man")
| def description = name + " is " + age + "years old"
| println(description)
| }
scala> val p = new Person("a", 10)
Hi man
a is 10years old
p: Person = Person@e7689a5
如果想让主构造器是private
scala> class Person private (name: String, age: Int){
| println("Hi man")
| }
defined class Person
scala> val p = new Person("a", 10)
<console>:11: error: constructor Person in class Person cannot be accessed in object $iw
val p = new Person("a", 10)
构造器参数var, val, default
Declaration Getter? Setter?
----------- ------- -------
var yes yes
val yes no
default no no
// 'name' is a var
class Person(var name: String)
val p = new Person("Alvin Alexander")
p.name // String = Alvin Alexander
p.name = "Fred Flintstone" // String = Fred Flintstone // 'name' is a val
class Person(val name: String)
val p = new Person("Alvin Alexander")
p.name // String = Alvin Alexander
p.name = "Fred Flintstone" // error: reassignment to val // 'name' is neither var or val
class Person(name: String)
val p = new Person("Alvin Alexander")
p.name // error: value name is not a member of Person // 'name' is 'private var'
class Person(private var name: String) { def printName {println(name)} } val p = new Person("Alvin Alexander")
p.name // error: variable name in class Person cannot be accessed in Person
p.printName // Alvin Alexander
(2) 单例
单例实例对象无法初始化,所以不能给它的主构造函数传递参数。
当单例对象与某个类共享同一个名称时,他被称作是这个类的伴生对象:companion object。你必须在同一个源文件里定义类和它的伴生对象。类被称为是这个单例对象的伴生类:companion class。类和它的伴生对象可以互相访问其私有成员。
object test{
def calSum(start_index:Int, end_index:Int, call_fun: Int => Int) = {
var result = 0
for (i <- start_index to end_index){
result += call_fun(i)
}
result
}
def main(args: Array[String]){
if (args.length > 0) {
for (line <- Source.fromFile(args(0)).getLines)
println(line.length + " " + line)
}
else
Console.err.println("Please enter filename")
}
}
(3)继承
两点需要注意a) 重写父类方法需要显示override关键字,b)只有主构造函数才能往基类构造函数中传递参数
class People(age: Int, name: String){
override def toString() = {
"age: "+age + " name: "+name
}
}
class Man(age: Int, name: String, sex: String) extends People(age,name){
override def toString() = {
"age: "+age + " name: "+name + " sex: "+sex
}
}
简单点
class People(age: Int, name: String){
override def toString = "age: "+age + " name: "+name
}
class Man(age: Int, name: String, sex: String) extends People(age,name){
override def toString = "age: "+age + " name: "+name + " sex: "+sex
}
(4)private 字段
class Test{
private var a = 0
def set(t: Test) = t.a = 10 //通过对象访问私有字段
}
class Test{
private[this] var a = 0
def set(t: Test) = t.a = 10 //不可以访问私有字段
}
scala学习笔记(3):类的更多相关文章
- [Scala]Scala学习笔记四 类
1. 简单类与无参方法 class Person { var age = 0 // 必须初始化字段 def getAge() = age // 方法默认为公有的 } 备注 在Scala中,类并不声明为 ...
- Scala学习笔记——样本类和模式匹配
1.样本类 在申明的类前面加上一个case修饰符,带有这种修饰符的类被称为样本类(case class). 被申明为样本类的类的特点:1.会添加和类名一致的工厂方法:2.样本类参数列表中的所有参数隐式 ...
- Scala学习笔记(5)类
1.简单类和无参方法 calss Counter{ private var value = 0 //必须初始字段 def increment(){value +=1} //方法默认是公有的 def ...
- 基于.net的分布式系统限流组件 C# DataGridView绑定List对象时,利用BindingList来实现增删查改 .net中ThreadPool与Task的认识总结 C# 排序技术研究与对比 基于.net的通用内存缓存模型组件 Scala学习笔记:重要语法特性
基于.net的分布式系统限流组件 在互联网应用中,流量洪峰是常有的事情.在应对流量洪峰时,通用的处理模式一般有排队.限流,这样可以非常直接有效的保护系统,防止系统被打爆.另外,通过限流技术手段,可 ...
- Scala学习笔记及与Java不同之处总结-从Java开发者角度
Scala与Java具有很多相似之处,但又有很多不同.这里主要从一个Java开发者的角度,总结在使用Scala的过程中所面临的一些思维转变. 这里仅仅是总结了部分两种语言在开发过程中的不同,以后会陆续 ...
- Java学习笔记——File类之文件管理和读写操作、下载图片
Java学习笔记——File类之文件管理和读写操作.下载图片 File类的总结: 1.文件和文件夹的创建 2.文件的读取 3.文件的写入 4.文件的复制(字符流.字节流.处理流) 5.以图片地址下载图 ...
- python学习笔记4_类和更抽象
python学习笔记4_类和更抽象 一.对象 class 对象主要有三个特性,继承.封装.多态.python的核心. 1.多态.封装.继承 多态,就算不知道变量所引用的类型,还是可以操作对象,根据类型 ...
- Java学习笔记之---类和对象
Java学习笔记之---类和对象 (一)类 类是一个模板,它描述一类对象的行为和状态 例如:动物类是一个类,动物们都有属性:颜色,动物们都有行为:吃饭 public class Dog { Stri ...
- UML学习笔记:类图
UML学习笔记:类图 有些问题,不去解决,就永远都是问题! 类图 类图(Class Diagrame)是描述类.接口以及它们之间关系的图,用来显示系统中各个类的静态结构. 类图包含2种元素:类.接口, ...
- scala 学习笔记(04) OOP(上)主从构造器/私有属性/伴生对象(单例静态类)/apply方法/嵌套类
一.主从构造器 java中构造函数没有主.从之分,只有构造器重载,但在scala中,每个类都有一个主构造器,在定义class时,如果啥也没写,默认有一个xxx()的主构造器 class Person ...
随机推荐
- ubuntu安装 scala
1. 配置路径 sudo gedit /etc/profile 2.在文件后面加入 export PATH=/home/sendi/scala-/bin:$PATH 3.更新 source /etc/ ...
- Mybatis批量插入oracle,mysql
oracle <insert id="addUserData" parameterType="java.util.List"> INSERT IN ...
- C# WinForm窗口最小化到系统托盘
* C# WinForm窗口最小化到系统托盘http://hi.baidu.com/kfxtgtqyapouyze/item/8ccfdcd5a174a7312a35c7c3 主要功能:(1).程序启 ...
- jquery 中$.post获取MVC Controller中JsonResult返回包含LIst<Model>类型的子List<Model>的高级使用方法
比如JsonResult中返回return Json(models);的models结构如下: models返回含有四个集合的序列,每个集合的序列中又包含一个子集合序列“Child”. 问题是如果我们 ...
- JSTL标签库中fmt标签,日期,数字的格式化
首先介绍日期的格式化:(不要嫌多哦) JSTL格式化日期(本地化) 类似于数字和货币格式化,本地化环境还会影响生成日期和时间的方式. <%@ page pageEncoding="UT ...
- Android笔记——RecyclerView替代ListView
ListView是常用列表控件,但设置Adapter时自定义代码较为复杂,因此Android3.0后,增加RecyclerView替代ListView RecyclerView没有提供OnItemCl ...
- CentOS系统启动过程1-10 详细叙述
昨日有个前辈问我,liunx系统是如果启动的,我只是说了个大概,但具体的过程没有理解透彻,今天特意在网上找到下面的流程图,并根据图,进行了详细叙述,如有问题,请指出. 启动第一步--加载BIOS 设 ...
- URAL 1069 Prufer Code 优先队列
记录每个节点的出度,叶子节点出度为0,每删掉一个叶子,度数-1,如果一个节点的出度变成0,那么它变成新的叶子. 先把所有叶子放到优先队列中. 从左往右遍历给定序列,对于root[i],每次取出叶子中编 ...
- 基于web工作流开发
目前在研发基于web工作流的开发 什么是工作流? 工作流简言之就是: 1.反应业务流程的计算机化的模型. 2.一类能够完全或者部分自动执行的经营过程:(为了提高效率,实现自动化). 3.任务.活动及活 ...
- POJ 3468 A Simple Problem with Integers (伸展树区间更新求和操作 , 模板)
伸展数最基本操作的模板,区间求和,区间更新.为了方便理解,特定附上一自己搞的搓图 这是样例中的数据输入后建成的树,其中的1,2是加入的边界顶点,数字代表节点编号,我们如果要对一段区间[l, r]进行操 ...