zoukankan      html  css  js  c++  java
  • Scala学习七——包和引入

    一.本章要点

    • 包也可也可以像内部类那样嵌套
    • 包路径不是绝对路径
    • 包声明链x.y.z并不自动将中间包x和x.y变成可见
    • 位于文件顶部不带花括号的包声明在整个文件范围内有效
    • 包对象可以持有函数和变量
    • 引入语句可以引入包、类和对象
    • 引入语句可以出现在任何位置
    • 引入语句可以重命名和隐藏特定成员
    • java.lang、scala和Predef总是被引入

    二.包

      Scala中的包和Java/C++中的包都是一样的,用来管理大型程序中的名称。

      可以用完全限定的名称来防止冲突(scala.collection.immutable和scala.collection.mutable),也可以用引入语句来提供一个更短小的别名。

      要增加条目到包中,可以将其包含在包语句当中(注:源文件目录和包之间并没有强制的关联关系,可以在一个文件中写多个):

    package com{
    package horstmann{
    package{
    class Employee{
    
    }}
    }
    }

    三.作用域规则

      Scala的包支持嵌套,可以访问上层作用域中的名称:

      问题:  

        这种情况在Java中不会发生,因为包名是绝对的。但在Scala中包名是相对的(可以使用绝对包名解决,以_root_开始[val s=new _root_.scala.collection.mutable.ArrayBuffer[...]],也可以使用串联式。)

    四.串联式包语句

      包语句可以包含一个”串“,或者说路径区段,如:

    五.文件顶部标记法

      文件顶部使用package语句:

    package com.horstman.impatient
    package people //所有内容属于com.hortman.impatient.people,但com.horstman.impatient包中的内容可见,可以直接引用
    class Person
    ...
    
    
    
    //相当于
    package com.horstman.impatient{
    package people{
    class Person
    ...
    
    }
    
    }

    六.包对象

      包可以包含类,对象,特质,但不能包含函数或变量的定义(Java虚拟机的局限)。

      每个包可以有一个包对象,需要在父包中定义它,且名称和子包一样,例:

      

    package com.horstman.impatient
    
    package object people{
    val defaultName="xxx"
    }
    package people{
    class Person{
    var name=defaultName //从包对象拿到常量
    
    }
    
    }

      在同一个包中使用包对象字段不需要加限定词,在其他地方可以用com.horstman.impatient.people.defaultName访问(包对象被编译成带有静态方法和字段的JVM类)。

    七.包可见性

      在Scala中可以用private[类名/包名]限制属可见位置(像Java中没有修饰符的类成员在包含该类的包中可见)。

      

    package com.people
    class Person{
    private[Person] def ...//只在该类实例化对象中可见
    }
    
    //上层包可见
    private[com] def ....

    八.引入

      通过引入语句使用更短的名称。(import xxx.xxx.xxx,_相当于Java中的通配符)

    九.任何地方都可以声明引入

      在Scala中,引入语句可以出现在任何地方,并不仅限于文件顶部(如在块中引入,作用效果一直延升到块末尾)

    十.重命名和隐藏方法

    • 可以使用选取器引({})入包中的几个成员(import java.awr.{Color,Font});
    • 选取器允许重命名成员(import jva.util.{HashMap=>javaHashMap});
    • HashMap=>_表示隐藏某个成员而不是重命名,一般用来引入其他成员(import java.util.{HashMap=>_,_})

    十一.隐式引入

      每个Scala程序都隐式引入如下:

    //和Java一样,java.lang总是被引入
    //允许覆盖之前的引入,如scala.StringBuilder会覆盖java.lang.StringBuilder
    import java.lang._
    import scala._
    //Predef包含了很多有用函数,在Scala还没有加入包对象之前就已经存在了
    import Predef._

     十二.练习

  • 相关阅读:
    「译」JVM是如何使用那些你从未听过的x86魔幻指令实现String.compareTo的
    「译」Graal JIT编译器是如何工作的
    [Inside HotSpot] C1循环不变代码提升优化
    Java逆变(Covariant)和协变(Contravariant)
    [Inside HotSpot] Xcode编译调试OpenJDK12
    [Inside HotSpot] UseParallelGC和UseParallelOldGC的区别
    [Inside HotSpot] Java分代堆
    [Inside HotSpot] Serial垃圾回收器 (二) Minor GC
    [Inside HotSpot] Epsilon GC
    [Inside HotSpot] Serial垃圾回收器 (一) Full GC
  • 原文地址:https://www.cnblogs.com/lyq-biu/p/11950910.html
Copyright © 2011-2022 走看看