java中的包

简介: java中的包

包 (package) 是组织类的一种方式. 使用包的主要目的是保证类的唯一性.

唯一性怎么证明呢?其实很简单:例如,在同一个包下,你在代码中写了一个 Test 类. 然后你的同事也可能写一个 Test 类. 如果出现两个同名的类, 就会冲突, 导致代码不能编译通过.因为这两个类在同一个包下.

再来看一个情况:

2.png

可以看到图中的两个类的名称虽然相同,但是并没有报错,原因是第一个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.png

2)在弹出的对话框中输入包名, 例如 com.bit.demo1

2.png

3)在包中创建类, 右键包名 -> 新建 -> 类, 然后输入类名即可.

2.png

4)此时可以看到我们的磁盘上的目录结构已经被 IDEA 自动创建出来了

2.png

5)同时我们也看到了, 在新创建的 Test.java 文件的最上方, 就出现了一个 package 语句

2.png


包的访问权限控制

我们已经了解了类中的 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编程开发包.


相关文章
|
3月前
|
安全 Java API
JAVA并发编程JUC包之CAS原理
在JDK 1.5之后,Java API引入了`java.util.concurrent`包(简称JUC包),提供了多种并发工具类,如原子类`AtomicXX`、线程池`Executors`、信号量`Semaphore`、阻塞队列等。这些工具类简化了并发编程的复杂度。原子类`Atomic`尤其重要,它提供了线程安全的变量更新方法,支持整型、长整型、布尔型、数组及对象属性的原子修改。结合`volatile`关键字,可以实现多线程环境下共享变量的安全修改。
|
4月前
|
安全 Java 调度
解锁Java并发编程高阶技能:深入剖析无锁CAS机制、揭秘魔法类Unsafe、精通原子包Atomic,打造高效并发应用
【8月更文挑战第4天】在Java并发编程中,无锁编程以高性能和低延迟应对高并发挑战。核心在于无锁CAS(Compare-And-Swap)机制,它基于硬件支持,确保原子性更新;Unsafe类提供底层内存操作,实现CAS;原子包java.util.concurrent.atomic封装了CAS操作,简化并发编程。通过`AtomicInteger`示例,展现了线程安全的自增操作,突显了这些技术在构建高效并发程序中的关键作用。
71 1
|
2月前
|
Java Apache Maven
Java/Spring项目的包开头为什么是com?
本文介绍了 Maven 项目的初始结构,并详细解释了 Java 包命名惯例中的域名反转规则。通过域名反转(如 `com.example`),可以确保包名的唯一性,避免命名冲突,提高代码的可读性和逻辑分层。文章还讨论了域名反转的好处,包括避免命名冲突、全球唯一性、提高代码可读性和逻辑分层。最后,作者提出了一个关于包名的问题,引发读者思考。
Java/Spring项目的包开头为什么是com?
|
6月前
|
druid Java Maven
杨校老师课堂之java_关于如何下载jar包的教程
杨校老师课堂之java_关于如何下载jar包的教程
120 0
|
3月前
|
Java API 数据处理
Java 包(package)的作用详解
在 Java 中,包(package)用于组织和管理类与接口,具有多项关键作用:1)系统化组织代码,便于理解和维护;2)提供命名空间,避免类名冲突;3)支持访问控制,如 public、protected、默认和 private,增强封装性;4)提升代码可维护性,实现模块化开发;5)简化导入机制,使代码更简洁;6)促进模块化编程,提高代码重用率;7)管理第三方库,避免命名冲突;8)支持 API 设计,便于功能调用;9)配合自动化构建工具,优化项目管理;10)促进团队协作,明确模块归属。合理运用包能显著提升代码质量和开发效率。
|
3月前
|
Java 数据安全/隐私保护
Java 包(package)的使用详解
Java中的包(`package`)用于组织类和接口,避免类名冲突并控制访问权限,提升代码的可维护性和可重用性。通过`package`关键字定义包,创建相应目录结构即可实现。包可通过`import`语句导入,支持导入具体类或整个包。Java提供多种访问权限修饰符(`public`、`protected`、`default`、`private`),以及丰富的标准库包(如`java.lang`、`java.util`等)。合理的包命名和使用对大型项目的开发至关重要。
|
4月前
|
Java Maven 数据库
|
4月前
|
JavaScript Java API
Java日志通关(二) - Slf4j+Logback 整合及排包
作者日常在与其他同学合作时,经常发现不合理的日志配置以及五花八门的日志记录方式,后续作者打算在团队内做一次Java日志的分享,本文是整理出的系列文章第二篇。
|
4月前
|
Java
Java应用结构规范问题之在biz层的convert包实现转换的问题如何解决
Java应用结构规范问题之在biz层的convert包实现转换的问题如何解决
|
4月前
|
Java
Java 基础语法-面试题(54-63道)(数组+类+包)
Java 基础语法-面试题(54-63道)(数组+类+包)
46 16