JAVA package简要了解

(非原创,仅供自己学习使用,哪里不对请指正,谢谢)

一、package简单概述,及作用

概述

为了更好地组织类,Java提供了包机制。包是类的容器,用于分隔类名空间。如果没有指定包名,所有的示例都属于一个默认的无名包。
Java中的包一般均包含相关的类,例如,所有关于交通工具的类都可以放到名为Transportation的包中。
程序中如果有package语句,该语句一定是源文件中的第一条可执行语句,它的前面只能有注释或空行。另外,一个文件中最多只能有一条package语句。
包的名字有层次关系,各层之间以点分隔。包层次必须与Java开发系统的文件系统结构相同。通常包名中全部用小写字母。(包的名字就是其所在目录的名字,包名字里面的“ . ”表示的是文件夹的层次,“ . ”后面的名字表示的是前面包下的另一个包。)
如果文件声明如下:package java.awt.image则此文件必须存放在Windows的java\awt\image目录下或unix的java/awt/image目录下。

包的作用

一是开发中避免类名重复问题;(如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,
不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。)
二是对代码整理归类,把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。
三是限定访问权限(default就是包访问权限),拥有包访问权限的类才能访问某个包中的类。

二、使用包

包的语法格式:package pkg1[.pkg2[.pkg3…]];
例:例如,一个Something.java 文件它的内容

package net.java.util;
public class Something{
...
}

那么它的路径应该是 net/java/util/Something.java 这样保存的。 package(包) 的作用是把不同的 java 程序分类保存,更方便的被其他 java 程序调用。

同个包的类之间访问比较简单,在代码中直接以类名使用;
而不同包之间的访问则必须满足一个条件:一个类如果希望被其他包中的类访问, 那么必须加上public修饰(注意:用public修饰的类必须和文件名同名)。不同包之间的使用通常有以下3种方法:(1)使用全名访问类;(2)import 该类;(3)import 包含该类的整个包

命名规范

(转载于他处)
Java的包名都由小写单词组成,类名首字母大写;包的路径符合所开发的 系统模块的 定义,比如生产对生产,物资对物资,基础类对基础类。
以便看了包名就明白是哪个模块,从而直接到对应包里找相应的实现。
由于Java面向对象的特性,每名Java开发人员都可以编写属于自己的Java Package,为了保障每个Java Package命名的唯一性,
在最新的Java编程规范中,要求开发人员在自己定义的包名前加上唯一的前缀。由于互联网上的域名称是不会重复的,
所以多数开发人员采用自己公司在互联网上的域名称作为自己程序包的唯一前缀。例如: com.sun.swt.……。
从而,我们知道,一般公司命名为“com.公司名.项目名.模块名…”
那,我们个人的项目又怎么命名呢?
经过我对“个人的”单词搜索,有“individual(个体)、personal(个人私人)private(私人)、one-man”,进一步对以上4个单词词意的分析,并在保证了唯一性,使用每个单词的前4个字母作为前缀,正好和“com”也做了区分。如下:

indi : 
个体项目,指个人发起,但非自己独自完成的项目,可公开或私有项目,copyright主要属于发起者。 
包名为“indi.发起者名.项目名.模块名.……”。 
pers : 
个人项目,指个人发起,独自完成,可分享的项目,copyright主要属于个人。 
包名为“pers.个人名.项目名.模块名.……”。 
priv : 
私有项目,指个人发起,独自完成,非公开的私人使用的项目,copyright属于个人。 
包名为“priv.个人名.项目名.模块名.……”。 
onem : 
与“indi”相同,推荐使用“indi”。 
team : 
团队项目,指由团队发起,并由该团队开发的项目,copyright属于该团队所有。 
包名为“team.团队名.项目名.模块名.……”。 
com : 
公司项目,copyright由项目发起的公司所有。 
包名为“com.公司名.项目名.模块名.……”

包的成员

一些相关联的类、接口、枚举、注释类型、包中的类所用到的资源文件如图片等

包的声明使用

1.定义包
在源代码的第一行使用package关键字定义包. 包名通常全部小写, 用"."分隔.
2.编译带包的类
javac -d 目录 源文件名.java
3.运行带包的类
java 包名.类名
4.使用带包的类
在代码中直接以类名使用, 是访问同一个包中的类.如果需要访问不同包中的类, 需要使用全限定名(包名.类名)一个类如果希望被其他包中的类访问, 那么必须加上public修饰. 用public修饰的类必须和文件名同名.

包的访问

在访问类时,为了能够找到该类,必须使用含有包名的类全名(包名.类名) 包名.包名….类名
如: java.util.Scanner
java.util.Random
com.baidu.Demo
带有包的类,创建对象格式:包名.类名 变量名 = new包名.类名();
com.baidu.Demo d = new com.baidu.Demo();
前提:包的访问与访问权限密切相关,这里以一般情况来说,即类用public修饰的情况

访问权限

Java中有四种访问权限,private、default(一般省略)、public、protected

1,private: Java语言中对访问权限限制的最窄的修饰符,一般称之为“私有的”。被其修饰的属性以及方法只能被该类的对象访问,其子类不能访问,更不能允许跨包访问。
2,default:即不加任何访问修饰符,通常称为“默认访问权限“或者“包访问权限”。该模式下,只允许在同一个包中进行访问。
3,protected: 介于public 和 private 之间的一种访问修饰符,一般称之为“保护访问权限”。被其修饰的属性以及方法只能被类本身的方法及子类访问,即使子类在不同的包中也可以访问。(这种权限是为继承而设计的)
4,public: Java语言中访问限制最宽的修饰符,一般称之为“公共的”。被其修饰的类、属性以及方法不仅可以跨类访问,而且允许跨包访问。

