Scala常见特性小结

1.Scala中会默认隐式的引用到每个程序中

import java.lang._ //包含了常用的java语言类型,在.NET环境中,则会引用system命名空间
import scala._     // 引入常用的scala类型
import Predef._    // 通过Predef对象自动加载一些隐式对象
                            //everything in the Predef object--Predef是一个对象(Object),这个对象中,定义一些类型别名
                            //ListMapSet,用到的是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的区别和联系

blogroll

social