学习大数据的第15天——今天好奇scala语言,就花了一天去了解了一点,因为今天是自习,把明天上课要讲的对象预习了,然后就去看scala了哈哈哈
那我们今天就总结一下今天学习的scala知识点
什么是Scala
以我的了解来说,就是比java更加的体现出面向对象,众所周知,Java是一门面向对象的编程,但是Java中有些并没有真正意义上的面向对象,正是所谓"万物皆可为对象,想new几个是几个"嘿嘿,而scala还有一些函数式编程的概念
Scala概述
1.1、scala编译结果的反编译深入了解
使用 java HelloScala
无法编译,因为java中没有scala中的类库
java.lang.NoClassDefFoundError
使用反编译器发现,反编译后的scala文件实现了真正面向对象(万物皆对象) HelloScala类静态方法用对象来进行表示(单例设计模式)HelloScala认为是伴生对象的伴生类,HelloScala$为伴生类的伴生对象
如何使用java来编译scala文件呢?
java -cp %SCALA_HOME/lib/scala-library.jar; HelloScala
输入:C:\Users\stu\Desktop>java -cp %SCALA_HOME%/lib/scala-library.jar; HelloScala
输出Hello scala
首先学习一个语言要有准备工作,先学习怎么配置scala环境,在idea安装scala插件以及类库资源包(方便以后学习类库中的类方法带来方便)
配置环境其实跟java差不多,可以参考一下的视频进行安装:
点击观看尚硅谷视频(scala环境配置)
类库资源包的下载链接也给你们吧(我下的是2.12.11版本的):
下完之后再idea内配置一下就行
编写第一个scala文件(当然还是我们的老朋友HelloWorld)
//编写含有静态变量的方法
class Student(name: String, age: Int) {
def PrintInfo(): Unit = {
println("学生姓名:" + name + ",学生年龄:" + age + ",院校:" + Student.school)
}
//重写父类的toString()方法
override def toString: String = {
val str: String = "学生姓名:" + name + ",学生年龄:" + age + ",院校:" + Student.school
return str
}
}
//Student的伴生对象
object Student {
// val school = "shujia"
val school: String = "数加学院"
}
/*
object: 关键字,声明单例对象(伴生对象)
*/
object HelloWorld {
/*
object功能:scala删除static静态关键字的要想实现静态方法,定义一个金泰的变量时
再java阿红是根据 类名.变量名 来实现的,但是这不能体现面对对象的思想
所以scala直接删除了static关键字,用object来替代static
main方法从外部可以直接调用执行的方法
语句定义格式:
def 方法名称(参数名称: 参数类型): 返回值类型 = {方法体}
*/
def main(args: Array[String]): Unit = {
println("hello world")
//定义一个Student对象
val stu = new Student("姚龙", 18)
stu.PrintInfo()
println(stu.toString)
}
}
标识符
/*
标识符:
1、以字符或者下划线开头,后接字母、数字、下划线
2、以操作数开头,且只包含操作符(+-* /#!)
3、用反引号'.....'包括的任意字符串,即便是Scala关键字也可以
与java中没有的:
(package。。。。。)object、trait、with、
(修饰符)sealed、implicit、
(条件判断循环语句。。。。)match(模式匹配)、yield
(声明方法、变量)def、val、var
*/
object IdentifierDemo1 {
def main(agrs: Array[String]): Unit = {
//1、以字符或者下划线开头,后接字母、数字、下划线
val hello: String = ""
var Hello123: String = ""
val _abc = 123
//错误:not found: value -
// val h-b = ""
// val h-b = ""
// val 123abc = 123
// 以操作数开头,且只包含操作符(+-* /#!)
## 标题
val *# = "hello"
println(*#)
//3、用反引号'.....'包括的任意字符串,即便是Scala关键字也可以
//反引号 `...`
// var if = "if"
var `if` = "if"
println(`if`)
}
}
变量和常量的定义
/*
变量和常量的定义:
回顾java中的变量和常量:
变量类型 变量名称 = 初始值 int a = 10;
final 变量类型 变量名称 = 初始值 final int a = 20;
在scala中变量和常量的关系是平等的:
var 变量名称[: 变量类型] = 初始值 var a: Int = 20
val 变量名称[: 变量类型] = 初始值 val a: Int = 10
注意能用常量的地方不要用变量,以及scala中可以对数据类型进行自动的识别数据类型
*/
class Student2(name: String, var age: Int) {
def printIofo(): Unit = {
println("学生姓名:" + name + ",学生年龄:" + age)
}
}
object VariableDemo1 {
def main(args: Array[String]): Unit = {
//定义一个变量
var num: Int = 20
println(num)
//定义一个常量
val num1: Int = 10;
println(num1)
// (1)声明变量时,可以不屑数据类型,编译器可以自动推导,即类型推导
var a = 10
val b = 20
// (2)类型确认后就不能更改,说明scala是一门强数据类型语言
//编译错误,类型不匹配
// a = "你好"
// (3)变量声明时,必须要有初始值
// var c: Int
// (4)用var修饰的变量可以更改,用val修饰的变量不能更改
a = 21
//被val修饰的变量为常量,不能被修改
// b = 21
val stu = new Student2("姚龙", 18)
// stu = new Student2("尚志恒",20)
// stu = null
stu.printIofo()
stu.age = 10
stu.printIofo()
// var stu = new Student2("姚龙",18)
// stu = new Student2("尚志恒",20)
}
}
字符串操作
/*
1、字符串通过+号链接
2、printf用法:字符串,通过%传值
3、字符串模板(插值字符串);通过%获取变量值
*/
object StringDemo {
def main(args: Array[String]): Unit = {
val name = "姚龙"
val age = 18
println(name + "在数加学习,今年" + age)
//*用于多个字符串赋值多次并且拼接
println(name * 3)
//字符串的格式化输出只能用printf 不能用println
printf("%s在数加学习,今年%d", name, age)
println()
//字符串模板(字符串插值)
//模板字符串: s""
println(s"${age}岁的${name}在数加学习")
val num: Double = 2.3456
println(s"The num is ${num}")
//如果不想要小数点后面太多位:
//则可以使用 f""字符模板
println(f"The num is ${num}%2.2f")
//raw 除了变量,其他的在""中的元素直接输出,不管其是什么意思
println(raw"The num is ${num}%2.2f")
//三引号表示字符串,保持多行字符串的原格式输出
val sql = s"""
|select *
|from
|student
|where
| name = ${name}
|and
| age > ${age}
|""".stripMargin
println(sql)
}
}
键盘录入
import scala.io.StdIn
/*
java Scanner的用法
在scala中,我们引用StdIn来调用,import scala.io.StdIn
StdIn.readLine() 输入的是字符串
StdIn.readInt() 输入的是Int型
*/
object ScannerDemo1 {
def main(args: Array[String]): Unit = {
println("请输入你的大名:")
val name = StdIn.readLine()
println("请输入你的年龄:")
val age = StdIn.readInt()
println(s"你的大名是${name},你的年龄是${age}")
}
}
文件的写入和读出
import java.io.{File, PrintWriter}
import scala.io.Source
object FileIODemo1 {
def main(args: Array[String]): Unit = {
//1、从文件中读取数据
//Source.fromFile文件的路径 将文件读出来
//再通过foreach将文件打印出来
//可以直接copy绝对路径,也可以编写相对路径,相对路径从src开始就行了
Source.fromFile("src/main/resources/FileIoDemo1.txt").foreach(print)
//2、将数据写入文件 java中拥有可以直接写入文件的方法,直接调用java的方法即可
val writer = new PrintWriter(new File("src/main/resources/output.txt"))
writer.write("hello scala from java writer")
writer.close()
}
}
数据类型
数据类型:
1、scala中一切数据都是对象,都是Any的子类
2、Scala中数据类型分为两大类:
数值类型(AnyVal)、引用类型(AnyRef),不管是值类型还是引用类型都是对象
3、Scala数据类型仍然遵守,低精度的值类型向高精度的值类型自动转换(隐式转换)
4、Scala中的StringOps是对Java中的String增强
5、Unit:对应Java中的void,用于方法返回值的位置,表示方法没有返回值,Unit是一个数据类型,只有一个对象
就是().Void不是数据类型,只是一个关键字
6、Null是一个类型,只有一个对象就是null,它是所有引用类型(AnyRef)的子类。