内部类

import scala.collection.mutable.ArrayBuffer
class Class {
class Student(val name: String) {} //此处为内部类
val students = new ArrayBuffer[Student]
def getStudent(name: String) = {
new Student(name)
}
} val c1 = new Class
val s1 = c1.getStudent("0mifang")
c1.students += s1 val c2 = new Class
val s2 = c2.getStudent("0mifang1")
c1.students += s2 //错误的演示

extends

  • 继承就代表子类可以从父类继承父类的 field 和 method ;然后子类可以在自己内部放入父类所没有,子类特有的 field 和 method,使用继承可以有效复用代码。
  • 子类可以覆盖父类的 field 和 method,但是如果父类用 final 修饰,field 和 method 用 final 修饰,则该类是无法被继承的,field 和 method 是无法被覆盖的。
class Person {
private var name = "0mifang"
def getName = name
}
class Student extends Person {
private var score = "A"
def getScore = score
} var student = new Student
student.getName

override和super

  • 如果子类要覆盖一个父类中的非抽象方法,则必须使用 override 关键字 override
  • 关键字可以帮助我们尽早地发现代码里的错误,比如:override 修饰的父类方法的方法名我们拼写错了;比如要覆盖的父类方法的参数我们写错了;等等
  • 此外,在子类覆盖父类方法之后,如果我们在子类中就是要调用父类的被覆盖的方法,那就可以使用 super 关键字,显式地指定要调用父类的方法
class Person {
private var name = "0mifang"
def getName = name }
class Student extends Person {
private var score = "A"
def getScore = score override def getName = "Hi, I'm " + super.getName
} var student = new Student
student.getName // 可以发现,student 类继承了 Person 类的 getName 方法

override field

子类可以覆盖父类的 val field,而且子类的 val field 还可以覆盖父类的 val field 的 getter 方法,只要在子类中使用 override 关键字即可

class Person {
val name: String = "Person"
def age: Int = 0
} class Student extends Person {
override val name: String = "0mifang"
override val age: Int = 18
} val person = new Person
val student = new Student
person.name
person.age
student.name
student.age

isInstanceOf和asInstanceOf

如果我们创建了子类的对象,但是又将其赋予了父类类型的变量。则在后续的程序中,我们又需要将父类类型的变量转换为子类类型的变量,应该如何做?

首先,需要使用 isInstanceOf 判断对象是否是指定类的对象,如果是的话,则可以使用 asInstanceOf 将对象转换为指定类型。

  • 如果对象是 null,则 isInstanceOf 一定返回 false,asInstanceOf 一定返回null;
  • 如果没有用 isInstanceOf 先判断对象是否为指定类的实例,就直接用 asInstanceOf 转换,则可能会抛出异常。
class Person
class Student extends Person
val p: Person = new Student
var s: Student = null
// 如果 p 是 Student 类,则让 s 指向 p 转换为 Student 的对象
if (p.isInstanceOf[Student]) s = p.asInstanceOf[Student]

getClass和classOf

  • isInstanceOf 只能判断出对象是否是指定类以及其子类的对象,而不能精确判断出,对象就是指定类的对象;
  • 对象.getClass 可以精确获取对象的类,classOf[类] 可以精确获取类,然后使用 == 操作符即可判断。
class Person
class Student extends Person val p: Person = new Student
p.isInstanceOf[Person] //true
p.getClass == classOf[Person] //false
p.getClass == classOf[Student] //true







欢迎关注,本号将持续分享本人在编程路上的各种见闻。

