1.1继承类

  • 使用extends关键字,在定义中给出子类需要而超类没有的字段和方法,或者重写超类的方法。
class Person  {
var name = "zhangsan"
}
class Employee extends Person{
var salary = 0.0
def description = "员工姓名:" + name + " 薪水:" + salary
}

  

1.2重写方法

  • 重写一个非抽象方法需要override修饰符,调用超类的方法,使用super关键字。
class Person {
var name = ""
override def toString = getClass.getName + "[name=" + name + "]"
} class Employee extends Person {
var salary = 0.0
override def toString = super.toString + "[salary=" + salary + "]"
}

  

1.3类型检查和转换

  • 用isInstanceOf方法,测试某个对象是否属于某个给定的类型。
  • 用asInstanceOf方法将引用转换为子类的引用。classOf获取对象的类名。
scala> a.isInstanceOf[String]
<console>:23: warning: fruitless type test: a value of type Array[String] cannot also be a String (the underlying of String)
a.isInstanceOf[String]
^
res59: Boolean = false
scala> 4.isInstanceOf[Double]
res64: Boolean = false scala> 3.asInstanceOf[Float]
res63: Float = 3.0

  

1.4超类的构造

类有一个主构器和任意数量的辅助构造器,而每个辅助构造器都必须以对先前定义的辅助构造器或主构造器的调用开始。子类的辅助构造器最终都会调用主构造器,

  • 只有主构造器可以调用超类的构造器。辅助构造器不可能直接调用超类的构造器。
  • 在Scala的构造器中,你不能调用super(params)。

1.5 重名字段

  • 子类改写父类或者抽象父类的字段
class Person1(val name:String,var age:Int){
println("主构造器已经被调用")
val school="五道口职业技术学院"
def sleep="8 hours"
override def toString="我的学校是:" + school + "我的名字和年龄是:" + name + "," + age
} class Person2(name:String, age:Int) extends Person1(name, age){
override val school: String = "清华大学"
} scala> val a=new Person2("a",11)
主构造器已经被调用
a: Person2 = 我的学校是:清华大学我的名字和年龄是:a,11

  注:1)def只能重写另一个def 
               2)val只能重写另一个val或不带参数的def 
               3)var只能重写另一个抽象的var

1.6 抽象类

  • abstract关键字标记不能被实例化的类。
  • 方法不用标记abstract,只要省掉方法体即可。
  • 类可以拥有抽象字段,抽象字段就是没有初始值的字段。
abstract class Person(val pname: String) {//抽象类
val id: Int
var name: String
def idString: Int//抽象方法
} class Employee(pname: String) extends Person(pname) {
val id = 5;
var name = ">>>"
def idString = pname.hashCode
}

  注:子类实现抽象方法不需要override

1.7 单例对象

对象是一个只有一个实例的类,被引用时会被懒惰地创建,就像懒惰的value一样。作为顶级值,对象是单例。

作为封闭类的成员或者本地值,它的行为和val完全相同。

  • 定义单个对象

对象是一个值。对象的定义看上去像一个类,但使用关键字object

object Box

这是一个带有方法的对象的示例:

object Logger { def info(message: String): Unit = println(s"INFO: $message") }

  该方法info可以从程序中的任何位置导入。像这样创建实用程序方法是单例对象的常见用例。

如何info在另一个包中使用,如下:

import lab13.Logger.info

class Project(name: String, daysToComplete: Int)
class Test {
val project1 = new Project("TPS Reports", 1)
val project2 = new Project("Website redesign", 5)
info("Created projects")
}

  info由于import语句,该方法是可见的import lab13.Logger.info然后导入需要导入符号的“稳定路径”,对象是稳定路径。

