scala语法 基础3


/**
 * 高阶函数
 */

object Study7  extends App{

//函数定义
    def add(a:Int ,b:Int) = {
      a + b
    }
//  var c = add(1,2)
//  println(c)

    //var func1 = add _     //把一个函数的实现传递给另外一个函数 
    //println(func1(1,2))

    //var func2 = (x :Int) =>  x + 3 //传递一个匿名函数给给一个变量
    //var func3 = (x :Int) =>  {x + 3} //传递一个匿名函数给给一个变量
    //var func4 = (x :Int) =>  (x + 3) //传递一个匿名函数给给一个变量

//  for(i <- arr)  
//  Map[String,Int]("zhangsan" -> 12)
    //println(func3(3))

//  def func5(a:Int ,f:(Int)=>(Int)) = {
//    f(a) + 1
//  }
//  println(func5(4,(x:Int) => {x + 2}))   //传递一个匿名函数给该函数

    //调用函数封装举例
//  def CPU(a:Int) = {
//    a * 8
//  }
//  def GPU(a:Int) = {
//    a + 9
//  }
//  def compute(men:Int,CPU:(Int)=>(Int),GPU:(Int)=>(Int)) = {
//    men + CPU(2) + GPU(2) 
//  }
//  println(compute(4,CPU,GPU))

//  def func6(f:(Int)=>(Int)) = {
//    f(1)
//  }
//  println(func6(_ + 2))  //简写条件:1.只有一行代码   2.只有一个形参  3.把匿名函数作为形参
//  println(func6(_ + _))  

    //总结“_”  :
//  1.代表数组每一个元素
//  2.指的是传递是确切的一个函数 而不是忘记给该函数传递参数
//  3.元组的元素取值   

    //思考题
//  def func7 (x :Int ,y:Int) = {
//    (y : Int) => {
//        x + y
//      } + 2
//  }
//  println(func7(3,4)(2))

    //一些有用的函数 map foreach reduceLeft 
//  (1 to 9).map("*" * _).foreach(println _)

//  var c = (1 to 3).reduceLeft(_ + _)   //1 + 2 + 3
//  println(c) 


}


/**
 * 构造顺序
 */
class Person1 {
  val age:Int = 10
  var arr:Array[Int] = new Array[Int](age)  //调age字段的getter方法
}

//class student1 extends Person1{
//  override lazy val age:Int = 18   //如果覆盖的父类不是抽象类  必须要写override
//}

class student1 extends { //解决办法③
  override val age:Int = 18   //如果覆盖的父类不是抽象类  必须要写override
} with Person1

//特质
/*trait student2 {
  var a:Int = 10
  var b:Int
}
trait student3{
  def show = "123"
}
class student4 extends student2 with student3{
  var b:Int = 1
}*/

object Test72 extends App{
    var c = new student1
    println(c.age)
    println(c.arr.length)  
    //输出18 0   解决办法:1.字段前面添加final  2.字段前面添加lazy  3.解决办法③
    //原因:
//      a.主构造器和class类交织在一起
//      b.子类中使用了override覆盖超类中的字段,构造子类时超类的字段值会被覆盖
//      c.student1类作为student1的主构造器,调用了超类的Person1的主构造器
//      d.首先,构造器将age值设置为10
//      e.接着代码往下走,为了初始化arr数组,调用了age的getter方法
//      f.而age字段被重写了,也就是说getter方法被重写了
//      g.被重写的getter方法还没有被初始化,确切说就是字段age还是对象在被分配空间时所有整型字段的初始值
//      h.arr数组长度被设置为0
//      i.子类Student1类构造器执行,age被赋值为18

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值