Scala——基本语法


Scala是一门以Java虚拟机(JVM)为运行环境并将 面向对象函数式编程的最佳特性结合在一起的静态类型编程语言(静态语言需要提前编译的如:Java、c、c++等,动态语言如:js)。
1)Scala是一门多范式的编程语言,Scala支持面向对象和函数式编程。(多范式,就是多种编程方法的意思。有面向过程、面向对象、泛型、函数式四种程序设计方法。)
2)Scala源代码(.scala)会被编译成Java字节码(.class),然后运行于JVM之上,并 可以调用现有的Java类库,实现两种语言的无缝对接。

1 语法的简单说明

/*
	object:关键字,声明一个单例对象(伴生对象)
*/
object HelloWorld{
	/*
	main 方法:从外部可以直接调用执行的方法
	def 方法名称(参数名称:参数类型):返回值类型={方法体}
	*/
	def main(args: Array[String]):Unit = {
		println('Hello World')
		System.out.println('hello scala java')}
	
}

2 基本语法

2.1 注释

(1)单行注释://
(2)多行注释:/* * /
(3)文档注释:
/
**
*
*/

2.2 变量和常量

  1. 基本语法

var 变量名 [:变量类型] = 初始值 var i:Int = 10
val 常量名 [:常量类型] = 初始值 val j:Int = 20
注意:能用常量的地方不用变量
2. 注意
(1)声明变量时,类型可以省略,编译器自动推导,即类型推导
(2)类型确定后,就不能修改,说明 Scala 是强数据类型语言
(3)变量声明时,必须要有初始值
(4)在声明/定义一个变量时,可以使用 var 或者 val 来修饰,var 修饰的变量可改变,val 修饰的变量不可改

var修饰的对象及对象引用可以改变,val修饰的对象则不可变,但对象的引用可变

object TestVar{
	def main(args: Array[String]):Unit = {
		//p1是var修饰的,p1的属性是可变的,p1也是可变的
		var p1 = new Person()
		p1.name = 'dalang'
		p1 = null

		//p2是val修饰的,p2本身不可变(内存地址不能变),但p2的属性是可变的
		val p2 = new Person()
		p2.name = 'jinlian'
		//p2 = null     这样是错误的
	}
}
class Person{
	var name : String = 'jinlian'
}

2.3 标识符的命名规范

