1 包对象

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

package com.atguigu {
//每个包都可以有一个包对象。你需要在父包(com.atguigu)中定义它,且名称与子包一样。
package object scala {
var name = "jack"
def sayOk(): Unit = {
println("package object sayOk!")
}
}
package scala {
class Test {
def test() : Unit ={
//这里的name就是包对象scala中声明的name
println(name)
sayOk()//这个sayOk 就是包对象scala中声明的sayOk
}
}
object TestObj {
def main(args: Array[String]): Unit = {
val t = new Test()
t.test()
//因为TestObje和scala这个包对象在同一包,因此也可以使用
println("name=" + name)
}}}}

2 包对象的底层实现机制分析(重点)

当创建包对象后,在该包下生成 public final class package 和 public final class package$

通过 package$ 的一个静态实例完成对包对象中的属性和方法的调用。

包对象的注意事项

1)每个包都可以有一个包对象。你需要在父包中定义它。如图:

2) 包对象名称需要和包名一致,一般用来对包的功能补充

3 Scala中包的可见性介绍:

在Java中,访问权限分为: public,private,protected和默认。在Scala中,你可以通过类似的修饰符达到同样的效果。但是使用上有区别。

object Testvisit {
def main(args: Array[String]): Unit = {
val c = new Clerk()
c.showInfo()
Clerk.test(c)
}}
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)
}}

Scala中包的可见性和访问修饰符的使用

1)当属性访问权限为默认时,从底层看属性是private的,但是因为提供了xxx_$eq()[类似setter]/xxx()[类似getter] 方法,因此从使用效果看是任何地方都可以访问)

2)当方法访问权限为默认时,默认为public访问权限

3)private为私有权限,只在类的内部伴生对象中可用

4)protected为受保护权限,scala中受保护权限比Java中更严格,只能子类访问,同包无法访问 (编译器)

5)在scala中没有public关键字,即不能用public显式的修饰属性和方法。

6)包访问权限(表示属性有了限制。同时包也有了限制),这点和Java不一样,体现出Scala包使用的灵活性。

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

Scala 面向对象(三):package 包 (二)的更多相关文章

  1. JavaSE入门学习17:Java面向对象之package(包)

           一Java包(package)        为了更好地组织类,Java提供了包机制,用于差别类名的命名空间.        包的作用:        A把功能类似或相关的类或接口组织在 ...

  2. Scala 面向对象(二):package 包 (一) 入门

    1 Scala包的基本介绍 和Java一样,Scala中管理项目可以使用包,但Scala中的包的功能更加强大,使用也相对复杂些,下面我们学习Scala包的使用和注意事项. 2 Scala包快速入门 使 ...

  3. 廖雪峰Java2面向对象编程-5包和classpath-1包package

    1.package的意义 如下,存在多个相同类名的文件.当引用Person类,将无法确定引用小红,还是小明的Person类,即同名类的冲突. 小明的Person类:Person 小红的Person类: ...

  4. Scala——面向对象和函数式编程语言

    Scala Scala是一门运行时基于JVM的编程语言,具备函数式编程和面向对象特点. 基本知识 basics 任意词均可作为符号名,对于关键词,以反引号包裹,避免使用下划线,避免带美元符的名字. 声 ...

  5. 7. Scala面向对象编程(中级部分)

    7.1 包 7.1.1 看一个应用场景 现在有两个程序员共同开发一个项目,程序员xiaoming希望定义一个类取名Dog,程序员xiaohong也想定一个类也叫Dog,两个程序员还为此吵了起来,该怎么 ...

  6. go package包的使用

    一.标准库 引入 在我们之前所写的所以代码中,我们基本上可以看到fmt这个导入的包,但是我们却不知道如何去写这种包. 如果我们可以自己去写,那么我们就可以将一个功能的集合统一的放入包中,便于以后使用, ...

  7. ioutil包二

    ioutil包二 (原创随笔,转载请注明出处 http://www.cnblogs.com/majianguo/p/8016426.html) ioutil包实现了一些I/O实用功能,导出了7个函数和 ...

  8. 20145122《Java面向对象程序设计》实验二实验报告

    实验名称: Java面向对象程序设计 实验内容: 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 PSP时间 步骤 ...

  9. 批量修改Java类文件中引入的package包路径

    http://libeey.blogbus.com/logs/101848958.html当复制其他工程中的包到新工程的目录中时,由于包路径不同,出现红叉,下面的类要一个一个修改包路径,类文件太多的话 ...

随机推荐

  1. 【leetCode】485. 最大连续1的个数

    给定一个二进制数组, 计算其中最大连续1的个数. 示例 1: 输入: [1,1,0,1,1,1]输出: 3解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3.注意: 输入的数组只包含 ...

  2. activeMQ从入门到简单集群指南

    1.什么是amq MQ是消息中间件,基于JAVA的JMS消息服务机制来传递信息. 2.mq的作用 MQ给程序之间提供了一个缓冲,避免了在程序交互频繁的情况下,提高程序性能瓶颈和数据的可靠性 3.mq怎 ...

  3. blob斑点检测

    目录 1. 可选算法 1.1. Laplacian of Gaussian (LoG) 1.2. Difference of Gaussian (DoG) 1.3. Determinant of He ...

  4. 解决mysql不是内部或外部命令(win10)

    1.原因:cmd当前所在路径为c盘下的system32,由于mysql安装位置不在该目录下,所以会报错. 2.解决方法:配置环境变量 step1:右击此电脑->属性 step2:选择高级系统设置 ...

  5. cheerio html方法中文被编码问题

    var $ = cheerio.load("<h1><p>你好</p><em>Hello,World!</em></h1&g ...

  6. (六)logback.xml 配置详解

    原文链接:https://www.cnblogs.com/taiyonghai/p/9290641.html,https://blog.csdn.net/A615883576/article/deta ...

  7. ZWave 中的消息队列机制

    文章主题   在我们的日常编程中,对消息队列的需求非常常见,使用一个简洁.高效的消息队列编程模型,对于代码逻辑的清晰性,对于事件处理的高效率来说,是非常重要的.这篇文章就来看看 ZWave 中是通过什 ...

  8. 05、MyBatis 缓存

    1.MyBatis缓存 MyBatis 包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制.缓存可以极大的提升查询效率. 1).一级缓存 public Employee getEmpById( ...

  9. JavaWeb网上图书商城完整项目--day02-21.退出功能的实现

    1.当用户点击退出的时候,跳转到登陆页面 当用户点击退出的时候,需要将session中保存的登陆的用户销毁掉 当用户点击退出的时候,调用UserServlet的quit方法 退出按钮在top.jsp中 ...

  10. JAVA集合框架 - Map接口

    Map 接口大致说明(jdk11): 整体介绍: 一个将键映射到值的(key-value)对象, 键值(key)不能重复, 每个键值只能影射一个对象(一一对应). 这个接口取代了Dictionary类 ...