scala 继承

继承

抽象类:abstract class ,抽象类中可以有抽象字段、非抽象字段、抽象方法、非抽象方法。

重写抽象字段、抽象方法时,可以不带override关键字;重写非抽象字段、非抽象方法时,必须带override关键字;

abstract class Person2 {
  //抽象字段,不能用private关键字修饰,否则子类不能进行重写
  var name: String
  //具体字段
  val age: Int = 23
  //抽象方法
  def say(context: String)
  //具体方法
  def run: Unit = {
    println("跑步")
  }
}

class Student2 extends Person2 {
  //重写抽象字段,可以不加override,既可以用val,也可以用var修饰
  var name: String = "张三"
  //重写非抽象字段,必须带override
  override val age: Int = 30
  //子类重写父类的抽象方法,可以不用override关键字修饰
  def say(context: String): Unit = {
    println(context)
  }
  //子类重写父类的非抽象方法,必须要用override关键字修饰
  override def run = {
    println("跑步.....")
  }
}

object Per {
  def main(args: Array[String]): Unit = {
    val p = new Student2
    println(p.name)
    println(p.age)
    p.say("hello")
    p.run
  }
}

isInstanceOf & asInstanceOf,getClass & classOf[]比较

isInstanceOf 判断一个对象是否是指定的类或其子类的实例,不能做精确判断

asInstanceOf 将对象转换成指定的类型,在使用前应先用isInstanceOf判断

如果要精确判断,可以使用getClass 和classOf[]进行判断

class Animal {
  def say = {
    println("hello")
  }
}

class Dog extends Animal {
  override def say = {
    println("汪汪汪")
  }
}

class Cat extends Animal {
  override def say = {
    println("喵喵喵")
  }
}

object ObjectDemo_08 {
  def main(args: Array[String]): Unit = {
    val dog = new Dog
    //isInstanceOf 判断一个对象是否是指定的类或其子类的实例,不能做精确判断
    if(dog.isInstanceOf[Animal]){
      //asInstanceOf 将对象转换成指定的类型,在使用前应先用isInstanceOf判断
      val d = dog.asInstanceOf[Animal]
      d.say
    }
    
    val cat = new Cat
    //如果要精确判断,可以使用getClass 和classOf[]进行判断
    println(cat.getClass == classOf[Cat])//true
  }
}

子类调用父类的构造函数

* 子类继承父类,在创建子类的对象时,一定是先初始化父类的构造函数,然后再执行子类的构造函数

class Person09(var name: String, var age: Int) {
  println("主构造器代码块")
  println(name + ":" + age)
}
//子类的构造函数与父类的构造函数中参数名字一样,那么子类中相同的参数名称,不能用任何关键字修饰,否则scala会认为子类重写父类的field
class Student091(name: String, age: Int, var sex: String) extends Person09("小红", 24) {
  println("Student091构造代码块")
  println(name + ":" + age + ":" + sex)
}
class Student092(name: String, age: Int, var sex: String) extends Person09(name, age) {
  println("Student092构造代码块")
  println(name + ":" + age + ":" + sex)
}

object ObjectDemo09 {
  def main(args: Array[String]): Unit = {
    new Student091("小王", 23, "男")
    println("--------")
    new Student092("小张", 28, "女")
  }
}
运行结果:
主构造器代码块
小红:24
Student091构造代码块
小王:23:男
--------
主构造器代码块
小张:28
Student092构造代码块
小张:28:女

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值