内部类

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. linux 安装一个中断处理

    如果你想实际地"看到"产生的中断, 向硬件设备写不足够; 一个软件处理必须在系统中配 置. 如果 Linux 内核还没有被告知来期待你的中断, 它简单地确认并忽略它. 中断线是一个 ...

  2. 消息驱动Bean

    消息驱动bean是专门用来处理基于消息请求的组件.MDB负责处理消息,而EJB容器则负责处理服务(事务,安全,并发,消息确认等),使Bean的开发者集中精力在处理消息的业务逻辑上. 消息驱动Bean. ...

  3. css隐藏滚动条、移动端滚动卡顿的解决

    1.如果想保持容器能够滚动,同时不想看到丑陋的滚动条,chrome.firefox和移动端上不考虑兼容性直接 element::-webkit-scrollbar{ display:none } 2. ...

  4. 使用Sklearn-train_test_split 划分数据集

    使用sklearn.model_selection.train_test_split可以在数据集上随机划分出一定比例的训练集和测试集 1.使用形式为: from sklearn.model_selec ...

  5. 14.python函数

    原文:https://www.cnblogs.com/linhaifeng/articles/6113086.html 1.python中函数定义:函数是逻辑结构化和过程化的一种编程方法. pytho ...

  6. nor flash之频率限制

    背景 支持一款nor flash时,出于性能考虑,一般会查看其nor支持的最高频率以及主控端spi控制器的最高频率,以选择一个合适的运行频率. 对于一款主控支持多款flash的情况,还得考虑好兼容性等 ...

  7. ant design 的Table组件固定表头时不对齐

    现在有一个表格,里面的列数是不固定的(可以重复写入数据),且列数行数都可能很多,就带来一个问题: 必须要固定表头,但是antd 的表格组件设置了固定表格 scroll={{x:1000,y:300}} ...

  8. Linux中安装软件和各种常用命令

    1.Centos7中安装mysql5.7的链接:http://blog.csdn.net/fanpeizhong/article/details/73557202 2.修改mysql默认密码的链接:h ...

  9. Java动态代理 ----- jdk代理与cglib代理

    1.jdk代理 针对接口进行代理,接口可以没有方法, InvocationHandler会拦截所有方法,不过好像意义不大....只能执行Object类的方法,执行结果有点奇怪... package t ...

  10. 如何在Linux上创建,列出和删除Docker容器

    本篇文章介绍的内容是关于在Linux机器上创建,列出和删除docker容器,下面我们来看具体的内容. 1.启动Docker容器 使用下面的命令启动新的Docker容器.这将启动一个新的容器,并为你提供 ...