scala数据类型

网友投稿 540 2022-11-15

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

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中常见的赋值运算符,还有一些不常见的:

<<=左移赋值(按位)>>=右移赋值(按位)

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中,可以通过自定义实现两个对象 +

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 3false21024

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:MyBatis反向生成Example类的使用方式
下一篇:Redis--入门
相关文章

 发表评论

暂时没有评论,来抢沙发吧~