变量
1.声明变量
package com.mc
object Variable {
def main(args: Array[String]): Unit = {
//使用val定义的变量值是不变的,相当于java中用final修饰的变量
val i= 1
//使用var定义的变量是可变的,scala建议用val
var s="hello"
//scala编译器会自动推断变量的类型,也可以自行指定
//变量名在前,类型在后
var str:String = "you are my sunshine!"
println(i)
println(s)
println(str)
}
}
常用类型
VarAndVal常量和变量演示01
package com.mc.sample02_varval
/**
* Description:VarAndValDemo<br/>
* Copyright(c):Minchen<br/>
* This program is protected by copyright laws.<br/>
* Date: 2019/8/17 星期六 09:28
*
* @author:Minchen
* @Email:751914788 @qq.com
* @version 1.0
*/
object VarAndValDemo {
def main(args: Array[String]):Unit={
//①变量
//变量age的类型由值来决定,内部编译时,会进行类型的自动推断。一旦确定后,其类型不能变化了
var age=12
age +=1
//scala中没有i++,i--等,只有+=1等
//scala一行表示一条语句,可以不用分号隔开,更简洁
var height:Double = 111.11
println(s"年龄是:$age,身高是:${height}")
//要在打印前加s,这个是语法要求,打印的值变量前要加$符号,$符后面可以加{},针对于特殊的变量或者是表达式,需要使用${表达式}
println("**********************")
//②常量
var PI=3.14
//PI=Math.PI
//lazy修饰的常量,只有当我们用到这个变量的时候,才会给它分配内存空间
lazy val PI2=Math.PI
println(s"PI=$PI\tPI2=$PI2")
//lazy不能修饰变量,否则会报错
}
}
常量和变量演示VarAndValDemo2
package com.mc.sample02_varval
/**
* Description:变量和常量演示2<br/>
* Copyright(c):Minchen<br/>
* This program is protected by copyright laws.<br/>
* Date: 2019/8/17 星期六 09:31
*
* @author:Minchen
* @Email:751914788 @qq.com
* @version 1.0
*/
object VarAndValDemo2 {
def main(args: Array[String]): Unit = {
//
var bInstance = new B(3)
//下述代码:编译报错:提示:给常量重新分配了值
// var bInstance=new B(4)
//报错,类型B中的类型是常量,不能重复定义,
// bInstance.num=new A(8)
//给变量再赋值
bInstance.num.num = 5
//打印的是变量的位置,hash值
println(bInstance.num)
//打印的是变量的值
println(bInstance.num.num)
}
}
class A(n: Int) {
//类A的的主构造器,直接在声明类的时候定义的构造器
//构造器最大的用处就是在创建对象时执行初始化
//类A的主构造器,Scala中的构造器相较于Java比较特殊,分为两种:主构造器,从构造器。主构造器是和类中字段和方法的定义混合在一起的
//在Scala中,不需要像Java一样需要在类中定义一个与类名相同的方法来当作构造器
//除了主构造器外,Scala中还有从构造器,用于使用和主构造器不同的参数来初始化对象。
var num = n
}
class B(n: Int) {
//类B的的主构造器
//val常量
val num = new A(n)
}
运行效果
scala中特殊的方法名(就是java操作符)演示
package com.mc.sample03_SpecialOperateCharDemo
/**
* Description:VarAndValDemo<br/>
* Copyright(c):Minchen<br/>
* This program is protected by copyright laws.<br/>
* Date: 2019/8/17 星期六 09:28
*
* @author:Minchen
* @Email:751914788 @qq.com
* @version 1.0
*/
object SpecialOperateCharDemo {
def main(args: Array[String]):Unit={
val x=3
val y =4
val result1=x+y
println(s"result1=$result1")
//scala中,实例.方法名(实参)可以舒血薇 实例 方法名 实参
// → 语法现象称之为:语法糖,grammar sugar
//+是一个方法,调用它能实现相加
val result2=x.+(y)
println(s"result2=$result2")
var m=3
m-=1
println(m)
m.-(1)
println(m)
}
}
运行效果
块表达式演示
package com.mc.sample04_BlockClauseDemo
/**
* Description:块表达式演示<br/>
* Copyright(c):Minchen<br/>
* This program is protected by copyright laws.<br/>
* Date: 2019/8/17 星期六 09:28
*
* @author:Minchen
* @Email:751914788 @qq.com
* @version 1.0
*/
object BlockClauseDemo {
def main(args: Array[String]): Unit={
// pointA
val x1=3
val y1=4
//pointB
val x2=5
val y2=6
//使用块表达式求平面上任意两点之间的距离
//最后一个是快表达式的返回值,必要指定是哪个值,否则返回的是()
//运用到数学运算,首先就是要想到数学工具类Math
var distance={
val x=x1-x2
val y=y1-y2
val tmp=Math.sqrt(Math.pow(x,2)+Math.pow(y,2))
tmp
}
println(s"平面上任意两点($x1,$y1),($x2,$y2)之间的举例是:$distance")
}
}
运行效果
Scala条件表达式演示
package com.mc.sample04_BlockClauseDemo
/**
* Description:条件表达式演示<br/>
* Copyright(c):Minchen<br/>
* This program is protected by copyright laws.<br/>
* Date: 2019/8/17 星期六 09:28
*
* @author:Minchen
* @Email:751914788 @qq.com
* @version 1.0
*/
object ConditionClauseDemo {
def main(args:Array[String]): Unit={
//Any表示包括所有的类型,相当于java的Obeject,(下面例子不满足if条件会返回boolean类型的false),加了else,后面会返回else内的值
val num=4
val result:Any=if(num>4) "是的!大于4" else false
println(s"result=$result")
println("\n____________________________________\n")
//Any表示包括所有的类型,没有加else,后面会返回()
val result2 = if (num > 4) "是的!大于4"
println(result2)
println("\n____________________________________\n")
var result3:Any=if(num>4) "是的!大于4" else{
println("else中可是语句块")
val n=4
//语句最后一行表示的是返回值
false
}
println(s"result3=$result3")
}
}
运行效果
scala中的循环语句演示
package com.mc.sample05_CircleDemo
/**
* Description:循环表达式演示<br/>
* Copyright(c):Minchen<br/>
* This program is protected by copyright laws.<br/>
* Date: 2019/8/17 星期六 09:28
*
* @author:Minchen
* @Email:751914788 @qq.com
* @version 1.0
*/
object CircleDemo {
def main(args: Array[String]): Unit = {
//需求:计算1+..+10的和
var sum = 0
for (i <- 1 to 10) {
sum += i
//+=不能用空格隔开,因为它看做是一个运算符
}
println(s"1+..+10的和是:$sum")
println("\n______________________________________________\n")
//while循环
sum = 0
var i = 1
while (i <= 10) {
sum += i
i += 1
}
println(s"while循环,实现1+..+10的和是:$sum")
println("\n______________________________________________\n")
//do while
var sum1 = 0
var x = 1
do {
sum1 += x
x += 1
} while (x <= 10);
println(s"do...while...循环,实现1+..+10的和是:$sum1")
}
}
运行效果
方法演示MethodDemo01
package com.mc.sample06_MethodDemo
/**
* Description:方法演示<br/>
* Copyright(c):Minchen<br/>
* This program is protected by copyright laws.<br/>
* Date: 2019/8/17 星期六 10:17
*
* @author:Minchen
* @Email:751914788 @qq.com
* @version 1.0
*/
object MethodDemo01 {
def main(args: Array[String]): Unit = {
/**
定义方法
def 方法名(参数1:类型.参数2:类型):返回值={
方法体}
* 方式1:明示方法的返回值类型
* 定义方法之求两个数的和
*/
def add(x: Int, y: Int): Int = x + y
/**
* 方式2:方法的返回值类型自动推断
* 定义方法之求两个数的和
*/
def add2(x: Int, y: Int) = x + y
/**
* 方式3:方法没有返回值
*
* 定义方法之求两个数的和
*/
def add3(x: Int, y: Int) {
x + y
}
println( add(2,3))
println( add2(2,3))
println( add3(2,3))
}
}
运行效果
方法演示MethodDemo02
package com.mc.sample06_MethodDemo
/**
* Description:方法演示2<br/>
* Copyright(c):Minchen<br/>
* This program is protected by copyright laws.<br/>
* Date: 2019/8/17 星期六 10:20
*
* @author:Minchen
* @Email:751914788 @qq.com
* @version 1.0
*/
object MethodDemo02 extends App {
/**
* 多参数列表的方法 def 方法名(参数列表1)(参数列表2)(参数列表...):返回类型={方法体}
*
* @param x
* @param y
* @param z
* @return
*/
def multiParam(x: Int, y: Int)(z: Long)(m: Float) = (x + y) * z + m
println(multiParam(1, 2)(3)(4))
/**
* 获得环境变量的值 调用方法,不需要传参数时候,可以省略((
* 这个用来测试不加()
*
* @return
*/
def getUserName = System.getenv("JAVA_HOME")
println(getUserName)
/**
* 获得环境变量的值
* 这个用来测试架()
*
* @return
*/
def getUserName2() = System.getenv("JAVA_HOME")
println(getUserName2())
}
运行效果
方法演示MethodDemo03
package com.mc.sample06_MethodDemo
/**
* Description:方法演示3<br/>
* Copyright(c):Minchen<br/>
* This program is protected by copyright laws.<br/>
* Date: 2019/8/17 星期六 10:30
*
* @author:Minchen
* @Email:751914788 @qq.com
* @version 1.0
*/
object MethodDemo03 extends App {
/**
* 带有默认值的方法
*
* @param greeting
*/
def withDefaultValue(greeting: String = "吃了吗?") = println(greeting)
//如果未传入参数,使用默认,有参数则使用传入的参数
withDefaultValue()
withDefaultValue("我是一头猪")
/**
* 带多个默认值的方法
*
* @param a
* @param b
* @param c
*/
def withDefaultValue2(a: Int = 1, b: Int, c: Int = 4) = println(s"a=$a,b=$b,c=$c")
//_表示通配符,任意个
withDefaultValue2(1,2,3)
//传入两个的时候按照顺序填
withDefaultValue2(2,3)
/**
* 可变长参数 * ,java用...
*
* @param num
*/
def varLenParam(num: Int*) = {
for (perEle <- num)
println(perEle)
}
varLenParam(1,2,3,4,5,6,7)
}
运行效果
函数演示
package com.mc.simple07_FunctionDemo
/**
* Description:函数的演示<br/>
* Copyright(c):Minchen<br/>
* This program is protected by copyright laws.<br/>
* Date: 2019/8/17 星期六 10:30
*
* @author:Minchen
* @Email:751914788 @qq.com
* @version 1.0
*/
object FunctionDemo extends App {
/**
* scala中函数演示(函数是头等公民)
*/
//函数和方法的区别:函数是val定义,而方法def定义
//1,有名函数
//1)赋值式的有名函数,就是给函数的参数取个名字,表明类型
val f1 = ((a: Int, b: Int) => a + b)
val f2 = (a: Int, b: Int) => a + b
val f3 = (_: Int) + (_: Int)
println(s"调用有名函数f1后的结果是:${f1(1, 2)}")
println(s"调用有名函数f2后的结果是:${f2(2, 2)}")
println(s"调用有名函数f3后的结果是:${f2(3, 3)}")
println("\n______________________________________________\n")
//2)声明式的有名函数
val ff1: ((Int, Int) => Int) = { (x, y) => x + y }
val ff2: (Int, Int) => Int = (x, y) => x + y
val ff3: (Int, Int) => Int = (_ + _)
println(s"调用声明式的有名函数ff1后的结果是:${ff1(1, 2)}")
println(s"调用声明式的有名函数ff2后的结果是:${ff2(2, 2)}")
println(s"调用声明式的有名函数ff3后的结果是:${ff2(3, 3)}")
println("\n______________________________________________\n")
//3)函数底层的原理
val myFun = new Function2[Int, Int, Int]() {
/**
* 重写特质中的apply方法
*
* @param v1
* @param v2
* @return
*/
override def apply(v1: Int, v2: Int): Int = v1 + v2
}
println(s"函数的内幕,调用后的结果是:${myFun(5,5)}")
}