Scala中继承介绍

​点击蓝字之后,我们就是好朋友了啦

 

 

 

扩展类

 

Scala扩展类的方式和Java一样,使用extend关键字:

class Employee extends Person {
  val salary = 0.0
}

如上面代码所示,和Java一样在定义中给出了子类需要而父类没有的字段和方法,或者根据实际情况重写父类中的方法。

 

我们也可以将类声明为final,这样就不可以被扩展了(即不可被其他类继承),当然也可以在单个字段或者方法上声明final,以确保他们不被重写。

注意:Java中final字段是不可变的,类似Scala中的val。

 

 

重写方法

 

在Scala中重写一个非抽象方法必须使用override修饰符。例如:

class Person {
  def description() = "this is a person."
}

class Employee extends Person {
  val salary = 0.0
  override def description(): String = "this is a employee"
}

override修饰符可以在多个常见情况下给出有用的错误提示,包括:

  1. 当你拼错了要重写的的方法名。

  2. 当你不小心在新方法中使用了错误的参数类型。

  3. 当你在超类中引入了新的方法,而这个新的方法与子方法相抵触。

 

在Scala中调用超类的方法和Java一样,使用super关键字:

class Person {
  def description():String = "this is a person."
  def name(): String = {
    "jason"
  }
}

class Employee extends Person {
  val salary = 0.0
  override def description(): String = {
    super.name // 调用父类中的name方法
    "this is a employee"
  }
}

 

 

类型检查和转换

 

要测试某个对象是否属于某个给定的类,可以用isInstanceOf方法,如果测试成功你可以用asInstanceOf方法将引用转换为子类的引用。

if (emp.isInstanceOf[Employee]){
      // employee 即为 Employee 类型
      val employee = emp.asInstanceOf[Employee]
    }

 

 

超类的构造

 

类有一个主构造器和任意数量的辅助构造器,而每个辅助构造器都必须以对先前定义的辅助构造器或主构造器的调用开始。这样的话,辅助构造器永远不可能直接调用超类的构造器。子类的辅助构造器最终都会调用主构造器。只有主构造器才会调用超类的构造器。

我们定义一个子类和调用超类构造器的主构造器

abstract class Per(name: String, age: Int) {
   
}

class Employee(name: String, age: Int, salary: Double)
  extends Per(name, age) {
   
}

将类和构造器定义在一起更加精简代码,把主构造器的参数当做是类的参数更加容易理解。子类中的name,age参数通过超类中的参数来传递。

 

我们可以使用Java来进行相同的定义与Scala进行对比

class Person {
        private String name;
        private Integer age;

        Person(String name, Integer age) {
            this.name = name;
            this.age = age;
        }
    }

    class Employee extends Person {
        private Double salary;

        Employee(String name, Integer age, Double salary) {
            super(name, age);
            this.salary = salary;
        }
    }

 

 

抽象字段、方法

 

和Java一样,我们可以使用abstract关键字来标记不能被实例化的类,这是因为它的某个字段或类没有被完整定义。

abstract class Per(name: String, age: Int) {
  val address: String // 没有初始化,抽象字段,带有默认的getter和setter方法
  def id: Int // 定义一个抽象方法,没有方法体
}

class Employee(name: String, age: Int, salary: Double)
  extends Per(name, age) {
  def id: Int = name.hashCode // 不需要overwrite关键字就可以重写超类中的抽象方法
  val address: String = "china"
}

 

 

 

 

 

长按识别图中二维码

关注获取更多资讯

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值