• scala之旅-核心语言特性【类】(四)


    类在Scala中是创建对象的蓝图。类可以包含方法、值、变量、类型、对象、特性和类,这些统统称为类的成员。类型,对象和特性将在之后的章节介绍。

    定义一个类

    一个最小的类的定义,只需要一个简单 class关键加上一个标志符。类名的首字母应该要大写。

    class User
    
    val user1 = new User

    关键字 new 被用来创建一个类的实例。 User 类有一个默认的无参构造器,因为没有定义任何构造器。 但是,你会经常要用到一个构造器以及一个类的主体。下面的例子就是定义一个有参构造器的类:

    class Point(var x: Int, var y: Int) {
    
      def move(dx: Int, dy: Int): Unit = {
        x = x + dx
        y = y + dy
      }
    
      override def toString: String =
        s"($x, $y)"
    }
    
    val point1 = new Point(2, 3)
    println(point1.x)  // 2
    println(point1)  // prints (2, 3)

    这个 Point 类有四个成员: 变量x和y 以及方法 move和toString 。不同于其他很多语言,主构造器位于类标志上 (var x: Int, var y: Int) 。其中 move 方法接收两个整型参数并且返回 Unit值()。这个对应于类java语言中的void。 另一方面 toString 没有接收任何参数但是返回了一个 String值。由于toString重写了AnyReftoString,因此用关键字override将其标记为

    构造器

    构造器可以有可选参数来提供一个默认值,如下:

    class Point(var x: Int = 0, var y: Int = 0)
    
    val origin = new Point  // x and y are both set to 0
    val point1 = new Point(1)
    println(point1.x)  // prints 1

    这也是提高清晰度的一个很好的做法

    类的私有成员以及Getter/Setter语法

    类的成员默认是public。使用 private 可以隐藏外部类对其访问。

    class Point {
      private var _x = 0
      private var _y = 0
      private val bound = 100
    
      def x = _x
      def x_= (newValue: Int): Unit = {
        if (newValue < bound) _x = newValue else printWarning
      }
    
      def y = _y
      def y_= (newValue: Int): Unit = {
        if (newValue < bound) _y = newValue else printWarning
      }
    
      private def printWarning = println("WARNING: Out of bounds")
    }
    
    val point1 = new Point
    point1.x = 99
    point1.y = 101 // prints the warning

    在这里的Point类,_x 和 _y 变量都是以私有的方式进行存储的。使用 def x 和 def y 来获取私有类型的访问。def x_= 和 def y_= 是用来验证赋值_x和_y的合法性的。注意这里的setter的特殊语法: 在getter 方法标志符后面加上一个 _= ,并且参数紧随其后

    主构造器里面参数如果是public 可以用val和var修饰,但是因为val 是不可变的,所有你不能像如下这样写:

    class Point(val x: Int, val y: Int)
    val point = new Point(1, 2)
    point.x = 3  // <-- does not compile

    主构造器里面的参数如果没有用var或者val修饰,则是private,仅在类的内部可见

    class Point(x: Int, y: Int)
    val point = new Point(1, 2)
    point.x  // <-- does not compile
  • 相关阅读:
    Celery的使用
    python中使用redis
    Redis基础
    版本控制器git
    day 74作业
    Djangorestfromwork作业1
    Django rest-framework的jwt认证
    Django --form验证
    cx-oracle-------------------安装
    排序算法
  • 原文地址:https://www.cnblogs.com/zhouwenyang/p/13856936.html
Copyright © 2020-2023  润新知