经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Scala » 查看文章
Scala的类继承
来源:cnblogs  作者:codegeekgao  时间:2018/9/25 20:22:12  对本文有异议

Scala的类继承

  • extend

    Scala扩展类的方式和java一样使用extends关键字
    class Employee extends Person {

}

与java一样,可以在定义的子类重写超类的方法,定义父类不存在的属性和方法

  • override
  1. class Person {
  2. override def toString = getClass.getName +"name="
  3. }

在Scala中调用的超类的方法和java完全一致,使用super关键字

  1. public class Employee extends Person {
  2. override def toString = super.toString
  3. }
  • 类型检查和转换

    测试某个对象是否某个给定的类,可以使用isInstanceOf方法,如果返回true,可以使用asInstanceOf方法将引用转为子类的引用,现在看下面的代码:

  1. if(p.isInstanceOf[Employee]) {
  2. // s的类型为Employee
  3. val s = p.asInstanceOf[Employee]
  4. }

分析上面的代码片段,若p指向的是Employee类及其子类(假定子类是Manager),则p.isInstanceOf[Employee] 返回true,否则返回false,另外还有一种情况是:p指向是一个Employee对象而不是其子类,可以使用 if(p.getClass == classOf[Employee])

  • 保护字段

    与java一致,可以将字段或方法声明为protected,这样的成员可以被任何子类访问,但其他位置无法访问。Scala中提供了protected[this] 将访问权限限定在当前的对象

  • 构造的执行优先级

    当你在子类重写val并且在超类的构造器中使该值的话,不一定可以看到重写的val变量。以下面例子说明

  1. 父类:
  2. class Animal {
  3. val age : Int = 10
  4. val array : Array[Int] = new Array[Int](age)
  5. }
  6. 子类:
  7. class Ant extends Animal {
  8. override val age = 2
  9. }

类装载机制运行大致如下

  1. Ant的构造器初始化之前,调用Animal的构造器
  2. Animal的构造器将age设置为10
  3. Animal的构造器初始化array数组,调用age()取值器
  4. 输出Ant类的range字段值
  5. range方法返回0(默认值为0)
  6. env被设为长度为0的数组
  7. Ant的构造器继续执行,将其range字段设为2

    从代码看range可能为10或者为2,但是env被设为长度为0的数组,因为字段默认都有get/set方法,Ant类继承了env,由于env没有重写,默认构造为长度为0的数组
    解决冲突有以下方法:

  1. 1. val声明为final
  2. 2. 在超类中val声明为lazy
  3. 3. 在子类总使用提前定义语法如下:
  4. class Ant extends{ override val range = 2}with Animal
  • 对象相等性

    当定义产品Item可能会认为两个物件有相同的描述和价格就是相等的,应该是以下equals方法

  1. final override def equals(other: Any) = {
  2. val that = other.asInstanceOf[Item]
  3. if(that==null) false else description ==that.description && price ==that.price
  4. }
  5. 注意要确保equals的方法参数类型为Any,否则不会重写equals方法
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号