scala编程(四)——类和对象

 类,字段和方法

在scala里定义一个典型的类,代码如下:

class ChecksumAccumulator {
private var sum = 0
def add(b: Byte): Unit = {
sum += b
}
def checksum(): Int = {
return ~(sum & 0xFF) + 1
}
}

1.在 Scala 里成员公开的方法是不显式地指定任何访问修饰符。换句话说,你在 Java 里要写上 “public”的地方,在 Scala 里只要什么都不要写就成。Public 是 Scala 的缺省访问级别。

2.Scala里方法参数的一个重要特征是它们都是val,不是var。如果你想在方法里面给参数重新赋值,结果是编译失败:

def add(b: Byte): Unit = {
   // b += 1
    sum += b
  }

3.如果没有发现任何显式的返回语句,Scala 方法将返回方法中最后一个计算得到的值。假如某个方法仅计算单个结果表达式,则可以去掉大括号。如果结果表达式很短,甚至可 以把它放在 def 同一行里。

所以上面的checksum方法可以改写如下:

  def checksum(): Int = ~(sum & 0xFF) + 1

4.当你去掉方法体前面的等号时,它的结果类型将注定是 Unit。 不论方法体里面包含什么都不例外,因为 Scala 编译器可以把任何类型转换为 Unit。另外,如果方法的最后结果是 String,但方法的结果类型被声明为 Unit,那么 String 将被转变 为 Unit 并失去它的值。

  def checksum2() {~(sum & 0xFF) + 1}
  def checksum3():Unit = "hello";

Singleton对象

Scala 比 Java 更面向对象的一个方面是 Scala 没有静态成员。替代品是,Scala 有单例对象:singleton object

创建ChecksumAccumulator类的“伴生对象”:

// 文件 ChecksumAccumulator.scala
import scala.collection.mutable.Map
object ChecksumAccumulator {
  private val cache = Map[String, Int]()
  def calculate(s: String): Int =
    if (cache.contains(s))
      cache(s)
    else {
      val acc = new ChecksumAccumulator
      for (c <- s)
        acc.add(c.toByte)
      val cs = acc.checksum()
      cache += (s -> cs)
      cs
    }
}

表中的单例对象被叫做 ChecksumAccumulator,与前一个例子里的类同名。当单例对象与 某个类共享同一个名称时,他被称作是这个类的伴生对象:companion object。你必须在 同一个源文件里定义类和它的伴生对象。类被称为是这个单例对象的伴生类:companion class。类和它的伴生对象可以互相访问其私有成员。

单例对象扩展了超类并可以混入特质。由于每个单例对象都是超类的实例并混入了特质,你可以通过这些类型调用它的方法,用这些类型的变量指代它,并把它传递给需要这些类型的方法。

类和单例对象间的一个差别是,单例对象不带参数,而类可以。因为你不能用new关键字 实例化一个单例对象,你没机会传递给它参数。每个单例对象都被作为由一个静态变量指向的虚构类:synthetic class的一个实例来实现,因此它们与Java静态类有着相同的初始 化语法。4 4.4 Scala 程序 特别要指出的是,单例对象会在第一次被访问的时候初始化。

不与伴生类共享名称的单例对象被称为孤立对象:standalone object。由于很多种原因你 会用到它,包括把相关的功能方法收集在一起,或定义一个 Scala 应用的入口点。

Scala 程序

要执行 Scala 程序,你一定要提供一个有 main 方法(仅带一个参数,Array[String],且 结果类型为 Unit)的孤立单例对象名。任何拥有合适签名的 main 方法的单例对象都可以 用来作为程序的入口点。

注意 Scala 隐式引用了包 java.lang 和 scala 的成员,和名为 Predef 的单例对象的成员,到每个 Scala 源文件中。Predef,被放置在包 scala 中,包含了许多有用的方法。例如,当在 Scala 源文件中写 pringln 的时候,你实际调用了 Predef 的 println。(Predef.pringln 运转并调用 Console.println,做实际的工 作。)当你写 assert,你是在调用 Predef.assert。

接下来,我们在main方法中完成对上述ChecksumAccumulator类和单列对象的调用,代码如下:

object Summer {
  def main(args: Array[String]) {
    val args2 = List("hello","hi");
    for (arg <- args2)
      println(arg + ": " + calculate(arg))
  }
}

程序的运行结果如下:

hello: -20
hi: -209

原文地址:https://www.cnblogs.com/chxyshaodiao/p/12326960.html

时间: 2024-08-12 01:44:29

scala编程(四)——类和对象的相关文章

Objective-C语言介绍 、 Objc与C语言 、 面向对象编程 、 类和对象 、 属性和方法 、 属性和实例变量

