scala学习-类与对象

 类  /  对象

【《快学Scala》笔记】

一、类

1、Scala中的类是公有可见性的,且多个类可以包含在同一个源文件中;

1 class Counter{
2     private var value = 0  //类成员变量必须初始化,否则报错
3 
4     def increment(){    //类中的方法默认是公有可见性
5         value += 1
6     }
7 
8     def current() = value //对于类中的“取值方法”,在定义时可省略掉括号,直接 def current = value
9 }

Scala类的使用:

  

Scala的类在未提供构造器时,也会提供默认构造器;且在调用无参构造器或无参方法时可省略掉方法后的括号。

2、Scala类的每个字段都有getter和setter方法,私有字段的getter和setter默认是私有的,公有字段的getter和setter方法默认是公有的。

其中对于类中的属性value,Scala类默认生成的getter方法名为 value,默认生成的setter方法名为 value_= 。使用时,我们可以重新定义获取或设置属性的方法。

例如,

1 class Clock{
2     var hour = 0
3     var minute = 0
4     var second = 0
5 
6     def getTime():String={
7         return hour+":"+minute+":"+second
8     }
9 }

对于Clock类中的属性,如 hour,其对应的getter方法为 hour ,其对应的setter方法名为 hour_= 

  

【注:可以重新定义获取Scala类中属性的方法,但是最好不要与属性默认对应的getter/setter方法重名,否则会报错。】

3、对于Scala类中的val属性,只有默认的getter方法;对于private属性,其默认getter、setter都是private的。因而,对于不想提供setter方法的变量可以设置为val,对于不想提供getter、setter方法的变量可以设置为private。

4、注意,Scala类中,定义无参函数时,若函数声明时省略了函数名后的括号(由于无参数,可以省略),调用时,必须参数无括号的形式,通过带括号形式调用会报错。如,

1 class Counter{
2     var value = 0
3 
4     def current = value 
5 }

类Counter定义中,对于方法current,由于不接受参数,所以定义时省略了方法名current后的括号。此时,对于Counter的实例counter,调用current方法时,必须采用counter.current(无括号形式)。

  

