前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Scala基础入门(十三 ) 类、函数参数形式、种类、使用方式总结

Scala基础入门(十三 ) 类、函数参数形式、种类、使用方式总结

作者头像
青山师
发布2023-05-04 21:33:41
2110
发布2023-05-04 21:33:41
举报

类参数

在创建类的对象时,有时候是需要通过传递某些信息进行初始化的,此时可以使用类参数。类参数看起来跟方法参数列表一样,但它是位于类名的后面,类似于其他高级语言的构造器(构造函数)。 我们定义了类ClassArg并制定了一个参数,使用new关键字创建对象时,需要指定参数a,我们还可以看到 val ca = new ClassArg(10); 会执行类体的打印语句,即使它在f()方法之前,这涉及到Scala 类的初始化过程:看似在f()之前执行;但其实类的所有的定义(值、方法)会在类体执行前初始化,也就是f()方法是先于打印语句初始化的。

如果使用 ca.a; 则会提示编译错误,因为a是在类ClassArg之外不可见的参数;如果要想类参数在类之外可见,可以使用 var、val修饰。 我们给处了示例类ClassArg2,通过ca2.a是可以获取参数a的值的。

在Scala常量、变量 一节中我们已经知道 val修饰的是不可变量,但是下面这段代码确实可运行的:

val ca2 = new ClassArg2(10) println(ca2.a) ca2.a = 17;

我们可以修改ca2的a值,这好比 ca2是我们的房子,a是里面的电视机(因为是var修饰的),我们虽然不可以变更房子,但是可以替换电视机。

可变类参数

有时候我们想使用更多的类参数来定义类,那么可以使用 可变元参数列表 来支持任意数量的参数,方法是在末尾加上一个 * 。

以下是关于Scala类参数的一个完整实例程序,

代码语言:javascript
复制
package com.byron4j.scala.basic


/**
 * 类参数
 */
object ClassArgDemo {

  def main(args: Array[String]): Unit = {
    val ca = new ClassArg(10);
    //提示a不是类ClassArg的成员变量
    //ca.a;

    val ca2 = new ClassArg2(10)
    println(ca2.a)
    ca2.a = 17;
    //ca2被定义成了val,但是可以更改其成员变量的值,只要不是直接修改ca2引用。
    println(ca2.a)
    //ca2 = new ClassArg2(10) //ERROR:重新赋值


    new ClassArg3(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

  }

}


//a 在类的外面是不可见的
class ClassArg(a: Int){
  //看似在f()之前执行;但其实类的所有的定义(值、方法)会在类体执行前初始化,也就是f()方法是先于打印语句初始化的
  println( f() )

  def f(): Int = { a * 10 }

}

//要想使a在类外面可见,可以使用var、val修饰
class ClassArg2(var a: Int){
  //看似在f()之前执行;但其实类的所有的定义(值、方法)会在类体执行前初始化,也就是f()方法是先于打印语句初始化的
  println( f() )

  def f(): Int = { a * 10 }

}



class ClassArg3(a: Int *){
  println("ClassArg3.result() = " + result())
  def result(): Int = {
    var sum = 0;
    for( ele <- a ){
      sum += ele
    }
    sum
  }

}

可以尝试运行输出结果:

100 100 10 17 ClassArg3.result() = 55

具名参数、可变参数

具名参数

具名参数 即在参数列表中指定名字的参数,创建具有参数列表的类的实例时,可以指定参数的名字;调用函数时同样可以指定参数名。

具名参数 对于提高代码的阅读性比较有用,尤其是长且复杂的参数列表。 具名参数显得很清楚的话,读者甚至无需再查阅文档。

代码语言:javascript
复制
package com.byron4j.scala.basic

object NamedArgDemo {
  def main(args: Array[String]): Unit = {

    // 具名参数实例 satrt...
    new Color(80, 9, 100);
      // 创建具有参数列表的类实例时,可以指定参数名字
    new Color(red = 80, blue = 9, green = 100);
    // 具名参数实例 end.


    render(red = 1, blue = 2, green = 3);



  }

  def  render(red: Int, blue: Int, green: Int): Unit= {
    println("red=" + red + ", blue=" + blue + ", green=" + green)
  }


}



class Color(red: Int, blue: Int, green: Int)

缺省参数

具名参数缺省参数 一块使用时,具名参数显得更有用。 这里的 缺省参数 指的是在类定义中给出其缺省值:

render4Default函数第二、三个参数有缺省值,所以在调用时可以通过以下方式使用:

//调用缺省值的函数时,缺省参数可以不指定 render4Default(red = 1);

示例代码如下:

代码语言:javascript
复制
package com.byron4j.scala.basic

object NamedArgDemo {
  def main(args: Array[String]): Unit = {

    // 具名参数实例 satrt...
    new Color(80, 9, 100);
      // 创建具有参数列表的类实例时,可以指定参数名字
    new Color(red = 80, blue = 9, green = 100);
    // 具名参数实例 end.


    render(red = 1, blue = 2, green = 3);

    //调用缺省值的函数时,缺省参数可以不指定
    render4Default(red = 1);

  }

  def  render(red: Int, blue: Int, green: Int): Unit= {
    println("red=" + red + ", blue=" + blue + ", green=" + green)
  }

  //缺省值
  def  render4Default(red: Int, blue: Int = 10, green: Int = 20): Unit= {
    println("red=" + red + ", blue=" + blue + ", green=" + green)
  }
}



class Color(red: Int, blue: Int, green: Int)

输出:

red=1, blue=2, green=3 red=1, blue=10, green=20

如果所有参数都是缺省的,则创建类实例、调用函数时可以省略参数列表

函数:

def render4AllDefault(red: Int = 5, blue: Int = 10, green: Int = 20): Unit= { println(“red=” + red + “, blue=” + blue + “, green=” + green) }

调用:

render4AllDefault()

类参数全部缺省:

class Color4AllDefault(red: Int = 4, blue: Int = 6, green: Int = 7){ println(“创建 Color4AllDefault 实例”) }

创建类实例:

var v = new Color4AllDefault

创建实例 v 的同时,我们看到执行了类体,在控制台输出了:创建 Color4AllDefault 实例

本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-08-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 类参数
  • 可变类参数
  • 具名参数、可变参数
    • 具名参数
      • 缺省参数
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
      http://www.vxiaotou.com