前言:
上文我们 讲 完 了 封装 , 本文 主要 对 封装的 扩展 包 ,及包访问权限.
包 (package)
包的 概念:
在面向对象体系中,提出了一个软件包的概念,即:为了更好的管理类,把多个类收集在一起成为一组,称为软件包。有点类似于目录。比如:为了更好的管理电
脑中的歌曲,一种好的方式就是将相同属性的歌曲放在相同文件下,也可以对某个文件夹下的音乐进行更详细的分类。
如 : 我们 就可以 将 我们 的 歌曲 进行 分类 ,这样就 容易 管理 。
在Java中也引入了包,包是对类、接口等的封装机制的体现,是一种对类或者接口等的很好的组织方式,比如:
一个包中的类不想被其他包中的类使用。包还有一个重要的作用:在同一个工程中允许存在相同名称的类,只要
处在不同的包中即可
简单来说 :
包 (package) 是组织类的一种方式.使用包的主要目的是保证类的唯一性
小了解 了 一下我们包 的 概念 ,其实 我们 很早 就 在使用 了 包 ,回忆 一下我们 是 如何 打印 数组 ,
这里我们 是不是 就通过 Arrays 这个类中 的 toString 方法 来 打印我们的 数组 , 这里我们 就 通过 util 这个 包
,使用了 包中 的 类 ,然后 通过 这个类中 的方法 完成了我们 打印 数组的 指令。
之前我们 都是 直接 使用 没有 特别深究 过 ,这里我们 就来 浅 谈 一下 。
看到我们 最前 面 是不是 有 一句 代码 ,我们 就来 分析 一下 。
import (导入)
最开始 我们 看到 了 一个 单词 import
通过我们 的 有道 ,我们 可以 看到 在 计算机 中 这个单词的 意思 就算 导入,导入导入 到底 导入的 是 什么 呢??
其实 import
是 用来 帮助我们导入 包 的 , 通过 import
导入 别人 写好的 包 (包里存的基本上都是类,而这
些类都是别人写好的),这里我们 就能够 使用别人写好的 类 。
下面 继续 我们 能看到 java.util
这里 又是 啥 意思 呢 ?
其实 这里 就是 我们的 包 ,util
就是 java 为 我们 提供 的 工具 包 。
在 这包 中 :
Java提供了一些实用的方法和数据结构。例如,Java提供日期(Data)类、日历(Calendar)类来产生和获取日期及
时间,提供随机数(Random)类产生各种类型的随机数,还提供了堆栈(Stack)、向量(Vector) 、位集合(Bitset)以及
哈希表(Hashtable)等类来表示相应的数据结构。 (了解 即可 )。
最后 的 Arrays
就是 我们 使用 的 类 ,直接 直接 使用 .
点好 ,点出 我们 使用 方法 存在 的 类 。
了解 了 包 (package) 下面我们 就 通过 导入 一个 包 来 获取 我们的 毫秒级别的时间戳
这里我们 就 通过 导入 tuil
这个包 , 通过 Date 这个 类 ,使用了 我们的 getTime()
方法 获取 了 时间 搓 ,
另外 :我们也可以 不用导入 包 中的 类 ,而 直接 使用 。
可以 发现 这里 注释掉 包 ,这里 就化红线报错 了 , 你们 肯定 会说 这不骗人的 吗 ?
那么我们 就来 看看 如何 不通过 导 包中 的 类 而使用 。
这样 也 能够 使用 getTime()
方法 但 这样使用 比较麻烦,我们 还是 习惯 使用 import
这种 方法。
下面来 看一下包的 注意事项:
不能, 只导入包 ,不指定 具体的 类
可以看 我们 只通过 import
导入 了 我们的 工具包 util
但没有 指定我们的 Arrays
类 , 这里 就报错了 。
这里就可以 得出 一个 结论 :
在 Java中 只能导入 一个具体 的类 不能导入 一个 具体的包
另外 :我们 还可以 通过 另外 一种 方法 来 导入我们的包中 的 类 。
import java.util . *;
这里 的 意思 就是 将 util 这个包中 的 所有类 导入,*
表示的是通配符,包括 util 的所有类
补充: 这里 并不是 全部 导入 ,此时肯定 有人 会 晕掉 ,不要急 慢慢来看 ,
这里我们的 java 在 处理的时候,需要哪个类,它才会给你那个类。
就是说:Java不会提前给你任何类,当你需要某个类的时候,再给你。而且是要一个,给一个。 不会说要一个,给你一大堆。
相比 与 C 语言 中的#include<stdio.h>
java 就 做的很好 , C 只要导入 了 这个头文件 ,就会 将 stdio.h
的 东西 全部 导入 , 相比 java 就 只会 导入 我们 需要的类。
下面 就来 演示 一下 :
这 里 就 成功 将我们的 数组 给打印出来了。
但并不是 所有东西的 是 十全十美的 , 这里我们 使用 import java.util.*
也是 有 缺陷 的 。
这里 就来 看一下: 这里 还是 拿 获取 毫秒级的时间搓来举例 (Date)
可以看到 在 util 和 sql
这 两个 包 地下 都 有 Date 这个 类 ,如果 我们 同时 使用 *
来 导入 具体的 类 就会 出现问题 。
这样 就会 出现 冲突 ,导致 Date 不晓得 是 那个 包中 的 , 这里 就需要 手动 导入 一个 具体 的 类 ,或 手动 指定 路径 。
这里 换成 java.sql
也行 ,
另外 一种 方法 :
这里 我们 来 对比 一下 : import java.util.具体类
和 import java.*
那种 方法 好 ,这里我们认为 import java.util.具体的类
相对 好一点 ,也 比较 推荐使用这种 方法。
下面我们 来 学习 一下 import static
-静态导入
import static - 静态导入 (了解即可)
使用 import static 可以导入包中的 静态的 方法 和 字段
具体 操作 :
import static java.lang.具体的类.*;
下面 就来 演示 一下: 求 两个 数 的 最大值 .
一般我们 是不是 就这样 求 最大值 的 , 下面我们 就 通过 import static 来静态 导入 .
这样我们 就 不用 写 Math.
只写 了 方法 max () 就 将我们的 最大值 求出来了.
但我们一般 不推荐 这么 写 , 这里 虽然 简化 了我们的 代码 ,但 可读性 变差了 .
下面我们就来 创建我们的 包
创建包
操作步骤 : 在 IDEA 中先新建一个包: 右键 src -> 新建 -> 包
弹出的对话框中输入包名, 例如 com.baidu.demo
这里我们就 创建 出 了我们的 包 ,如果 你 的 包也 和我 一样 是 连在 一起 ,那么 就 跟这 设置 一下 .
这样我们 就 设置 好 了.
下面我们 再 我们 创建的 包 中 创建 类
这里 我们 就成功的 创建 出类 了 , 但 上面的 package com.baidu.demo1
是 什么 呢 ?
其实 这里 是 我们的 这个 包的 路径.
下面就来 调用 我们 这个 demo1 包 中 的func方法 .
如果 我们 这样 导入 包 ,但 Main 这个 类 与我们 主 类 的 名字 重名了 就会出现问题 ,只能 指定 路径了 .
这样我们就 成功 的 调用 demo1 这个 包 中 Main 这个类 中的 func 方法.
包访问权限
下面我们来看 一下我们的 包 访问 权限
还是 这张图 :
protected
会 在 继承 后 讲到 , 这里 就先 来 了解 其他 三个 .
我们已经了解了类中的 public 和 private. private 中的成员只能被类的内部使用.
如果某个成员变量不包含 public 和 private 关键字(不加任何的访问修饰限定词的时候), 这个成员变量就具有包的的权限,
此时这个成员变量可以在包内部的其他类使用, 但是不能在包外部的类使用该成员变量
演示:
如果 不在 同一个包 底下 呢 ?
可以看到我们 在 baidu 这个 包 底下创建 了 一个 Test 类 ,并 导入 了 demo1 这个 包中 的 Dog ,但我们 调用 Dog 类中的 字段 和 方法 时 报错了 ,这里 就 是
包访问 权限 : 此时这个成员变量可以在包内部的其他类使用, 但是不能在包外部的类使用该成员变量.
补充:
常见的包(系统包)
-
java.lang:系统常用基础类(String、Object),此包从JDK1.1后自动导入。
-
java.lang.reflect:java 反射编程包;
-
java.net:进行网络编程开发包。
-
java.sql:进行数据库开发的支持包。
-
java.util:是java提供的工具程序包。(集合类等) 非常重要
-
java.io:I/O编程开发包。
下文 预告 : 继承 or 多态 .