(1)以字母或者下划线开头,后接字母、数字、下划线
(2)以操作符开头,且只包含操作符(+ - * / # !等)
(3)用反引号``包括的任意字符串,即使是 Scala 关键字(39 个)也可以

//这些都是可以的
var hello: String = ''
var hello12: String = '123'
var +-*/ : String = ''
var `if`: String = ''

2.4 字符串输出

(1)字符串,通过+号连接
(2)printf 用法:字符串,通过%传值。
(3)字符串模板(插值字符串):通过$获取变量值


object TestPrint{
	def main(args: Array[String]): Unit = {
		val name : String = "alice"
		val age : Int = 18
		// + 拼接
		println(age + "岁的" + name + "在上学")
		println(name * 3)

		//printf:使用%
		printf("%d岁的%s在上学", age, name)

		//字符串模版:使用s"${变量}"
		println(s"${age}岁的${name}在上学")

		val num : Double = 2.3451
		//格式化模版字符串f" "  Double类型保留两位
		println(f"The num is ${num}%2.2f") //The num is 2.35
		//2.2f   第一个2表示长度不超过2,第二个2表示保留两位小数,f表示浮点类型
		//raw" "是什么就输出什么,不会进行解析
		println(raw"The num is ${num}%2.2f")  //The num is 2.3451%2.2f  是什么就输出什么

		//三引号表示多行的字符串
		val sql = s"""
			|select *
			|from
			|  student
			|where 
			|  name = ${name}
			|and
			|  age > ${age}
			|""".stripMargin
		println(sql)
		}
	}

2.5 键盘输入

基本语法:StdIn.readLine()、StdIn.readShort()、StdIn.readDouble()

import scala.io.Source
import java.io.{File, PrintWriter}
object TestStdIn{
	def main(args : Array[String]): Unit = {
		println("请输入您的大名")
		val name : String = StdIn.readLine()
		println("请输入您的芳龄")
		val age : Int = StdIn.readInt()

		//输出
		println(s"欢迎${age}岁的${name}的到来")
		//从文件中读取数据  可以直接输出结果
		Source.fromFile("./data").foreach(println)
		
		//向文件写入数据,scala没有写入文件的,需要借用java
		val writer = new PrintWriter(new file(path = "./output.txt"))
		writer.write("hello scala from java writer")
		writer.close()		
	}
}

2.6数据类型

在这里插入图片描述
数据类型:
(1)Scala中一切数据都是对象,都是Any的子类
(2)Scala中数据类型分为两大类:数值类型(AnyVal)、引用类型(AnyRef),不管是值类型还是引用类型都是对象
(3)Scala数据类型仍然遵守,低精度的值类型向高精度值类型,自动转换(隐式转换)
(4)Scala中的StringOps是对Java中的String增强
(5)Unit:对应Java中的void,用于方法返回值的位置,表示方法没有返回值。Unit是 一个数据类型,只有一个对象就是()。Void不是数据类型,只是一个关键字
(6)Null是一个类型,只有一个对象就是null。它是所有引用类型(AnyRef)的子类
(7)Nothing,是所有数据类型的子类,主要用在一个函数没有明确返回值时使用,因为这样我们可以把抛出的返回值,返回给任何的变量或者函数。

2.7 整数类型(Byte、Short、Int、Long)

在这里插入图片描述
(1)Scala 各整数类型有固定的表示范围和字段长度,不受具体操作的影响,以保证Scala 程序的可移植性。

var n1 : Byte = 127
var n2 : Byte = -128
var n3 : Byte = 128   //会出错代码片

(2)Scala 的整型,默认为 Int 型,声明 Long 型,须后加‘l’或‘L’

var n4 = 12 //这时默认为Int
var n5 = 1234667899999954L //超过了Int,需要声明为Long类型,在后面加'L'或'l'

(3)Scala 程序中变量常声明为 Int 型,除非不足以表示大数,才使用 Long

2.8 浮点类型(Float、Double)

在这里插入图片描述
Scala 的浮点型常量默认为 Double 型,声明 Float 型常量,须后加‘f’或‘F’。

var n6 = 2.3423f  //默认是Double类型,需要加"F"或"f"指定为Float类型
var n7 = 3.567    //Double类型

2.9 字符类型(Char)

字符类型可以表示单个字符,字符类型是Char。
(1)字符常量是用单引号’'括起来的单个字符。
(2)\t:一个制表位,实现对齐的功能。
(3)\n:换行符
(4)\:表示
(5)":表示"

val c1 : Char = 'a'

2.10 布尔类型:Boolean

(1)布尔类型也叫 Boolean 类型,Booolean 类型数据只允许取值 true 和 false
(2)boolean 类型占 1 个字节。

var isResult : Boolean = false
var isResult2 : Boolean = true

2.11 Unit类型、Null类型和Nothing类型

在这里插入图片描述
(1)Unit类型用来标识过程,也就是没有明确返回值的函数,Unit只有一个实例——()。方法返回空值
(2)Null类只有一个实例对象,Null可以赋值给任意引用类型(AnyRef),但是不能赋值给值类型(AnyVal)。空引用
(3)Nothing,可以作为没有正常返回值的方法的返回类型,非常直观的告诉你这个方法不会正常返回,而且由于 Nothing 是其他任意类型的子类,他还能跟要求返回值的方法兼容。

object TestNull{
	//1. 空值Unit
	def m1(): Unit = {
		println('m1被调用执行')
	}
	val a : Unit = m1()
	println("a: " + a)
	//返回:m1被调用执行   a: ()

	//2. 空引用Null
	var Student: Student = new Student(name = "alice", age = 20)
	student = null   //Student为引用类型,所以可以赋值为null
	println(student) #返回  null

	//3. Nothing :所有类型的子类
	def m2(n : Int): Nothing = {	//这里要指定为Nothing和Int类型的父类,可以选Int和Any
		if (n == 0)					//为了不那么宽泛,可以选Int
			throw new NullPointException
		else
			return n

	}
	val b : Int = m2(2)
	println("b: " + b)
	//返回   b: 2
}

2.12 类型转换

2.12.1 数值类型自动转换

当 Scala 程序在进行赋值或者运算时,精度小的类型自动转换为精度大的数值类型,这个就是自动类型转换(隐式转换)。数据类型按精度(容量)大小排序为:
在这里插入图片描述基本说明:
(1)自动提升原则:有多种类型的数据混合运算时,系统首先自动将所有数据转换成精度大的那种数据类型,然后再进行计算。
(2)把精度大的数值类型赋值给精度小的数值类型时就会报错,反之就会进行自动类型转换。
(3)(byte,short)和char之间不会相互自动转换。
(4)byte, short, char他们三者可以计算,在计算时首先转换为int类型。

2.12.2 强制类型转换

自动类型转换的逆过程,将精度大的数值类型转换为精度小的数值类型。使用时要加上强制转函数,但可能造成精度降低或溢出,格外要注意。
(1)将数据由高精度转换为低精度,就需要使用到强制转换。
(2)强转符号只针对于最近的操作数有效,往往会使用小括号提升优先。

var r1 : Int = 2.5.toInt  //直接取整(不论正负,不论向上向下取整,也不会四舍五入)
var r2 : Int = (10 * 3.5 + 6 * 1.5).toInt

2.12.3 数值类型和String类型间转换

(1)基本类型转 String 类型(语法:将基本类型的值+"" 即可)。
(2)String 类型转基本数值类型(语法:s1.toInt、s1.toFloat、s1.toDouble、s1.toByte、s1.toLong、s1.toShort)。

//基本类型转换String
var str1 : String = 100 + ""
var str2 : String = 4.5 + ""
var str3 : String = true + ""

//String类型转基本数值类型(调用相关方法)
var s1 : String = "12"
var s2 : Short = s1.toShort
var s3 : Int = s1.toInt
var s4 : Long = s1.toLong
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值