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…

字符指针与字符串变量的转换

VC.NET中的String类是利用Unicode字符集编码来表示文本。Unicode字符集中每个字符(汉字、英文字母)都占2个字节,且其字符串是以2个连续的/0结尾的。 ANSI的ASCII字符集是最常见的字符集,常用于表示txt的文本文件。在ASCII字符集中英文占一个字节&#…

直方图均衡 视觉显著_视觉图像:对比度受限直方图均衡化CLAHE

CLAHE源码解析:ContrastLimitAHE .h:#ifndef _CONTRAST_LIMIT_AHE_H_#define _CONTRAST_LIMIT_AHE_H_#include "stdafx.h"#include using namespace std;class ContrastLimitAHE{public:ContrastLimitAHE();~ContrastLimitAHE();int m_nGridX;…

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…

一个使用指针的简单程序

一个使用指针的简单程序 /*一个使用指针的简单程序*/ #include <stdio.h> void main(){ int number 0; //一个出初始化为0的整形变量 int *pointer NULL; //一个可以指向int类型的指针 number 10; printf("\nnumber的地址为:%p",&number); //输出地址…

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

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

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

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

Linux 下用C语言连接 sqlite

1.在 /home/ 新建一个文件夹名为 sqlite #cd /home #mkdir sqlite 2.编写C语言代码&#xff0c;名称为 sql.c&#xff0c;代码如下 // name&#xff1a; sql.c // This prog is used to test C/C API for sqlite3.It is very simple,ha! // Author : zieckey All rights rese…

c2c旅游springboot开源_重量级开源的商城和SpringBoot等项目看看有没有正好是你需要的...

1. JavaGuideGithub地址&#xff1a; 同下star: 18.2k介绍: 【Java学习 面试指南】 一份涵盖大部分Java程序员所需要掌握的核心知识。2. mallGithub地址&#xff1a; 同下star: 3.3k介绍: mall项目是一套电商系统&#xff0c;包括前台商城系统及后台管理系统&#xff0c;基于Sp…

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

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

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

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

几个功能强大的系统源码(机票分销、机票预订、OA、手机充值、wifi营销、网络超市、体检平台)...

1、机票分销、机票预订系统源码 2、OA系统源码 3、手机在线充值系统源码 4、wifi营销系统源码 5、网络超市系统源码 6、在线体检平台系统源码 7、违章查询与缴费系统源码 需要的同学请联系QQ:930948049转载于:https://www.cnblogs.com/bcxz/p/3993157.html

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

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

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

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

python计算球坐标系的积分_python – n球面坐标系到笛卡尔坐标系

您可以通过记忆中间产品来加速您的原始代码,即def ct_dynamic(r,alpha):"""alpha: the n-2 values between [0,2\pi)"""x np.zeros(len(alpha) 1)s 1for e,a in enumerate(alpha):x[e] s*np.cos(a)s * np.sin(a)x[len(alpha)] sreturn x*r但…

VC.NET字符指针与String的转换

VC.NET字符指针与String的转换 String ^s; char*ch"wqj"; sgcnew String(ch); textBox2->Texts; 注释&#xff1a;C/CLI中使用gcnew关键字表示在托管堆上分配内存&#xff0c;并且为了与以前的指针区分&#xff0c;用^…

区县政府网站群建设新思路

目前我国区县政府差不多有3000左右&#xff0c;基本上也都建立了自己的门户&#xff0c;但是大部分的门户纯属摆设&#xff0c;没有起到任何的服务功能&#xff0c;还是信息发布为主&#xff0c;背离我国服务型政府的建设方向&#xff0c;国家领导人都很重视信息化发展&#xf…

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

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

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

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