scala动态绑定 接口 集合 0901

动态绑定 & 属性 、方法重写

动态绑定机制 (多态)
成员方法在执行的时候,JVM将方法和当前调用方法的对象的实际内存进行绑定
方法具有动态绑定机制、而属性没有 在哪里声明就用那个属性

抽象方法重写的时候,override可选的
抽象类中有方法的具体实现的话,那么重写方法需要显示添加override

var声明的属性被重写后 可以使用 _ 做属性值的自动推断
val声明的属性被重写后,不能使用 _ 做属性值的自动推断 ,需要显示的初始化

构造方法(父类构造方法 & 构造方法的参数使用)
父类主构造方法 (1)
子类 主构造方法 (2)
子类 辅助构造方法(3)

接口(特质)

scala中没有接口(interface)的概念、而有特质(trait)的概念
特质可以多混入?? 可以 而且类想混入多个特质 采用with进行连接
类的继承体系中存在类和特质的话???
类要写在前 , 所有的接口都写在后

object Test {
  def main(args: Array[String]): Unit = {
    new User();
  }
}
trait  T1{
  println("T1 code ......")
}
trait T2{
  println("T2 code ......")
}
class Person{
  println("Person code .....")
}
class User extends Person with T2 with T1{
  println("child code ......")
}
结果:
Person code .....
T2 code ......
T1 code ......
child code ......

scala的特质中可以存在直接可执行的代码吗??? 可以
scala中可以声明属性和方法吗(抽象、具体) 都可以 ,并且属性的话 var 和 val都可以
特质如果被多次混入的话,那么只会被执行一次
可执行代码的执行顺序是从左向右、方法调用从右向左
super指向的是上一级、但是如果想中途改变顺序super[Operate]
动态混入 :符合OCP设计原则 ,对功能开放,对修改关闭

 def main(args: Array[String]): Unit = {
    var mysql = new MySql() with Operate
    mysql.insert()
    mysql.delete()
  }
  trait Operate{
    def delete(): Unit ={
      println("删除数据")
    }
  }
  class MySql{
    def insert(): Unit ={
      println("插入数据")
    }
  }

集合

一、scala集合基本介绍
1)集合分类 : 不可变集合 和 可变的集合
2)Scala默认的话都是不可变集合
3)scala集合的类型:序列(Seq)、Set、映射(Map)
【可变的–mutable 不可变的–immutable】
二、集合初识
集合之所有存在 是因为不同的需求,数据样式不一样(存储)
简单解释:
查询很频繁(数组)–ArrayList
删除和插入数据(链表)–LinkList
序列,指的是一类具有一定长度的可迭代访问的对象,其中每个元素均带有一个从0开始计数的固定索引位置。

案例一:不可变数组
不可变数组 : 增加、删除、修改、查询、特殊方法
//取值 求长度 遍历
	var arr:Array[Int]=Array(1,2,3)
    println(arr(0))
    println(arr.length)//数组的长度
    println(arr.size)
    println(arr.mkString(","))
    for(i <- arr){   //遍历
      print(s"${i}  ")
    }
    arr.foreach(i=>print(s"${i} ")) //遍历
    arr.foreach(print(_)) //遍历 自动类型推断
//修改 |  不可变引用|内存数据可变的
	var arr:Array[Int]=Array(1,2,3)
    arr(0)=2
    println(arr.mkString(","))
    arr.update(0,2)
    println(arr.mkString(","))
//添加数据方式一
    var arr:Array[Int]=Array(1,2,3)
    println(arr.mkString(","))
    var arr1:Array[Int]=arr:+4
    println(arr1.mkString(","))
    var arr2:Array[Int]=0+:arr
    println(arr2.mkString(","))
案例二: 可变数组 
    var arr :ArrayBuffer[Int]  = ArrayBuffer(1,2,3,4)//.创建可变数组
    println(arr(0))//访问元素
    arr(0)=5//修改元素
    arr=arr+=5
    arr.insert(2,5)//插入数据
    arr.remove(0)//删除元素  从索引为0的位置 进行删除
    var arr1:Array[Int]=arr.toArray //可变数据和不可变数组的转换[了解]

seq相关的集合

案例一:ListBuffer 
    var  list: ListBuffer[Int] = ListBuffer(1,2,3,4)
  // 增删改查  insert update remove drop
    println(list.head) //头元素
    println(list.last) //尾元素
    println(list.tail) //除了头之外的元素
    println(list.init) // 除了尾之外的元素
    println(list(1))//查看
    for(i<- list){
       println(i)
    }
    list.foreach(print)//访问元素
    list += 5//添加元素(尾部)
    var list1: ListBuffer[Int] = ListBuffer(5,6,7,8)
    var nList  = list ++ list1//list(拼接)
    var temp1 =  list :+ 9  // ->
    var temp2 = 9 +: list  // <-
    var temp3 = list.remove(1)  //返回值,是删除的数据
    list.-=(2) //按照值进行删除

案例二 : Queue  先入先出 【可变集合:Seq】
  var que:mutable.Queue[Int]=new mutable.Queue[Int]()
    que+=0//追加数据
    que.++=(List(1,2,3))
    que.dequeue()//出队列
    que.enqueue(4,5)//追加数据
    println(que.head)//查看头元素
    println(que.last)//查看尾元素
    println(que.tail)//查看除头之外的所有元素
案例三 : 栈 
    var stack:mutable.Stack[Int]=mutable.Stack(1,2,3)
    println(stack.push(1))//压栈
    println(stack.pop())//出栈
    println(stack.head)//栈的头
    println(stack.tail)//栈除头外的数据

List (常用)[不可变体系]

   var list=List(1,2,3)
    var list1=Nil//空列表
    println(list)
    var list2=4::(5::list)::Nil
// :: 拼接
// ::: 是把一个列表里面的没有元素追加到后面的列表 (从右向左)
//多个List合并用++,也可以用:::(不如++)
    println(list2)
    var temp1 = list :+ 4
    println(temp1)
    var temp2 = 4 +: list
    println(temp2)
    var listA=List(1,2,3)
    var listB=List(4,5,6)
    println(listA++listB)//拼接

二叉树的广度搜索

   def levelOrder(root: TreeNode): List[List[Int]] = {
        if (root == null) return Nil
        var res=new ArrayBuffer[List[Int]]()
        var que=new mutable.Queue[TreeNode]()
        var level=new ArrayBuffer[Int]()
        if (root != null )
        {
        que.enqueue(root)
        }
        while (!que.isEmpty){
        var i:Int=que.size
        level.clear() 
        for (i<-1 to i)
        {
            var node:TreeNode=que.dequeue()
            level.append(node.value)
            if (node.left!=null) que.enqueue(node.left)
            if (node.right!=null) que.enqueue(node.right)
        }
        res.append(level.toList)
        }
        res.toList
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值