输出,变量

一.输出的三种方式

val name = "ApacheCN"
val height = 180.001
val weight = 118.18
println("name=" + name + " height=" + height + " weight=" + weight)
printf("name=%s, height=%.3f, weight=%.1f \n", name, height, weight) //默认小数点6位
println(s"name=$name, height=${height-5}, weight=$weight-3")//注意有无大括号的区别

 二.变量

var/val VariableName : DataType [= Initial Value]

数据类型

类型可以自动推导,但是不同于动态类型语言,类型确定后就不能更改,强数据类型语言

 val name = "ApacheCN";name = 10 报错

类型的种类

(1) Scala数据类型分为两大类 AnyVal(值类型) 和 AnyRef(引用类型)
(2) 在scala中数据类型都是对象(其实scala中一切对象皆是对象,例:10.toString),也就是说scala中没有java中的原生类型(即8中基本类型).例如:java中: int i = 10; i.toString();报错,因为i是基本数据类型,没有方法
(3)三句话:整型默认为Int,小数默认为Double,右侧是计算式子时考虑int类型

val b:Byte = 10 (不报错,因为右侧为单个值,只考虑越界,不考虑整型默认为Int)
val s:Short = 20 
val s1:Short = b + s (报错,可能我们会想,byte + short取最大类型short,但是右侧是式子,考虑数值的默认类型为Int,取最大类型是有前提的)
val c:Char = b;/val c1:Char = s; (报错,看图)

注:和java的是有一点区别的:'右侧是计算式子时考虑int类型'在java中不是那么绝对

byte b = 10 +20; 正确的
byte b1 = b + b; 错误的

var与val

var变量,变量值可变,val常量,变量值不可变,这里的val不像python中的那样,即使是常量值也可以发生改变

val dog = new Dog;dog = new Dog;报错
val age = 10
var name = "hello"
反编译查看
private final int age;
private String name;

初始值

两者都必须要有初始值,不像java声明时不赋值,会在初始化时赋初始值(有点不理解菜鸟教程上为啥[= Initial Value]要写中括号)

val name;报错

如果使用占位符,必须指定数据类型

var name = _;报错
var name:String = _;此时name的值为null

①scala设计者推荐我们使用val,因为val没有线程安全问题,效率高

②Unit类型、Null类型和Nothing类型

Unit 表示无值,和其他语言中void等同。用作不返回任何结果的方法的结果类型。Unit只有一个实例值,写成()。
NULL       null , Null 类型只有一个实例值 null
Nothing   

Nothing类型在Scala的类层级的最低端;它是任何其他类型的子类型。
当一个函数,我们确定没有正常的返回值,可以用Nothing 来指定返回类型,这样有一个好处,就是我们可以把返回的值(异常)赋给其它的函数或者变量(兼容性)

Null类只有一个实例对象,null,类似于Java中的null引用。null可以赋值给任意引用类型(AnyRef),但是不能赋值给值类型(AnyVal: 比如 Int, Float, Char, Boolean, Long, Double, Byte, Short)
Unit类型用来标识过程,也就是没有明确返回值的函数。由此可见,Unit类似于Java里的void。Unit只有一个实例,(),这个实例也没有实质的意义
Nothing,可以作为没有正常返回值的方法的返回类型,非常直观的告诉你这个方法不会正常返回,而且由于Nothing是其他任意类型的子类,他还能跟要求返回值的方法兼容。

类型转换

在scala中,无论是强制类型转换还是String与数值类型之间的转换都是toxxx
在java中,强制类型转换使用(),String与数值类型之间的转换,转换成何种类型就找这个类型对象的valueOf或者parsexxx方法

"12.5".toInt  这个是错误的 

 标识符

首字符为操作符(比如+ - * / ),后续字符也需跟操作符 ,至少一个(反编译)。操作符(比如+-*/)不能在标识符中间和最后,以其他非操作字符作参考。

var ++ = 12 //反编译$plus$plus

Byte,Char,Short,Int,Double等在scala中,不是关键字,而是预定义标识符,可以用,但是不推荐

var Float = 12.5
print(Float)

_不可以用作标识符,因为在scala中,_ 有很多其他的作用,因此不能使用

var _ =12.5 //不会直接报错,但是无法输出啊

运算符

算术运算符 

①/ -> 10/3与10.0/3
②% -> a%b= a-a/b*b
③++ --在scala中不存在 

println(10/3)      //3
println(10/3.0)    //3.3333333333333335
println(10 % 3)    //1
println(-10 % -3)  //-1

 位运算符

使用异或运算符来交换两个变量的值

var a = 3;var b = 5
a = a ^ b
b = a ^ b
a = a ^ b
print(a,b)

 

posted @ 2018-12-31 23:45  Hypergroup  阅读(176)  评论(0)    收藏  举报