5、对于Scala类中定义的字段,在Scala中实际为私有字段。(还有待进一步理解和验证

1 class Counter{
2     var value = 0
3     val sum = 0
4     private var cnt = 1
5 
6     //....
7 }

在Counter类中,Scala在为Counter生成面向JVM的类时,对于value字段,会生成对应的私有字段value和公有的getter、setter方法;对于sum字段,会生成私有的final字段和公有的getter方法;对于cnt字段,会生成私有字段cnt和私有的getter、setter方法(貌似这个private声明只是影响的Scala根据属性生成的对应getter、setter的可见性)。

6、构造器

  Scala的类可以有一个主构造器和多个辅助构造器。每个辅助构造器的名称为this,每一个辅助构造器都必须以调用已经定义的辅助构造器或主构造器开始定义。

  • 主构造器

  如果一个类没有显示定义主构造器,则有一个默认的无参主构造器。

  如定义一个Student类,

1 class Student(val name:String, var age:Int = 0, address:String = "", private var school:String = ""){
2     var grade:Int = if( age>7 ) age-7 else 0
3 
4     println(" I'm in main constructor. ")
5 
6     def info() = " name is "+name+", age is "+age+", address is "+address
7 }

   对于Scala类,主构造器的参数放置在类名后,由括号括起来。且对于主构造器中var、val、private 等标注的参数,都会成为类的对应字段,并生成对应的默认getter、setter方法。如Student类中的name、age、school等。对于主构造器中的未用var、val标注的参数,如果在类的任何一个方法用用到该参数,该参数将会转换为类的字段,否则不会,如Student类的address属性。

  由于在Student类中的info方法中用到了参数address,所以Student共有name、age、address、school、grade等5个属性,且Scala根据对应属性的特点生成了默认的getter和setter方法。

  对于主构造器的参数,也可以提供参数默认值。通过为主构造器提供默认值可减少辅助构造器的个数。 

  主构造器的函数体,是类中除了方法定义以外的其他语句,如在Student类的主构造器中,包含grade属性的初始化和prinln这两行语句。

  Stuent类的使用。

  

  • 辅助构造器

  辅助构造器通过this来定义,且必须首先调用主构造器或者其他已经定义的辅助构造器。

 1 class Person(val name:String){
 2     var age = 0
 3     var sex:Char = 'f'
 4 
 5     println("main constructor...")
 6 
 7     def this(name:String,  age:Int){
 8         this(name)        //调用主构造器
 9         this.age = age     //使用this关键字
10 
11         println(" auxiliary constructor1 ")
12     }
13 
14     def this(name:String, age:Int, sex:Char){
15         this(name, age)
16 
17         this.sex = sex
18 
19         println(" auxiliary constructor2 ")
20     }
21 }

  【注:辅助构造器的参数前不能添加val、var标志,否则会报错。】

  

  • 私有主构造器
1 class Person private(val name:String){
2     var age:Int = 1
3 
4     def this(name: String, age:Int){
5         this(name)
6         this.age = age
7     }
8 
9 }

  私有构造器通过在类名后用private关键字标注主构造器参数来标明。此时,可以通过辅助构造器来创建该类的对象。

7、嵌套类

 1 class Family(val h_name:String, val w_name:String){
 2     class Husband(var name:String){
 3         println(" I'm a husband ")
 4     }
 5 
 6     class Wife(var name:String){
 7         println(" I'm a Wife ")
 8     }
 9 
10     var husband = new Husband(h_name)
11     var wife = new Wife(w_name)
12 
13     def info(){
14         println( "husband: "+husband.name+", wife:"+wife.name )
15     }
16 }

  在Scala中,你几乎可以在任何语法结构中嵌套任何语法结构,如在函数中定义函数,在类中定义类。

 二、对象(object)

1、Scala中没有静态方法和静态字段,但是可以用object语法来实现类似的功能。对象定义了某个类的单个实例。

  Scala的object中可以用来实现类似的功能,用来存放工具函数或常量等。如,

1 object Sequence{
2     private var next_num = 0
3     val threshold = 100
4 
5     def getSequence() = {
6         next_num += 1
7         next_num
8     }
9 }

  使用object中的常量或方法,通过object名直接调用,对象构造器在对象第一次被使用时调用(如果某对象一直未被使用,那么其构造器也不会被调用)。

  object的构造器不接受参数传递。

  

2、伴生对象

  可以将在Java类中定义的静态常量、方法等放置到Scala的类的伴生对象中。伴生对象与类同名,且必须放置在同一源文件中。类可以访问伴生对象私有特性,但是必须通过 伴生对象.属性名伴生对象.方法 调用。

  伴生对象是类的一个特殊实例。

1 class Counter{
2     def getTotalCounter()= Counter.getCount
3 }
4 
5 object Counter{
6     private var cnt = 0
7 
8     private def getCount()= cnt
9 }

  如在类Counter访问其伴生对象的石油方法getCount,必须通过 Counter.getCount() 的方式调用。

3、对象可以继承或扩展多个特质

1 abstract class Person(var name:String, var age:Int){
2     def info():Unit
3 }
4 
5 object XiaoMing extends Person("XiaoMing", 5){
6     def info(){
7         println(" name is "+name+", age is "+age)
8     }
9 }

 

4、apply方法

当遇到 object(参数1, 参数2,....,参数n)的形式的调用时,apply方法便会被调用。

5、main方法——Scala程序的入口

main方法定义在object中,形式如下:

1 object HelloWorld{
2     def main(args: Array[String]){
3         println("Hello World!")
4     }
5 }

 

可以通过scalac 源文件名,然后通过 scala 类名 来执行主程序。

  

6、还可以通过扩展特质App来运行指定代码

1 object HelloWorld2 extends App{
2     println(" A 'Hello world' from HelloWorld2 ")
3 }

 

  通过扩展App特质的方式执行程序时,将要执行的程序放到了object的主构造器中。

7、枚举

  Scala并没有定义枚举类型,但是可以通过定义扩展Enumeration的对象,并用Value方法初始化枚举类中的所有可选值,提供枚举。

1 object TrafficeLight extends Enumeration{
2     val Red, Yellow, Green = Value
3 
4 }

 

  上述实例中的val Red, Yellow, Green = Value语句,相当于

1     val Red = Value
2     val Yellow = Value
3     val Green = Value

  用Value方法初始化枚举类变量时,Value方法会返回内部类的新实例,且该内部类也叫Value。另外,在调用Value方法时,也可传入ID、名称两参数。如果未指定ID,默认从零开始,后面参数的ID是前一参数ID值加1。如果未指定名称,默认与属性字段同名。

1 object TrafficLight extends Enumeration{
2     val Red = Value(1, "Stop")
3     val Yellow = Value("Wait")    //可以单独传名称
4     val Green = Value(4) //可以单独传ID
5 }

 

上例中,Yellow属性就仅定义了名称,Green仅定义ID。

  

参数在不指定名称时,默认参数的Value为字段名。

【注:枚举类型的值是, 对象名.Value ,如上例中的枚举类型是 TrafficLight.Value。】

8、通过id方法获取枚举类型值的ID

  

9、通过values方法获取所有枚举值的集合

  

10、通过ID来获取对应的枚举对象

  

 

转载于:https://www.cnblogs.com/-crazysnail/p/3984010.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/473008.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 1745. 回文串分割 IV(区间DP)

文章目录1. 题目2. 解题1. 题目 给你一个字符串 s ,如果可以将它分割成三个 非空 回文子字符串,那么返回 true ,否则返回 false 。 当一个字符串正着读和反着读是一模一样的,就称其为 回文字符串 。 示例 1: 输入&a…

5000并发的qps是多少_高并发架构设计

点击蓝字,关注我们01概述高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求。高并发一方面可以提高资源利用率,加快系统响应速度,但是同…

TensorFlow 2.0 - tf.data.Dataset 数据预处理 猫狗分类

文章目录1 tf.data.Dataset.from_tensor_slices() 数据集建立2. Dataset.map(f) 数据集预处理3. Dataset.prefetch() 并行处理4. for 循环获取数据5. 例子: 猫狗分类学习于:简单粗暴 TensorFlow 2 1 tf.data.Dataset.from_tensor_slices() 数据集建立 tf.data.Dat…

flutter 图解_【Flutter 专题】83 图解自定义 ACEWave 波浪 Widget (一)

和尚今天尝试一下绘制波浪的效果,虽然 pub 仓库中已经有成熟的插件,但和尚还是准备用之前学习的 Canvas 和 Animation 尝试自定义一个 ACEWave;1. 绘制曲线绘制波浪首先需要绘制曲线,采用 Canvas 绘制贝塞尔曲线;常用的…

c++ 不插入重复元素但也不排序_面试时写不出排序算法?看这篇就够了

小Hub领读:本文主要详细讲述常见的八种排序算法的思想、实现以及复杂度。包括冒泡排序、快速排序、插入排序、希尔排序等等,文章讲解非常详细!作者:静默虚空https://juejin.im/post/5cb6b8f551882532c334bcf2本文已归档到&#xf…

LintCode 1816. 使结果不超过阈值的最小除数(二分查找)

文章目录1. 题目2. 解题1. 题目 描述 给你一个整数数组 nums 和一个正整数 threshold ,你需要选择一个正整数作为除数,然后将数组里每个数都除以它,并对除法结果求和。 请你找出能够使上述结果小于等于阈值 threshold 的除数中 最小 的那个…

马里兰大学calce电池循环测试数据集_千次循环,全程1.5V恒压,紫米新一代充电锂电池套装上手体验...

电池应该是每个家庭都会用到的东西,在现在智能家电飞迅发展的当下更是如此,比如智能门锁、智能门铃,都需要电池的供电,才能正常使用。而普通碱电池在电量耗尽后就无法循环使用,所以为了能节省成本减少电池对环境的污染…

TensorFlow 2.0 - TFRecord存储数据集、@tf.function图执行模式、tf.TensorArray、tf.config分配GPU

文章目录1. TFRecord 格式存储2. tf.function 高性能3. tf.TensorArray 支持计算图特性4. tf.config 分配GPU学习于:简单粗暴 TensorFlow 2 1. TFRecord 格式存储 使用该种格式,更高效地进行大规模的模型训练 import random import os import tensorfl…

c++ qt qlistwidget清空_Qt编写控件属性设计器12-用户属性

一、前言用户属性是后面新增加的一个功能,自定义控件如果采用的Q_PROPERTY修饰的属性,会自动识别到属性栏中,这个一般称为控件属性,在组态设计软件中,光有控件本身的控件属性还是不够的,毕竟这些属性仅仅是…

TensorFlow 2.0 - tf.saved_model.save 模型导出

文章目录1. tf.saved_model.save2. Keras API 模型导出学习于:简单粗暴 TensorFlow 2 1. tf.saved_model.save tf.train.Checkpoint 可以保存和恢复模型中参数的权值导出模型:包含参数的权值,计算图 无须源码即可再次运行模型,适…

机器人动力学与控制_力控制与位置控制的区别

1.背景介绍目前已经广泛落地的力控制方案是在机械臂末端安装多轴力矩传感器,用以检测机械臂对外界环境施加的力反馈值,并配合适当的控制策略,已达到控制机械臂与环境的作用力。这篇文章所要探讨的力控制(上述力控制方案&#xff0…

基坑监测日报模板_基坑监测有多重要?实录基坑坍塌过程,不亲身经历,不知道现场有多恐怖!...

基坑整体坍塌不亲身经历,不知其恐怖▼前段时间,南宁绿地中央广场房地产项目D号地块(二期)基坑北侧约60米支护桩突然崩塌!所幸无人伤亡。深基坑施工安全生产管理要点一、基坑开挖 1、 临边防护(1)基坑施工必须按要求进行,具体临边防…

[转]asp.net导出数据到Excel的三种方法

原文出处:asp.net导出数据到Excel的几种方法(1/3) 、asp.net导出数据到Excel的几种方法(2/3)、asp.net导出数据到Excel的几种方法(3/3) asp.net导出到Excel也是个老生常谈的问题,在此归纳一下。 第一种是比较常用的方法。是利用控件的RenderControl功能…

LintCode 378. 将二叉树转换成双链表(非递归遍历)

文章目录1. 题目2. 解题1. 题目 将一个二叉树按照中序遍历转换成双向链表。 样例 样例 1&#xff1a; 输入:4/ \2 5/ \1 3 输出: 1<->2<->3<->4<->5样例 2&#xff1a; 输入:3/ \4 1输出:4<->3<->1https://www.lintcode.com/pro…

js 将图片置灰_艾叶灰千万别扔——艾叶灰的神奇功效

请 点 上面“经络技巧”免费关注每晚9点准时免费更新点击下面图片阅读↓↓↓—— 以下是正文 ——艾灰的妙用1、宝宝经常会有红屁股&#xff0c;做妈妈的当然心疼&#xff0c;用了不少膏啊霜啊油啊&#xff0c;效果也是反反复复&#xff0c;尤其害怕会有依赖性。在妈妈的提醒下…

LintCode 434. 岛屿的个数II(并查集)

文章目录1. 题目2. 解题1. 题目 给定 n, m, 分别代表一个二维矩阵的行数和列数, 并给定一个大小为 k 的二元数组A. 初始二维矩阵全0. 二元数组A内的k个元素代表k次操作, 设第 i 个元素为 (A[i].x, A[i].y), 表示把二维矩阵中下标为A[i].x行A[i].y列的元素由海洋变为岛屿. 问在…

jqprintsetup已经安装还会提示_Windows 10更新将修复困扰用户已久的循环安装问题...

对于某些设备的用户来说&#xff0c;过去一年一直深受 Windows Update 陷入循环更新的问题困扰&#xff0c;尤其是那些使用英特尔驱动程序的设备。问题在于 Windows Update 会提示错误地提供不适配的驱动或版本&#xff0c;并且强行覆盖安装。此外即便用户已经安装了更新更好的…

springboot设置运行内存_Docker 如何运行多个 Springboot?

docker 如何运行多个Springboot &#xff1f;第一个&#xff1a;端口映射第二个&#xff1a;指定内存大小第三个&#xff1a;读取、写入物理文件第四个&#xff1a;日志文件第五个&#xff1a;多个容器内部网络访问第六个&#xff1a;遇到的问题第一个&#xff1a;端口映射Ngin…

LintCode 1915. 举重(01背包)

文章目录1. 题目2. 解题1. 题目 奥利第一次来到健身房&#xff0c;她正在计算她能举起的最大重量。 杠铃所能承受的最大重量为maxCapacity&#xff0c;健身房里有 n 个杠铃片&#xff0c;第 i 个杠铃片的重量为 weights[i]。 奥利现在需要选一些杠铃片加到杠铃上&#xff0c;使…

python实现简单线性回归和多元线性回归算法

1、问题引入 在统计学中&#xff0c;线性回归是利用称为线性回归方程的最小二乘函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。这种函数是一个或多个称为回归系数的模型参数的线性组合。一个带有一个自变量的线性回归方程代表一条直线。我们需要对线性回归结…