一.常见的命名形式

com.公司名.项目名.业务模块名

二.自动引入的常用包 

java.lang.*   scala包   Predef包

三.三种打包方式

四.通过import导包的情况

在Java中两个类只要package不同就需要import。

在Scala中需要手动导包的情况

①两个类的package不存在包含关系且不是一个package名

②两个类的包存在包含关系,且父包要访问子包的内容

五.包对象

①包对象出现的原因

包可以包含类、对象和特质trait,但不能包含函数/方法或变量的定义。这是Java虚拟机的局限。为了弥补这一点不足,scala提供了包对象的概念来解决这个问题

②定义形式

package object Test{ //对象名与包名一致
}
package Test{
}

包对象和我们常见的object一样在编译时生成两个class文件(package$.class和package.class --->所以每个包最多只可以有一个包对象),其他scala文件如果使用包对象的变量和方法,就像同包下两个class文件之间相互访问

六.包的可见性

①在Java中

public 所有都可以访问
protected 对子类和同一个包中的类公开
默认 同一个包的类公开
private 只有类本身可以访问,不对外公开

不同包的两个类A与B,A中的属性age使用protected修饰,在B中一定不能访问的到吗?
不一定如果B是A的子类,可以访问的到

②在Scala中
1.当属性访问权限为默认时,从底层看属性是private的,但是因为提供了xxx_$eq()[类似setter]/xxx()[类似getter] 方法,因此从使用效果看是任何地方都可以访问)
2.当方法访问权限为默认时,默认为public访问权限
3.private为私有权限,只在类的内部和伴生对象中可用

class Clerk {
  var name : String = "jack"
  private var sal : Double = 9999.9
  def showInfo(): Unit = {
    println(" name " + name + " sal= " + sal)
  }}
object Clerk{
  def test(c : Clerk): Unit = {
    //这里体现出在伴生对象中,可以访问c.sal
    println("test() name=" + c.name + " sal= " + c.sal)
  }}

4.protected为受保护权限,scala中受保护权限比Java中更严格,只能子类访问,同包无法访问(编译器层面控制的)
5.在scala中没有public关键字,即不能用public显式的修饰属性和方法。
6.包访问权限(表示属性有了限制。同时包也有了限制),这点和Java不一样,体现出Scala包使用的灵活性

package com.scq.scala
class Person {
  private[scala] val pname="hello" // 增加包访问权限后,1.private同时起作用。不仅同类可以使用 2. 同时com.atguigu.scala中包下其他类也可以使用
}
当然,也可以将可见度延展到上层包
private[scq] val description="zhangsan"
说明:protected也可以变化,比如protected[scq], 非常的灵活。

画了个图:

七.包的引入

Scala引入包也是使用import, 基本的原理和机制和Java一样,但是Scala中的import功能更加强大,也更灵活
①在Scala中,import语句可以出现在任何地方,并不仅限于文件顶部,import语句的作用一直延伸到包含该语句的块末尾。这种语法的好处是:在需要时在引入包,缩小import 包的作用范围,提高效率
②Java中如果想要导入包中所有的类,可以通过通配符*,Scala中采用下 _
③如果不想要某个包中全部的类,而是其中的几个类,可以采用选取器(大括号)
④如果引入的多个包中含有相同的类,那么可以将不需要的类进行重命名进行区分,这个就是重命名

import java.util.{ HashMap=>JavaHashMap, List} //引入Java的HashMap和List,并且重命名HashMap为JavaHashMap

⑤如果某个冲突的类根本就不会用到,那么这个类可以直接隐藏掉

import java.util.{ HashMap=>_, _} // 含义为 引入java.util包的所有类,但是忽略 HahsMap类.
var map = new HashMap() // 我用的idea工具,提示java.util的HashMap,并且不提示scala的HashMap的全类名,需要手动导入,感觉是软件的问题
new ArrayList[Int]()
posted @ 2019-01-06 21:56  Hypergroup  阅读(125)  评论(0)    收藏  举报