Objective-C语言介绍 . Objc与C语言 . 面向对象编程 . 类和对象 . 属性和方法 . 属性和实例变量 1 第一个OC控制台程序 1.1 问题 Xcode是苹果公司向开发人员提供的集成开发环境(非开源),用于开发Mac OS X,iOS的应用程序.其运行于苹果公司的Mac操作系统下. 本案例要求使用集成开发工具Xcode编写OC的HelloWorld程序,在Xcode的控制台中, 1.2 方案 首先,启动集成开发工具Xcode. 然后,创建OC语言的工程. 最后,运行所创建的工

java面向对象编程(1)-类与对象

1.问题的提出      张老太养了两只猫猫:一只名字叫小白,今年3岁,白色.还有一只叫小花,今年100岁,花色.请编写一个程序,当用户输入小猫的名字时,就显示该猫的名字,年龄,颜色.如果用户输入的小猫名错误,则显示张老太没有这只猫. //用前面学习过的知识写出代码如下: public class Demo107{ public static void main(String []args){ int a=49;//输入的名字49,50 int cat1age=3; //第一只猫 String

面向对象编程,类和对象

面向对象编程,类和对象 一.面向对象 1.什么是面向对象 ? 面向对象是一种编程思想,是前辈们总结出的经验,指导程序员如何编写出更好的程序 , 核心是对象,程序就是一系列对象的集合, 程序员负责调度控制这些对象来交互着完成任务. 2.几个案例 案例1:把大象装进冰箱 ? ? 面向过程: ? 1.打开冰箱 ? 2.装入大象 ? 3.关闭冰箱 ? 面向对象: ? 找个具备装大象的技能的对象 总结:在面向对象中程序员的角度发生改变,从具体的操作者变成了指挥者 强调:对象不是凭空产生的,需要我们自己设计

POJ C++程序设计 编程作业—类和对象 编程题 #2

编程题 #2 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 下面程序的输出是: 10 请补足Sample类的成员函数.不能增加成员变量. #include <iostream> using namespace std; class Sample{ public: int v; Sample(int n):v(n) { } // 在此处补充你的代码 }; int main

POJ C++程序设计 编程作业—类和对象 编程题#1

编程题#1 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 下面程序输出的结果是: 0 5 请填空: #include <iostream> using namespace std; class A { public: int val; // 在此处补充你的代码 }; main() { A a; cout << a.val << endl; a.G

POJ C++程序设计 编程作业—类和对象 编程题#3

编程题 #3 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 下面程序的输出结果是: 5,5 5,5 请填空: #include <iostream> using namespace std; class Base { public: int k; Base(int n):k(n) { } }; class Big { public: int v; Base b; //

人生三分之一埋在土里的时候,选择了学习OC语言 1 类和对象

人生三分之一埋在土里的时候,选择了学习OC语言  1 类和对象 今天开始整理我所理解的东西,希望能够帮助一些像我一样想要学习一门计算机语言的朋友们, 可能在很多的地方理解的也不够深入,有不对的地方还希望关注的朋友能够谅解,也多多提您的宝贵意见! 学习前需要具备的条件: 首先你要有C语言的一些基础,如果你没有,那可以先去自学一下C语言, 我是通过以下网站进行学习的,也希望对你能够有帮助! http://c.biancheng.net/cpp/u/jiaocheng/ 其次,你要有一台mac电脑,

objective - c 类和对象

知识点 1.初步认识 OC 2.xcode使用 3.面向对象编程思想,类和对象 4.类的定义和使用 5.类的实例化--对象 6.声明和实现相分离 =========================================== 1.需要理解的(理论部分) 第一部分:OC和面向对象 1.1.OC语言的历史,特点.重要程度 [什么是OC] objective - c   在C语言基础上开发, 面向对象的语言: 注意C语言和oc语言语法的区别: IOS, iphone, ipad … [进入OC

Python 面向对象(创建类和对象,面向对象的三大特性是指:封装、继承和多态,多态性)

概念:                                                                                                                                                     ·        面向过程:根据业务逻辑从上到下写垒代码 ·        函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 ·        面向对象:对函数进行分类和封装,

Java类和对象详解,以及相关知识点

面向对象的三大特征: 在面向对象定义之中,也规定了一些基本的特征: 封装 (Encapsulation): 指将对象的实现细节隐藏起来,然后通过公共的方法向外暴露该对象的功能继承 (Inheritance): 面向对象实现软件复用的重要手段,当子类继承父类后,子类是一种特殊的父类,能直接或间接获得父类里的成员:多态 (Polymorphism): 可以直接把子类对象赋给父类变量,但是运行时依然表现出子类的行为特征,这意味着同一类型的对象在运行时可能表现出不同的行为特征 对于面向对象的开发来讲也分