scala数据类型
scala数据类型1.数据类型2.scala转义1.数据类型scala没有基本类型,在scala中,所有类型都是对象。以java为类比对象。scala有java所有的包装类。同时还有一些scala特有的类:Unit:等同java中的void,Unit有且只有一个实例(),用作方法的返回类型,等同java的voidNull:空引用Nothing:是scala的类层级的最低端;它是任..._scala中没有基本类型的概念,scala中没有原生的数据类型,所有的数据类型都是
文章信息
- 原文链接:https://jiayq.blog.csdn.net/article/details/103127691
- 发布时间:2019-11-23 18:13:52
- 阅读量:686
- 分类:scala专栏收录该内容, 订阅专栏
- 标签:#scala基础, #scala与java的不同点, #快速入门scala, #使用类比法学习scala, #scala的优点
摘要
文章浏览阅读686次。scala数据类型1.数据类型2.scala转义1.数据类型scala没有基本类型,在scala中,所有类型都是对象。以java为类比对象。scala有java所有的包装类。同时还有一些scala特有的类:Unit:等同java中的void,Unit有且只有一个实例(),用作方法的返回类型,等同java的voidNull:空引用Nothing:是scala的类层级的最低端;它是任…_scala中没有基本类型的概念,scala中没有原生的数据类型,所有的数据类型都是
scala数据类型
- 1.数据类型
- 2.scala字面量
- 3.变量
- 4.访问控制
- 5.操作符
git地址
https://github.com/a18792721831/studyScala.git
1.数据类型
scala没有基本类型,在scala中,所有类型都是对象。
以java为类比对象。
scala有java所有的包装类。
同时还有一些scala特有的类:
Unit:等同java中的void,Unit有且只有一个实例(),用作方法的返回类型,等同java的void Null:空引用 Nothing:是scala的类层级的最低端;它是任何其他类型的子类型。(下转型?) Any:是所有其他类的超类(上转型?) AnyRef:scala里所有类的基类(Object?)
2.scala字面量
什么是字面量?
其实我开始也是比较疑惑的,字面量是什么玩意?
类比java,字面量其实就是java语言支持的数据类型。
举个例子:
整型字面量:
整型数字:各种进制
浮点型字面量:
单精度、双精度浮点数
布尔型字面量:
true、false
符号字面量: 在scala中,符号字面量就是以 '开头的标识符 在java中,是指 intern()方法的对象。
其实就是简单的一句话:用’修饰的对象同名同对象。
也就是只要名字相同,那么对象一定相同
字符字面量:
目标对象前后都用'修饰
同java一样,scala也是用\转义
字符串字面量:
在scala和java中,字符串都是用"包起来。
但是在scala中,字符串也可以用"""修饰,用"""包起来的字符串会完整的保留所有的可见与不可见字符。
当然,还有一个Null值
与java中null是关键词一样的理解就行。
3.变量
变量就是程序中的占位符,用于引用计算机内存地址。
在scala中变量申明有两种类型:
可变 var
不可变 val
声明可以给多个变量赋值同一个值:
举例:
1
2
3
4
var x,y,z=100
//print(x) 100
//print(y) 100
//print(z) 100
4.访问控制
在jdk9之前,java访问控制类的结构是包,java9之后加入module这个概念。
在访问控制上有模块这个概念。
java是通过module-info.java去控制的。
在scala中可以使用private[x]或者protected[x]控制类的访问。
如何理解?
private[x] class A
表示class A对于x包的类可见(对于其余的类都是不可见的private)
protected[x] class A
就是class A 对于x包的类及其子包中的类和伴生类可见
可以从源头上控制类的访问,防止类被滥用。
5.操作符
scala支持java所有的操作符,使用也与java操作符相同。
注意:scala中大于等于必须是>=小于等于必须是<=
scala除了java中常见的赋值运算符,还有一些不常见的:
1
2
<<=左移赋值(按位)
>>=右移赋值(按位)
Scala 的==和 Java 不同 ==只用于比较两个对象的值是否相同。而对于引用类型的比较使用另外的操作符 eq 和 ne。
操作符的优先级和左右结合性
Scala 的操作符的优先级和 Java 基本相同,如果有困惑时,可以使用()改变操作符的优先级。 操作符一般为左结合,Scala 规定了操作符的结合性由操作符的最后一个字符定义。对于以“:”结尾的操作符都是右结合,其它的操作符多是左结合。例如:
ab 为 a.(b) 而 a:::b 为 b.:::(a),而 a::: b :::c = a::: (b ::: c) , abc= (ab)c
:::是集合中用来连接的操作符。
在scala中说操作符实际上是不准确的,因为在scala中实际上没有操作符这个概念的。
原因:
1.scala中所有的数据都是对象,没有基础数据类型。即整型、浮点型等都是包装类型。包装类型就是包装类的一个实例,所以scala不存在基础数据类型。
2.对于一个对象进行操作符运算?对面的变量名都是对象的引用,是一个地址,对地址进行运算,没有任何意义。在java中,因为有自动拆箱和自动装箱,所以使得包装类可以进行运算符进行运算。
3.在scala中没有自动拆箱和自动装箱的概念。
4.在scala中,所有的运算都是方法的调用,包括基础运算(因为不存在基础数据类型)
综上,在scala中,所有的操作都是方法的调用。
既然是方法的调用,那么我们可以自定义操作。
还有一个问题,方法的调用是 对象.方法进行调用(普通方法)
但是在scala中,却是和操作符一样。
因为scala对方法的调用有一个美化的过程。
在scala中, a + b 等价于 a.+(b)
即方法可以中缀调用。。。。。。。。。
感觉越说越糊涂。
总结就是一句话:
在scala中,所有的操作都是方法的调用。
举个例子:
在c/c++中,可以通过运算符重载,实现自定义的操作符。
比如自定义类的对象的加法。
在java中,对两个类实例进行 + 运算,会报错的。
但是在scala中,可以通过自定义实现两个对象 +
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
object TestClass {
case class numberSum(sum: Int){
def add(m: Int): Int = sum + m
def +(n: numberSum) = numberSum(sum + n.sum)
def ==(n: numberSum)= sum == n.sum
def ->(n: numberSum) = sum*n.sum
def ^(n: numberSum) = {
var result = sum
(1 to n.sum - 1 ).foreach(x => result *= sum)
result
}
override def toString: String = super.toString + "sum is " + sum
}
def main(args: Array[String]): Unit = {
val num1 = new numberSum(1)
val num2 = new numberSum(2)
println(num1 + num2)
println(num1 == num2)
println(num1 -> num2)
println(num2 ^ numberSum(10))
}
}
com.study.hello.TestClass$numberSum@e26131cdsum is 3
false
2
1024