Scala 学习(4)之「类——基本概念2」的更多相关文章

  1. Scala 学习(3)之「类——基本概念1」

    类 小提示:可以通过:paste进入 Scala 的多行模式,输入对应的代码块之后,按ctrl + D退出多行模式,然后再调用刚才输入的函数或者方法进行测试 //定义类,包含 field 以及方法 c ...

  2. scala学习笔记(3):类

    1 类 (1) scala把主构造函数放到类的定义中,让定义字段及相应方法变得简单起来. class People(age: Int, name: String) scala会自动将这个类变成publ ...

  3. Scala学习文档-样本类与模式匹配(match,case,Option)

    样本类:添加了case的类便是样本类.这种修饰符可以让Scala编译器自动为这个类添加一些语法上的便捷设定. //样本类case class //层级包括一个抽象基类Expr和四个子类,每个代表一种表 ...

  4. scala学习笔记2(类,继承,抽象类)

    class Person{ // _ 是占位符; var name : String = _ val age : Int = 27 // private[this] 定义的内容无法外部使用,起到保护作 ...

  5. scala学习笔记:理解类继承

    scala> import scala.reflect._ import scala.reflect._ scala> class Person(@BeanProperty var nam ...

  6. Scala学习(五)---Scala中的类

    Scala中的类 摘要: 在本篇中,你将会学习如何用Scala实现类.如果你了解Java或C++中的类,你不会觉得这有多难,并且你会很享受Scala更加精简的表示法带来的便利.本篇的要点包括: 1. ...

  7. [Scala]Scala学习笔记四 类

    1. 简单类与无参方法 class Person { var age = 0 // 必须初始化字段 def getAge() = age // 方法默认为公有的 } 备注 在Scala中,类并不声明为 ...

  8. Scala 学习之路(八)—— 类和对象

    一.初识类和对象 Scala的类与Java的类具有非常多的相似性,示例如下: // 1. 在scala中,类不需要用public声明,所有的类都具有公共的可见性 class Person { // 2 ...

  9. Net基础篇_学习笔记_第十一天_面向对象(面向过程与面向对象的区别/类的概念)

    1.面向过程-----> 面向对象 面向过程:面向的是完成这件事儿的过程,强调的是完成这件事儿的动作. 把大象塞进冰箱里1.打开冰箱门2.把大象塞进去,亲下大象的屁股3.关闭冰箱门 孙全 瘦小 ...

随机推荐

  1. H3C 递归查询

  2. 浅谈javaScript数据类型、变量、内存之间的关系,文末有图解

    一.变量是没有类型的 在JavaScript中,定义变量的方法是“var 变量名=变量值”,无论这个变量要给他赋值为一个数字.字符串还是数组,他的类型都不需要声明.也就是说如果我只声明了一个变量“va ...

  3. MySQL排序问题

    直接上SQL语句: SELECT * FROM user_test ORDER BY user_name ,user_money DESC; #user_name中如果是数字会先排在前面,然后在按字母 ...

  4. import()函数

    简介 import命令会被 JavaScript 引擎静态分析,先于模块内的其他模块执行(叫做”连接“更合适).所以,下面的代码会报错. // 报错 if (x === 2) { import MyM ...

  5. 2019-1-29-UWP-IRandomAccessStream-与-Stream-互转

    title author date CreateTime categories UWP IRandomAccessStream 与 Stream 互转 lindexi 2019-01-29 16:33 ...

  6. 编写jQuery插件的方法和注意点

    编写jQuery插件的方法和注意点 插件的种类 jQuery的插件主要分为3种类型. 1. 封装对象方法的插件 这种插件是将对象方法封装起来,用于对通过选择器获取的jQuery对象进行操作,是最常见的 ...

  7. 2018-11-17-win10-uwp-在-xaml-让-TextBlock-换行

    title author date CreateTime categories win10 uwp 在 xaml 让 TextBlock 换行 lindexi 2018-11-17 16:2:29 + ...

  8. 【Ubuntu】查看端口占用及关闭

    1.查看已连接的服务端口 (ESTABLISHED) netstat有一个快捷键[ss] netstat -a ss -a 2.查看所有的服务端口(LISTEN,ESTABLISHED) netsta ...

  9. stm32外部时钟源8M换成12M后库函数相应修改总结

    前言 在做“自制继电器上位机控制软件”项目的时候,下位机用到USB虚拟串口,将以前写好的USB虚拟串口程序移植到下位机,发现程序计算机无法识别到虚拟串口STMicroelectronics Virtu ...

  10. javascript 闭包的理解(一)

    过很多谈如何理解闭包的方法,但大多数文章,都是照抄或者解释<Javascript高级程序设计(第三版)>对于闭包的讲解,甚至例程都不约而同的引用高程三181页‘闭包与变量’一节的那个“返回 ...