Scala 基础(4)—— 类和对象
1. 类、字段和方法
Scala 用 class 关键字定义类,一旦定义好一个类,就可以使用 new 关键字创建对象。
Scala 使用 new 调用无参构造器时,可以不使用 (),推荐不使用括号:
class MyClass {
// MyClass 的定义
}
val a = new MyClass
在类的定义中,可以填入字段(field)和方法(method),两者统称为成员(member)。
字段保留了对象的状态,即数据。
方法使用数据执行计算。
使用 var 或者 val 定义字段,使用 def 定义方法。
为了控制外部对于对象的字段和方法的访问,可以给这些加上访问控制符(private 和 protected),访问控制符的用法在后面的章节细讲。
Scala 的方法和 Java 的方法,有一个显著的区别,就是方法的入参默认都是 val 类型的。
所以这样的调用是非法的:
def add(b: Byte): Unit = {
b = 1 // 不能编译
}
Java 强制 java 文件和公有类采用统一名字,Scala 没有强制这一点,但是仍然推荐和 Java 的相同风格。
2. 单例对象
Scala 没有 static 关键字,在 class 里面定义的字段方法都是对象持有的,也就是实例成员。
Scala 有另外办法去实现静态成员,就是 object 关键字,我们称这种用 object 关键字定义的为单例对象(singleton object)。
object MyClass {
// 这里定义静态字段 和 静态方法
}
当单例对象和某一个类共享同一个名字,称这个单例对象是这个类的伴生对象(companion object)。同时类又叫这个单例对象的伴生类(companion class)。
必须在同一个文件中定义类和类的伴生对象。
类和它的伴生对象可以互相访问私有成员。
没有同名伴生类的单例对象被称为孤立对象(standalone object),常用于工具方法。
类和单例对象有一个区别,就是单例对象不接受参数。
单例对象只有在首次被代码访问的时候才初始化。
3. 对象相等性
我们都知道,Java 在判断两个对象是否相等时有2个语义:
引用相等:== 操作符
值相等:Object 类的 equals() 方法
而 Scala 在这一方面和 Java 不同
值相等:== 操作符
引用相等:Any 类(所有 Scala 类的超类)的 eq 方法,ne 方法(与 eq 方法结果相反)
def main(args: Array[String]): Unit = {
val s = "Hello World!"
val s1 = "Hello"
val s2 = " World!"
println(s == s1 + s2) // true
println(s eq s1 + s2) // false
println(s ne s1 + s2) // true
}
Scala 有一个优势在于,无论是使用 == 操作符,还是 eq 或是 ne 方法,不需要担心左侧为 null 时抛出异常。
Scala 基础(4)—— 类和对象的更多相关文章
- 086 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 03 面向对象基础总结 01 面向对象基础(类和对象)总结
086 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 03 面向对象基础总结 01 面向对象基础(类和对象)总结 本文知识点:面向对象基础(类和对象)总结 说明 ...
- scala学习笔记——类和对象
基础语法关于Scala程序,这是非常要注意以下几点. 区分大小写 - Scala是大小写敏感的,这意味着标识Hello 和 hello在Scala中会有不同的含义. 类名 - 对于所有的类名的第一个字 ...
- Scala中的类和对象
类的定义 使用class定义 类的字段 在类中使用var,val定义字段 类的方法 scala中,使用var定义字段默认提供setter和getter方法对应名称为 value_= 和value /* ...
- Scala基础:面向对象之对象和继承
对象 object 相当于 class 的单个实例,通常在里面放一些静态的 field 或者 method:在 Scala 中没有静态方法和静态字段,但是可以使用 object 这个语法结构来达到同样 ...
- Scala基础:类和构造器
类 package com.zy.scala.cls /** * 在 Scala 中,类并不用声明为 public 类型的. * Scala 源文件中可以包含多个类,所有这些类都具有共有可见性. */ ...
- ObjectiveC1基础代码——类和对象
// // main.m // ObjectiveC1 // // Created by scjy on 15/10/30. // Copyright © 2015年 lizhipeng. A ...
- C++_基础_类和对象
内容: (1)引用 (2)类型转换 (3)C++社区给C程序员的建议 (4)面向对象编程的概念 (5)类和对象 (6)构造函数 (7)初始化列表及其必要性 1.引用1.1 指针和引用的使用说明(1)指 ...
- J2SE基础:1.类和对象基础
什么是对象 在Java语言,全部的人,事物或者模块都是一个对象. 同样的对象具有一些同样的特性. 狗,猫,蛇3个对象(动物的对象) 苹果,梨,桔子3个对象(水果的对象) 什么是类 能够将现实生活中的对 ...
- java基础知识—类和对象
1.对象的特征---类的属性 每个对象的每个属性都有特定的值 对象的操作---类的方法 2.封装 对象同时具有属性和方法两项属性. 对象的属性和方法同时被封装在一起,共同体现事物的特性,二者相辅相成, ...
- Java基础-3类和对象声明与创建
一).在1和2中有粗略介绍过类和对象的概念,在这里简单回顾一下: 对象与类:一个实际或者虚拟的物体,这个物体既是我们的对象,这个物体呢又是属于一个分类,如动物类,人类 二).创建对象: 在创建对象的时 ...
随机推荐
- 利用Kettle转储接口数据
1. 项目背景 1.1. 项目背景 数据接口 API:应用程序接口(Application Program Interface)的简称,是实现计算机软件之间数据通信的工具.同时API也是一种 ...
- C# grid控件用数据库分页后台怎么写?
C#grid控件使用数据库分页的写法如下: mySystem.GetDataa(gridName.PageIndex *gridName.PageSize + 1, (gridName.PageInd ...
- jQuery选择器与事件学习笔记
层次选择器: $("div li")获取div下的所有li元素(后代.子.子的子......) $("div>li")获取div下的直接li子元素. ...
- 使用session处理用户搜索后数据的上一页和下一页跳转
搜索语句界面: /*单一检索:此处为一个下拉列表的检索*/ if(isset($_POST['submit']) && $_POST['submit'] == '点击搜索') { if ...
- linux 特殊命令(一)
1.ifconfig 网卡配置:ifconfig [网络设备] [参数] 1) up 启动指定网络设备/网卡. 2) down 关闭指定网络设备/网卡.该参数可以有效地阻止通过指定接口的IP信息流, ...
- ECSHOP快递物流单号查询插件
本ECSHOP快递物流单号跟踪插件提供国内外近2000家快递物流订单单号查询服务例如申通快递.顺丰快递.圆通快递.EMS快递.汇通快递.宅急送快递.德邦物流.百世快递.汇通快递.中通快递.天天快递等知 ...
- 小程序里面使用wxParse解析富文本导致页面空白等
在部分安卓手机上会出现白屏的情况且有些ios手机上图文混排上,图片显示不出问题 解决:把插件里面的console.dir去掉即可(原因在于安卓手机无法解析console.dir) 有些图片解析出来下面 ...
- zookeeper的搭建方法
1.创建三台虚拟机分别在虚拟机上安装Ubuntu16.04Server版的系统. 2.首先选择配置好第一台虚拟机,使用命令vim /etc/hosts对该文件进行修改 3.将zookeeper-3.4 ...
- linux下,把屏幕竖起来
xrandr -o left 向左旋转90度 xrandr -o right 向右旋转90度 xrandr -o inverted 上下翻转 xrandr -o normal 回到正常角度
- ImageButton的坑 ImageButton 有问题
最近在用ImageButton,发现,我如果new ImageButton,并且 设置Warp_content,但是它并不会正真的warp,它会有一个边框. 不知道怎么回事. 后来,在代码里面使用Im ...