scala语言是支持面向对象编程的,我们也可以使用scala来实现继承,通过继承来减少重复代码。
语法
class/object 子类 extends 父类 { .. } Copy 示例定义一个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 */ / } }示例说明
创建一个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) } }类似于Java语言,我们在子类中使用override需要来重写父类的成员,可以使用super来引用父类
参考代码
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 } }有时候,我们设计的程序,要根据变量的类型来执行对应的逻辑。
在scala中,如何来进行类型判断呢?
在Java中,我们可以使用instanceof关键字来判断类型、以及(类型)object来进行类型转换,在scala中如何实现呢?
scala中对象提供isInstanceOf和asInstanceOf方法。
isInstanceOf判断对象是否为指定类的对象asInstanceOf将对象转换为指定类型 // 判断对象是否为指定类型 val trueOrFalse:Boolean = 对象.isInstanceOf[类型] // 将对象转换为指定类型 val 变量 = 对象.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 } }isInstanceOf 只能判断对象是否为指定类以及其子类的对象,而不能精确的判断出,对象就是指定类的对象。如果要求精确地判断出对象就是指定类的对象,那么就只能使用 getClass 和 classOf 。
示例说明
定义一个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 } }
