zoukankan      html  css  js  c++  java
  • 快学Scala(8)--继承

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

      如果p指向的是Employee及其子类的对象,则o.isInstanceOf[Employee]将会成功;

      如果p是null,则p.isInstanceOf[Employee]将会返回false,且p.asInstanceOf[Employee]将会返回null

      如果p不是一个Employee,则p.asInstanceOf[Employee]将抛出异常

    如果想测试p指向的是一个Employee对象但又不是其子类的话,可以用:

    if(p.getClass == classOf[Employee])
    

      

    不过,与类型检查和转换相比,模式匹配通常是更好的选择:

    p match {
      case s: Employee => ...  //将s作为Employee处理
      case _ =>           //p不是Employee
    }

     

    超类的构造:

    class Employee(name: String, age: Int, val salary: Double) extends Person(name, age)
    

      

    提前定义:

    class Creature {
      val: range: Int = 10
      val env: Array[Int] = new Array[Int](range)
    }

    class Ant extends Creature {
      overide val range = 2
    }

    当构造Ant类的对象时事情发生的过程如下所示:

    1. Ant的构造器在做它自己的构造之前,调用Creature的构造器

    2. Creature的构造器将它的range字段设为10

    3. Creature 的构造器为了初始化env数组,调用range()取值器

    4. 该方法被重写以输出(还未初始化的)Ant类的range字段值

    5. range方法返回0

    6. env被设为长度为0的数组

    7. Ant构造器继续执行,将其range字段设置为2

     此时若输出Ant类的对象的range属性和env属性的长度结果如下图:

    上述Scala代码反编译为Java代码后为:

    public class Creature
    {
      public int range()
      {
        return this.range;
      }
    
      private final int range = 10;
    
      public int[] env()
      {
        return this.env;
      }
    
      private final int[] env = new int[range()];
    }
    public class Ant extends Creature
    {
      public int range()
      {
        return this.range;
      }
    
      private final int range = 2;
    }

    在这种情况下,env数组长度正常:

    class Creature(var range: Int = 10) {
      val env: Array[Int] = new Array[Int](range)
    }
    
    class Ant extends Creature(range = 5) {
    }
    

      输出:

  • 相关阅读:
    Tomcat下HTTPS双向认证配置以及客户端调用案例
    Java本地运行中文正常,部署到Weblogic中文乱码
    gson 忽略掉某些字段不进行转换
    JavaScript中定义对象的四种方式
    使用CSS3实现超炫的Loading(加载)动画效果
    不要再使用JS框架了
    HTML5, CSS3, ES5新的web标准和浏览器支持一览 转
    js常用的事件对象
    jQuery用面向对象的思想来编写验证表单的插件
    五个值得尝试的前端开发工具
  • 原文地址:https://www.cnblogs.com/PaulingZhou/p/6625840.html
Copyright © 2011-2022 走看看