微前端架构如何改变企业的开发模式与效率提升
566
2022-11-15
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小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~