Scala系列14:scala继承,重写,super,类型推断等使用详解
0.Scala继承
scala语言是支持面向对象编程的,我们也可以使用scala来实现继承,通过继承来减少重复代码。
0.1定义语法
- scala和Java一样,使用extends关键字来实现继承
- 可以在子类中定义父类中没有的字段和方法,或者重写父类的方法
- 类和单例对象都可以从某个父类继承
语法
class/object 子类 extends 父类 {
..
}
Copy
示例
0.2示例 | 类继承
- 定义一个Person类,再定义一个Student类,继承自Person类
- 创建一个Student类对象实例,并设置name为“张三”
- 打印姓名
参考代码
package com.robot.scalademo1
class Person3
class Student3 extends Person3
object _08ObjectDemo {
class Person {
var name = "super"
def getName = this.name
}
class Student extends Person //注意如果类没有实体,可以省略{}
def main(args: Array[String]): Unit = {
val p1 = new Person()
val p2 = new Student()
val p3:Student = new Student() //注意这种写法,和上面的写法一样,主要前后类型一致,可以省略。如果不一致,则不可以省略
p2.name = "张三"
p3.name ="tom "
println(p2.getName)
println(p3.getName)
/**结果如下:
* 张三
tom
*/
/
}
}
0.3 示例 | 单例对象继承
示例说明
- 创建一个Student单例对象,让单例对象继承示例1中的Person类
设置单例对象的名字为”张三”,调用Student单例对象的getName方法
class Person {
var name = “super”def getName = this.name
}object Student extends Person
object Main13 {
def main(args: Array[String]): Unit = {println(Student.getName)
}
}
1.override和super
类似于Java语言,我们在子类中使用override需要来重写父类的成员,可以使用super来引用父类
1.1 用法
- 子类要覆盖父类中的一个方法,必须要使用override关键字
- 使用override来重写一个val字段
- 使用super关键字来访问父类的成员方法
1.2 示例
定义一个Person类,包含
- 姓名字段(不可重新赋值)
- 获取姓名方法
定义一个Student类
- 重写姓名字段
- 重写获取姓名方法,返回”hello, “ + 姓名
- 创建Student对象示例,调用它的getName方法
参考代码
object _08ObjectDemo {
class Person {
val name = "super"
def getName = name
}
class Student extends Person {
// 重写val字段
override val name: String = "child"
// 重写getName方法
override def getName: String = "hello, " + super.getName
}
def main(args: Array[String]): Unit = {
println(new Student().getName) //hello, child
}
}
1.类型判断
有时候,我们设计的程序,要根据变量的类型来执行对应的逻辑。
在scala中,如何来进行类型判断呢?
1.1类型推断有两种方式:
- isInstanceOf
- getClass/classOf
1.1.1 第一种isInstanceOf/asInstanceOf
在Java中,我们可以使用instanceof关键字来判断类型、以及(类型)object来进行类型转换,在scala中如何实现呢?
scala中对象提供isInstanceOf和asInstanceOf方法。
- isInstanceOf判断对象是否为指定类的对象
asInstanceOf将对象转换为指定类型
// 判断对象是否为指定类型
val trueOrFalse:Boolean = 对象.isInstanceOf[类型]
// 将对象转换为指定类型
val 变量 = 对象.asInstanceOf[类型]
1.1.2 isInstanceOf/asInstanceOf演示
示例说明
- 定义一个Person类
- 定义一个Student类继承自Person类
- 创建一个Student类对象
- 判断该对象是否为Student类型,如果是,将其转换为Student类型并打印该对象
参考代码
package com.robot.scalademo1
class Person3
class Student3 extends Person3
object _08ObjectDemo {
def main(args: Array[String]): Unit = {
val s1:Person3 = new Student3 //注意这种写法,申明s1的类型是Person3,最终指向却是Student3.
// 判断s1是否为Student3类型
if(s1.isInstanceOf[Student3]) {
// 将s1转换为Student3类型
val s2 = s1.asInstanceOf[Student3]
println(s2) //com.robot.scalademo1.Student3@6366ebe0
}
}
1.2 getClass和classOf
isInstanceOf 只能判断对象是否为指定类以及其子类的对象,而不能精确的判断出,对象就是指定类的对象。如果要求精确地判断出对象就是指定类的对象,那么就只能使用 getClass 和 classOf 。
1.2.1 用法
- p.getClass可以精确获取对象的类型
- classOf[x]可以精确获取类型
- 使用==操作符可以直接比较类型
1.2.2 示例
示例说明
- 定义一个Person类
- 定义一个Student类继承自Person类
- 创建一个Student类对象,并指定它的类型为Person类型
- 测试使用isInstance判断该对象是否为Person类型
- 测试使用getClass/classOf判断该对象是否为Person类型
- 测试使用getClass/classOf判断该对象是否为Student类型
参考代码
class Person4
class Student4 extends Person4
object Student4{
def main(args: Array[String]) {
val p:Person4=new Student4
//判断p是否为Person4类的实例
println(p.isInstanceOf[Person4])//true
//判断p的类型是否为Person4类
println(p.getClass == classOf[Person4])//false
//判断p的类型是否为Student4类
println(p.getClass == classOf[Student4])//true
}
}
还没有评论,来说两句吧...