• scala入门教程:scala中的面向对象定义类,构造函数,继承


    我们知道scala中一切皆为对象,函数也是对象,数字也是对象,它是一个比java还要面向对象的语言。

    定义scala的简单类

    class Point (val x:Int, val y:Int)

    上面一行代码就是一个scala类的定义:

    1. 首先是关键字class
    2. 其后是类名 Point
    3. 类名之后的括号中是构造函数的参数列表,这里相当于定义了对象的两个常量,其名称分别为x,y,类型都是Int

    上面的类和下面的类是一致的,不过更精简了。

    class Point (xArg:Int, yArg:Int) {
      val x = xArg
      val y = yArg
    }

    我们写一个main方法,看下如何使用这个Point类。

    object App {
      def main(args : Array[String]) {
        val p = new Point(10,20)
        println("point info(" + p.x + "," + p.y + ")")
      }
    }

    在main方法中通过val p = new Point(10,10)来初始化一个Point类的实例,然后就可以访问p.x和p.y字段了。

    scala对象的构造函数

    只是初始化字段的构造函数

    如下Point类示例,在构造函数中初始化了isOrigin,表示此点是否为原点

    class Point (val x:Int, val y:Int) {
      val isOriginal:Boolean = {
        x == 0 && y == 0
      }
    }

    上述代码中的isOriginal后面花括号内的内容是构造函数。

    通过this定义的scala构造函数

    class Point (val x:Int, val y:Int) {
      val isOriginal:Boolean = {
        x == 0 && y == 0
      }
    
      def this(xArg:Int) {
    println("hello, I'm this constructor")     this(xArg,0)   } }

    如上述代码定义了一个只有一个参数的构造函数,这个构造函数调用了默认的构造函数,传了xArg,和0值。这样写的构造函数可以做初始化字段之外的事情。构造函数之间是可以通过this(...)相互调用的。

    scala的继承

    实现继承

    下面我们实现一个Point的继承类TalkPoint这个Point具有可以把自己的坐标打印出来。

    class TalkPoint(x:Int, y:Int) extends Point (x,y) {
      def talk() = {
        println("my position is ("+x+","+y+")")
      }
    }

    上面的TalkPoint类继承于Point,注意它的默认构造函数,x,y之前没有val的修饰,extends Point(x,y) 之后会自动调用基类的构造函数。我们可以通过下面代码,调用这个子类的talk方法

    object App {
      def main(args : Array[String]) {
        val p = new TalkPoint(0,0)
        p.talk()
      }
    }

    运行程序将输出:my position is (0,0)

    重写基类的方法

    下面我们再创建一个TalkPoint的子类,这个类叫HappyTalkPoint,该子类会重写TalkPoint的talk方法。如下代码: 

    class HappyTalkPoint(x:Int, y:Int) extends TalkPoint(x,y) {
      override def  talk() = {
        println("I'm happy")
        super.talk()
      }
    }

     在talk方法的def关键字前面有一个override关键字,来表示重写,这个关键字时必须的,否则编译器会报错;这一点和java中有所不同。在这个方法的实现里面我们先打印出了I'm happy,然后通过super.talk()调用了父类的方法。

    我们修改下App类的main方法:

    object App {
      def main(args : Array[String]) {
        val p = new HappyTalkPoint(0,0)
        p.talk()
      }
    }

    运行程序将会输出:

    I'm happy
    my position is (0,0)
  • 相关阅读:
    pugixml
    C++ 头文件的理解
    图像的特征
    光圈与景深
    Unix高级环境编程
    用libtommath实现RSA算法
    【linux+C】神器 vim + 指针相关客串
    【算法25】对称子字符串的最大长度
    设计并实现同时支持多种视频格式的流媒体点播系统
    递归再一次让哥震惊了
  • 原文地址:https://www.cnblogs.com/nele/p/5185509.html
Copyright © 2020-2023  润新知