包
包 (package) 是组织类的一种方式. 使用包的主要目的是保证类的唯一性.
唯一性怎么证明呢?其实很简单:例如,在同一个包下,你在代码中写了一个 Test 类. 然后你的同事也可能写一个 Test 类. 如果出现两个同名的类, 就会冲突, 导致代码不能编译通过.因为这两个类在同一个包下.
再来看一个情况:
可以看到图中的两个类的名称虽然相同,但是并没有报错,原因是第一个TestDemo类的路径为com.baidu.www.TestDemo,第二个TestDemo类的路径为src.TestDemo,路径不相同,所以重名也不会报错.这样也说明了包的目的就是为了保证类的唯一性`,
路径称为全限定名称. 一个类的路径就成为.
导入系统包中的类
Java 中已经提供了很多现成的类供我们使用. 例如
public class TestDemo5 { public static void main(String[] args) { public class Test { public static void main(String[] args) { java.util.Date date = new java.util.Date(); // 得到一个毫秒级别的时间戳 System.out.println(date.getTime()); } } } }
可以使用 java.util.Date 这种方式引入 java.util 这个包中的 Date 类. 但是这种写法比较麻烦一些, 可以使用 import 语句导入包.如下所示:
import java.util.Date; public class Test { public static void main(String[] args) { Date date = new Date(); // 得到一个毫秒级别的时间戳 System.out.println(date.getTime()); } }
如果需要使用 java.util 中的其他类, 可以使用 import java.util.*
import java.util.*; public class Test { public static void main(String[] args) { Date date = new Date(); // 得到一个毫秒级别的时间戳 System.out.println(date.getTime()); } }
但是我们更建议显式的指定要导入的类名. 否则还是容易出现冲突的情况.
import java.util.*; import java.sql.*; public class Test { public static void main(String[] args) { // util 和 sql 中都存在一个 Date 这样的类, 此时就会出现歧义, 编译出错 Date date = new Date(); System.out.println(date.getTime()); } } // 编译出错 Error:(5,9)java:对Date的引用不明确 java.sql 中的类 java.sql.Date 和 java.util 中的类 java.util.Date 都匹配
在这种情况下需要使用完整的类名:
public class Test { public static void main(String[] args) { java.util.Date date = new java.util.Date(); System.out.println(date.getTime()); } }
注意事项:
1:import 和 C++ 的 #include 差别很大. C++ 必须 #include 来引入其他文件内容, 但是 Java不需要. import 只是为了写代码的时候更方便. import 更类似于 C++ 的 namespace 和 using
2:注意package和import的区别,package是我们自定义的包,而import是我们导入系统包.
将类放到包中(自定义的包和类)
基本规则
在文件的最上方加上一个 package 语句指定该代码在哪个包中.
包名需要尽量指定成唯一的名字, 通常会用公司的域名的颠倒形式(例如com.bit.demo1 ).
包名要和代码路径相匹配. 例如创建 com.bit.demo1 的包, 那么会存在一个对应的路径 com/bit/demo1 来存储代码.
如果一个类没有 package 语句, 则该类被放到一个默认包中.
操作步骤
1)在 IDEA 中先新建一个包: 右键 src -> 新建 -> 包
2)在弹出的对话框中输入包名, 例如 com.bit.demo1
3)在包中创建类, 右键包名 -> 新建 -> 类, 然后输入类名即可.
4)此时可以看到我们的磁盘上的目录结构已经被 IDEA 自动创建出来了
5)同时我们也看到了, 在新创建的 Test.java 文件的最上方, 就出现了一个 package 语句
包的访问权限控制
我们已经了解了类中的 public 和 private. private 中的成员只能被类的内部使用.
访问修饰限定符有四种:public,private,protected,默认权限这四种
如果某个成员不包含 public private protected关键字, 那么这个成员就已经是默认权限了,具有默认权限的成员可以在包内部的其他类使用, 但是不能在包外部的类使用.
下面的代码给了一个示例. Demo1 和 Demo2 是同一个包中, Test 是其他包中.
Demo1.java
package com.bit.demo; public class Demo1 { int value = 0; }
Demo2.java
package com.bit.demo; public class Demo2 { public static void Main(String[] args) { Demo1 demo = new Demo1(); //结果为0 System.out.println(demo.value); } } // 执行结果, 能够访问到 value 变量,原因是Demo2这个类和Demo1这个类同在一个包下
Test.java
import com.bit.demo.Demo1; public class Test { public static void main(String[] args) { Demo1 demo = new Demo1(); System.out.println(demo.value); } } // 编译出错,Test类是无法访问Demo1当中的value变量的,因为这个value变量是默认权限,且Test类与Demo1这个类并不在一个包下
常见的系统包
1.java.lang:系统常用基础类(String、Object),此包从JDK1.1后自动导入。程序员不用手动导入.
2.java.lang.reflect:java 反射编程包;
3.java.net:进行网络编程开发包。
4.java.sql:进行数据库开发的支持包。
5.java.util:是java提供的工具程序包。(集合类等) 非常重要
6.java.io:I/O编程开发包.