scala语法 基础3

来源:互联网 发布:淘宝店铺花钱解冻 编辑:程序博客网 时间:2024/05/18 17:43
/** * 高阶函数 */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