1.Scala中会默认隐式的引用到每个程序中
import java.lang._ //包含了常用的java语言类型,在.NET环境中,则会引用system命名空间
import scala._ // 引入常用的scala类型
import Predef._ // 通过Predef对象自动加载一些隐式对象
//everything in the Predef object--Predef是一个对象(Object),这个对象中,定义一些类型别名
//List,Map,Set,用到的是immutable包中的对象,这是在Predef里定义的
//Predef对象定义了常用的隐式转换--装箱和拆箱操作的隐式转换
Predef.implicitly
定义类型失配 或 选用不存在的方式 时候--使用隐式转化--在不打破互操作的基础上,支持更多的操作
2.应用创建启动入口有两种方式
1.定义继承App特质的Object-
2.定义一个Object,并实现main方法<仅带有一个参数Array[String],且返回类型是Unit的单列对象>
-主函数访问命令行
--多线程--自行编写main方法
Scala应用是从object启动的,而不是类,这点和Java有所不同
Java默认的toString方法只会显示类型名称和对象在JVM堆中的地址
3.Scala的特性
模式匹配
隐式特性
静态类型语言--静态类型系统
类型特性--类型系统--类型推断--抽象类型
--类型推断-基于流的
函数式:匿名函数,高阶函数,闭包,引用透明,无副作用,尾递归
柯理化 偏函数--函数未被应用于它所有的参数
面向对象:
并发 ---Java中内建了基于共享数据和锁的线程模型,Scala提供可Actor包不共享数据,依赖于消息传递的模型
Construction 构造器----Iterator 迭代 Extractors--抽取器
元编程--使用Scaladoc自动生成文档--打印成偏爱的代码风格,检查常见错误
支持元编程--注解系统<注解语法>
4.Scala 类型系统
代码复用--信息隐藏--
严格类型--非严格类型
参数化类型
结构化类型
复合类型--存在类型
路径依赖类型
类型型变--是泛型类型的概念--定义哪些参数可以传给方法的规则
边界--在类型参数上加限制
Invariant --不变 [A]
Covariant--协变 [+A]
Contravariant---逆变 [-A]
参数化类型
实现方法--将类型指定到基础类后的方括号内实现 Array[String]
设计类库--或--构建可重用控件
构建可重用控件接口的成员的类型符号应该显示给出--因为它们构成了控件以及其使用者之间契约的重要部分
可读--易懂--简洁
5.Scala一些简单语法
方括号--类型参数
圆括号--值 参数
val--定义的变量不能被重新赋值--但变量指向的内部却可以改变;数组是通过圆括号索引的
Array数组内部元素是可以改变的,但是greetStr对象不能被重新赋值成别的数组
val greetStr = new Array[String](3)
greetStr(0) = "hello "
greetStr(0) = "equals "
greetStr(0) = "nihao! \n"
: val hello:String = "haha"
::
::: 连接操作符--操作元都是列表
继承和组合--实现代码的复用
类层级
数据结构
Any
AnyRef --- Iterable Option None Some
AnyVal -----Byte Char Int Long Float Double Boolean Unit
Nothing---Null---用于处理边界情况
trait --Traversable
容器类
Array--元素值可变的同类对象序列
List---不同于Java,不可变的同类对象序列 ::: 实现了叠加个功能 :: ,Scala中没有append操作
:: cons操作符--也是一个子类,具有调用右边对象的方法。
需要在表达式最后添加Nil 或者List() ,调用其方法::
1::2::3::Nil
List(1,2,3)
ListBuffer--提供append
Tuple元组可以是不同类型的元素,而列表是相同的元素--访问方法和List不同,且索引基于1
Map
Set
Stack Queue Stream
Seq Iterable Traversable
经验
1.行为不被重用--做成具体类
2.行为在多个不相关的类中重用--做成特质,因为特质可以混入不同的类层级
3.希望在Java代码中继承--做成抽象类
测试-使用断言assert
单元测试--ScalaTest JUnit
规格测试
6.编译和运行
面向对象编程--将数据和操作放在一起,用形式化的结构绑定数据和操作
函数式编程-----函数头等地位; 将输入和输出映射,而不是就地改变===方法不应该有副作用-透明
不可变的数据结构
编译期-类型检查---类型转换
运行期- -动态绑定
被调用的实际方法取决于运行期间对象基于的类,而不是变量或者表达式的类型
确定类型信息--类型信息转换
使用类经过的流程--类加载器加载 ----链接----初始换
类名.class---类的Class对象--编译期间就加入了
getClass() 方法获取Class的引用--返回该对象实际类型的Class引用
运行时类的Java.lang.Class对象--由类的实例变量调用--getClass()是运行程序时动态加载
getName()
getClass.getName
Class.forName()
类加载机制
newInstance
创建新类
new
Java 的反射机制
Class类以及java.lang.reflect类库一起对反射的概念进行支持
Java类型系统
运行时使用类型信息--首先获得对恰当的Class对象的引用--Class.forName()
泛型--实现了参数化类型的概念--参数化类型机制
目的是希望类或者方法具有广泛的表达能力
编写用于多种类型的代码
方法--通过解耦 类或者方法 与所使用的类型之间的约束
常见-使用别人构建的泛型-例如创建容器类
-自己构建泛型的类
Java和Scala的区别和联系