Scala实践8的更多相关文章

  1. Scala实践14

    1.Scala的future 创建future import scala.concurrent._ import ExecutionContext.Implicits.global object Fu ...

  2. Scala实践13

    1.隐式参数 方法可以具有隐式参数列表,由参数列表开头的implicit关键字标记.如果该参数列表中的参数没有像往常一样传递,Scala将查看它是否可以获得正确类型的隐式值,如果可以,则自动传递. S ...

  3. Scala实践12

    1.内部类和抽象类型成员作为对象成员 内部类 在Scala中,可以让类将其他类作为成员.这些内部类是封闭类的成员.在Scala中,这样的内部类绑定到外部对象.假设希望编译器在编译时阻止我们混合哪些节点 ...

  4. Scala实践11

    1.1泛型类 泛型类是将类型作为参数的类.它们对集合类特别有用. 定义泛类型:泛型类将类型作为方括号内的参数[].一种惯例是使用字母A作为类型参数标识符,但是可以使用任何参数名称. class Sta ...

  5. Scala实践10

    1.模式匹配 模式匹配是一种根据模式检查值的机制.它是switch(Java中语句)的更强大版本,它同样可以用来代替一系列if / else语句. 句法 匹配表达式具有值,match关键字和至少一个c ...

  6. Scala实践9

    1.特征 Traits用于在类之间共享接口和字段.它们类似于Java 8的接口.类和对象可以扩展特征,但是特征不能被实例化,因此没有参数. 定义一个特征 最小特征只是关键字trait和标识符: tra ...

  7. Scala实践6

    1  if表达式 Scala中if...else..表达式是有返回值的,如果if和else返回值类型不一样,则返回Any类型. scala> val a3=10 a3: Int = 10 sca ...

  8. Scala实践7

    一.类 1.1简单类和无参方法 类的定义通过class关键字实现 scala> class Dog { | private var leg = 4 | def shout(content: St ...

  9. Scala实践5

    一.Scala的层级 1.1类层级 Scala中,Any是所其他类的超类,在底端定义了一些有趣的类NULL和Nothing,是所有其他类的子类. 根类Any有两个子类:AnyVal和AnyRef.其中 ...

随机推荐

  1. Hammersley-Clifford定理证明

    Proof of Hammersley-Clifford TheoremProof of Hammersley-Clifford Theorem依赖知识定义1定义2证明过程反向证明(吉布斯分布=> ...

  2. H3C 帧中继基本概念

  3. tp5 select出来数据集(对象)转成数组

    1.先在数据库配置文件中 //数据集返回类型 'resultset_type' => 'collection', 2.在使用时, 使用 toArray() 方法 //查询数据库 $news = ...

  4. java final域

    public final class ThreeStooges { /* * stooges是Set<String>类型的引用,final限定该引用成员属性stooges被赋初值后,就不能 ...

  5. tensorflow在文本处理中的使用——CBOW词嵌入模型

    代码来源于:tensorflow机器学习实战指南(曾益强 译,2017年9月)——第七章:自然语言处理 代码地址:https://github.com/nfmcclure/tensorflow-coo ...

  6. Roslyn 使用 Target 替换占位符方式生成 nuget 打包

    本文告诉大家如何编写在编译过程修改打包文件 在项目文件的相同文件夹可以放一个 nuspec 用来告诉 VisualStudio 如何打包 现在尝试创建一个项目 NearjerbetearDeeyito ...

  7. 2019-11-17-dotnet-core-使用-GBK-编码

    title author date CreateTime categories dotnet core 使用 GBK 编码 lindexi 2019-11-17 16:36:27 +0800 2019 ...

  8. Linux 内核探测和去连接的细节

    在之前章节描述的 struct usb_driver 结构中, 驱动指定 2 个 USB 核心在合适的时候 调用的函数. 探测函数被调用, 当设备被安装时, USB 核心认为这个驱动应当处理; 探测 ...

  9. 树莓派4安装net core3.0环境

    树莓派4官方系统是32系统,所以需要安装arm32版本的net core sk和runtime 1,首先创建一个文件夹 dotnet-arm32 sudo mkdir dotnet arm32 2,下 ...

  10. struts2生成随机验证码图片

    之前想做一个随机验证码的功能,自己也搜索了一下别人写的代码,然后自己重新用struts2实现了一下,现在将我自己实现代码贴出来!大家有什么意见都可以指出来! 首先是生成随机验证码图片的action: ...