zoukankan      html  css  js  c++  java
  • Scala的类继承

    Scala的类继承

    • extend

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

    }

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

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

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

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

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

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

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

    • 保护字段

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

    • 构造的执行优先级

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

    父类:
    class Animal {
        val age : Int = 10
        val array : Array[Int] = new Array[Int](age)
    }
    
    子类:
    class Ant extends Animal {
        override val age = 2
    }
    

    类装载机制运行大致如下

    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. 将val声明为final
    2. 在超类中val声明为lazy
    3. 在子类总使用提前定义语法如下:
    class  Ant extends{ override val range = 2}with Animal
    
    • 对象相等性

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

    final override def equals(other: Any) = {
        val that = other.asInstanceOf[Item]
        if(that==null) false else description ==that.description && price ==that.price
    }
    注意要确保equals的方法参数类型为Any,否则不会重写equals方法
    
  • 相关阅读:
    三十四:布局之混合布局、圣杯布局、双飞翼布局
    三十三:布局之经典的列布局
    三十二:布局之经典的行布局
    三十一:CSS之CSS定位之position
    三十:CSS之用浮动实现网页的导航和布局
    二十九:CSS之浮动float
    二十八:CSS之列表list-type
    二十七:CSS之背景background
    二十六:CSS之盒子模型之小案例
    二十五:CSS之盒子模型之display属性
  • 原文地址:https://www.cnblogs.com/codegeekgao/p/9621778.html
Copyright © 2011-2022 走看看