我的算法学习之路--02学习scala的第二天

一、类和对象

1.类的定义

就像

class Car{
    var color:String = _
}

创建类的对象和java一样是

new Car()

2.对象的定义

object Car{
    var color:String = "red"
}

和java不同,scala的对象是可以通过定义创建,这里创建的Car对象是Car类的伴生对象,而且方法和属性都是和Car不互通的,调用

Car.isInstanceOf[Car]

的返回值是false,也就意味着,通过定义创建的伴生对象,并不属于Car类

3.类的构造器

类的构造器分为主构造器和附属构造器,我们看看和java的写法有什么不同

//java

class Car{
    String color;
    String model;
    public Car(){

    }
    public Car(String color,String model){
    this.color = color;
    this.model = model;
    }
}

//scala
class Car(color1: String){//主构造器
  var color:String = color1
  var model:String = _
//附属构造器
  def this(color:String,model:String)={
    this(color)
    this.color = color
    this.model = model
  }
}

要注意的是,所有附属构造器第一行必须显式的调用其他构造器。由此可得,所有构造器都必须调用主构造器,以防止无限循环。

4.类的继承

这种东西,当然是和java对比着来看啦!直接上代码吧

//java
Class Person{
    String name;
    String id;
    public static void say(){
        System.out.print(name + " say hello ")
    }
    public void check(){
        System.out.print("my id is" + id)
    }
}
Class Student extends Person{


}
//scala
class Person{
    var name = ""
    var id:String = ""
    def say() = print("my name is " + name)
   
}
class Son{
    
}
class Student extends Person with Son{  
    
}

可见,scala是支持多继承的,而且scala的继承是可以继承属性和可以被访问的方法,注意java是不可以继承属性的。

5.方法重写

scala的方法重写是加上一个override关键字

class Person{
    var name = ""
    var id:String = ""
    def say() = print("my name is " + name)
   
}

class Student extends Person{  
    override def say() = print("I am a student")
}

也可以通过super.方法名调用父类方法 

6.伴生类和伴生对象

伴生类和伴生对象就是同名的class和object

伴生类和伴生对象可以调用对方的private属性

class Cat{
  private [Cat]var clacat = 222;
  Cat.objcat
}
object Cat{
  private var objcat = 222
  new Cat().clacat
}

7 .apply方法

方法名为apply的方法,可以直接通过对象()调用

class Cat{
    def apply() = {
        
    }
}

var cat:Cat = new Cat()
cat()//调用Cat类的apply

object Cat{
    def apply() = {
        
    }
}

Cat()//调用Cat对象的apply

8.case calss

就是在创建类时前面多个case,就可以让类具有以下功能

1、初始化不需要new,改成类名()

2.对象的toString,equel,以及hashCode方法都被重写

3.可以序列化

4.支持模式匹配(我后面会去了解模式匹配)

5.继承Serializable

9.Trait 

可以新建一个trait,里面可以有一个或者多个抽象方法(没有方法体),这样的类只能拥有实现类的对象

trait Car{
    def run(name:String)

}

二、数组和集合

 定长数组

var arr = Array[Int](23,3234,3,3)
//scala里的数组都是通过小括号来取值的
for(i  <- 0 to arr.length-1) {
    arr(i)
}

数组是()取,我学Java 学疯了,回来提醒你们

不定长数组

var arr1 = ArrayBuffer[Int](3,23,413,23,423)

arr1.addOne(22)
arr1.addAll(arr1)

list

var list = List[Int](2,4,23,3,32,3)
list.::(213)//::的意思是合并两个集合,.::就是合并到自身

set

var newset = Set[Int](22,212,2,22,2)
var newset = Set[Int](34,2,34,34,3)

newset.++newset1//两集合相加
newset.&newset1//两集合取交
newset.min //最小值
newset.sum //所有值之和

queue

var queue = Queue[Int](2,21,3,2,2,2)
queue.enqueue(2314,43)//加在队列末
queue.dequeue()//从队列头取出并返回

 stack

var stack = Stack(23,23,2,32)
stack.pull(22)//压栈顶
stack.pop()//取出栈顶元素

map

//两种创建方式
var map = Map("key1" -> "value1","key2" -> "value2")
var map2 = Map(("key1","value1"),("key2","value2"))

//取值
var value1 = map("key1")

//遍历
for((k,v) <- map){
    
}

//for循环让map k-v倒置
var map1 = for((k,v) <- map) 
      yield (v,k)

//yield我的理解呢就是配合for循环使用,可以用于修改遍历集合的值

元组

 var tuple = ("a","b")

//元组的调用
tuple._1 //a
tuple._2//b

//元组的遍历
tuple.productIterator.foreach(a =>{print(a)})


//交换元组
tuple.swap
//("a","b") --> ("b","a")

//模式匹配获取元组
var (a,b) = tuple
//a = "a" ,b ="b"

好了,今天就暂时记录这么多!!!如果喜欢我的文章欢迎关注,我会继续更新我学算法的遇到的技术点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

没有名字。。。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值