Scala 学习(4)之「类——基本概念2」
内部类
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」的更多相关文章
- Scala 学习(3)之「类——基本概念1」
类 小提示:可以通过:paste进入 Scala 的多行模式,输入对应的代码块之后,按ctrl + D退出多行模式,然后再调用刚才输入的函数或者方法进行测试 //定义类,包含 field 以及方法 c ...
- scala学习笔记(3):类
1 类 (1) scala把主构造函数放到类的定义中,让定义字段及相应方法变得简单起来. class People(age: Int, name: String) scala会自动将这个类变成publ ...
- Scala学习文档-样本类与模式匹配(match,case,Option)
样本类:添加了case的类便是样本类.这种修饰符可以让Scala编译器自动为这个类添加一些语法上的便捷设定. //样本类case class //层级包括一个抽象基类Expr和四个子类,每个代表一种表 ...
- scala学习笔记2(类,继承,抽象类)
class Person{ // _ 是占位符; var name : String = _ val age : Int = 27 // private[this] 定义的内容无法外部使用,起到保护作 ...
- scala学习笔记:理解类继承
scala> import scala.reflect._ import scala.reflect._ scala> class Person(@BeanProperty var nam ...
- Scala学习(五)---Scala中的类
Scala中的类 摘要: 在本篇中,你将会学习如何用Scala实现类.如果你了解Java或C++中的类,你不会觉得这有多难,并且你会很享受Scala更加精简的表示法带来的便利.本篇的要点包括: 1. ...
- [Scala]Scala学习笔记四 类
1. 简单类与无参方法 class Person { var age = 0 // 必须初始化字段 def getAge() = age // 方法默认为公有的 } 备注 在Scala中,类并不声明为 ...
- Scala 学习之路(八)—— 类和对象
一.初识类和对象 Scala的类与Java的类具有非常多的相似性,示例如下: // 1. 在scala中,类不需要用public声明,所有的类都具有公共的可见性 class Person { // 2 ...
- Net基础篇_学习笔记_第十一天_面向对象(面向过程与面向对象的区别/类的概念)
1.面向过程-----> 面向对象 面向过程:面向的是完成这件事儿的过程,强调的是完成这件事儿的动作. 把大象塞进冰箱里1.打开冰箱门2.把大象塞进去,亲下大象的屁股3.关闭冰箱门 孙全 瘦小 ...
随机推荐
- 2018-8-10-win10-uwp-获取文件夹出错
title author date CreateTime categories win10 uwp 获取文件夹出错 lindexi 2018-08-10 19:16:50 +0800 2018-2-1 ...
- Vue中的scoped及穿透方法(修改第三方组件局部的样式)
何为scoped? 在vue文件中的style标签上,有一个特殊的属性:scoped.当一个style标签拥有scoped属性时,它的CSS样式就只能作用于当前的组件,也就是说,该样式只能适用于当前组 ...
- 理解Servlet
题记:框架横行,似乎已经忘记JavaWeb最基础Servlet是如何工作的,这也是为什么要写这篇文章. Servlet是Java语言应用到Web的扩展技术,是运行在Web应用服务器上的Java程序.与 ...
- HDU 2068 RPG错排 [错排公式]
1.题意:1到N的序列的排列中,元素位置与元素值相对应的情况(值为i的元素在某个排列中正好排在第i个位置)大于等于序列规模一半的情况,有多少个? 2.输入输出:每组数据一个数,N,规定输入以0结尾: ...
- java中如何自动获取电脑的ip地址
String ip=InetAddress.getLocalHost().getHostAddress().toString(); 可以写一个main方法测试一下.
- blackarch 安装指南
建议直接 www.blackangle.cn/BlackArchGuide.htm v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#de ...
- linux tomcat安装
一.下载tomcat包 下载tomcat包并上传至服务器中 解压文件: tar -zxvf apache-tomcat-8.5.47.tar.gz 为了后期程序的便于管理,我们还需要将Tomcat复制 ...
- Java虚拟机详解(十一)------双亲委派模型
在上一篇博客,我们介绍了类加载过程,包括5个阶段,分别是“加载”,“验证”,“准备”,“解析”,“初始化”,如下图所示: 本篇博客,我们来介绍Java虚拟机的双亲委派模型,在介绍之前,我先抛出一个问题 ...
- 浅析vue封装自定义插件
在使用vue的过程中,经常会用到Vue.use,但是大部分对它一知半解,不了解在调用的时候具体做了什么,因此,本文简要概述下在vue中,如何封装自定义插件. 在开始之前,先补充一句,其实利用vue封装 ...
- IOS系统唤醒微信内置地图
针对前一篇文章 唤醒微信内置地图 后来发现在IOS系统中运行 唤醒地图会无效的问题.因为在IOS上无法解析这俩个字符串的问题! 需要对经纬度 使用 “parseFloat()”进行转换 返回一个浮点数 ...