这里需要注意的是,所谓的访问,可以分为两种不同方式:第一,通过对象实例访问;第二,直接访问。 比如说,某父类protected权限的成员,子类是可以直接访问的,换一种说话是子类其实继承了父类的除了private成员外的所有成员,包括protected成员,所以与其说是子类访问了父类的protected成员,不如说子类访问了自己的从父类继承来的protected成员。另一方面,如果该子类与父类不在同一个包里,那么通过父类的对象实例是不能访问父类的protected成员的。
在这里插入图片描述
有包的类和无包的类互相访问有以下规则:
(1)无包的类可以访问有包的类, 直接导入即可;
(2)有包的类无法访问无包的类, 直接访问是找同一个包中的, 由于不同包需要导入, 而无包的类无法导入;
(3)在定义类的时候, 为了让别人都能使用到, 所以一定要定义一个包。

(管理文件系统 )

许多Java平台的实现依赖于文件系统的等级制度 来管理源文件class文件。我们一般把类、接口、枚举、注释类型放在可以反映包名的目录中,比如,Rectangle.java属于graphics类,我们就放在…\graphics\Rectangle.java的路径上。同样,我们对其进行编译产生的class文件也要放在类似的目录上(这个目录最好不要和源文件放在一起),这样的好处是当我们要复用某个类时,就知道到哪去找了,JVM在运行程序时也知道去哪里找类。
比如,源文件放在:<path_one>\sources\com\example\graphics\Rectangle.java
class文件放在:<path_two>\classes\com\example\graphics\Rectangle.class,其中,<path_two>\classes是类路径(class path),由CLASSPATH系统变量进行设置,而包名是com.example.graphics。编译器、JVM通过将包名称添加到类路径来构造.class文件的路径。
所以编译器、JVM在路径<path_two>\classes\com\example\graphics中查找类文件。class path可以有好几条,由分号(Windows)或冒号(UNIX)分隔。 默认情况下,编译器、JVM搜索当前目录和包含Java平台类的JAR文件,所以这些目录自动位于类路径中。
CLASSPATH是JVM或Java编译器中的一个参数,它指定用户定义的类和包的位置。 可以在命令行上或通过环境变量设置。默认情况下,我们访问JDK标准API和扩展包时,无需设置查找位置。 而用户自定义的包和库,则必须设置。由于JVM会在当前目录下搜索,所以当我们的文件都在运行目录下时,也可以不设置CLASSPATH。

包的导入

Java自动导入两个包java.lang和现在文件的缺省包(即当前包)

import语句

1,类的导入格式:
(如果在一个类中导入一个包中多个类时,一个个地导入会比较麻烦,可以使用导入“*” 的方式由 JVM 根据需要自己加载的类。)

import 包名称.子包名称.类名称;   ---> 手工导入所需的类
import 包名称.子包名称.*;   ---> 由 JVM 自动加载所需的类

2,一个类要被外包访问,则此类一定要定义成 public class 。

如果一个类声明为 public class,则文件名称必须与类名称一致,而且在一个类文件中只能有一个 public class,
而如果使用 class 声明一个类,则文件名称可以与类名称不一致,但是在执行的时候必须执行生成的 class 文件名称。
除了这些外,public class 和 class 还在包的访问上有所限制,如果一个类只在本包中访问,不需要被外包访问,则直接声明成 class 即可;而如果一个类要被外包访问,则必须声明为 public class 。
3,如果一个程序中同时导入了两个包的同名类,在使用时就必须明确地写出完整的 “包.类名称”。
关于import的注意事项
1,首先是,Java的包表面上的等级问题。从路径上看,包似乎是分层的,但它们不是。 例如,Java API包括java.awt包,java.awt.color包,java.awt.font包等等。但是,java.awt.color包、java.awt.font包和其他java.awt.xxxx包并不属于java.awt。 前缀java.awt(The Java abstract window toolkit)的作用只是告诉开发者——和窗口有关的包都在这里面。但是包和包之间并不是包含关系。

import java.awt.*;
import java.awt.color.*;

当你导入java.awt.时,会导入java.awt包中的所有类型,但它不会导入java.awt.color,java.awt.font或任何其他java.awt.xxxx包的所有类型。 如果你要使用java.awt.color中的类以及java.awt中的类,则必须同时导入这两个包。
2,其次是名字含糊不清的问题。当你导入的两个包中有一个类名字相同时,如果你继续采用缩写,就会出现一些问题。这时,你就要使用这个类的全名。比如,java.util、java.sql包中都有Date类,程序又同时导入了这两个包中的Date类。
3,(Java中有两种包的导入机制,总结如下:
单类型导入(single-type-import), 例如 import java.io.File;
按需类型导入(type-import-on-demand),例如 import java.io.
;)不推荐使用按需类型。

静态导入

在 JDK1.5 之后提供了静态导入的功能。如果一个类中的方法全部是使用 static 声明的静态方法,则在导入的时候就可以直接使用 “import static” 的方式导入,导入格式如下:

 import static.类名称.*;

在这里插入图片描述

由于程序中使用了静态导入,所以Demo1 类中的所有静态方法可以直接在 Test 类中使用,而 不需要使用 “类.静态方法()” 的形式使用。

JAVA常见包

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值