目录
前言:
包的概念一开始对初学者而言很容易搞晕,导致程序编译频繁报错,究其原因还是对包的定义与使用理解得不够深刻,本文针对以上问题进行解答与总结。
一、包的概念
包(package)是一个命名空间(namespace),它是一种松散的具有相似功能的类与接口的集合。在Java中,包以目录的形式存在,是Java中管理类与接口的有效机制。同一个包中的类在默认情况下可以相互访问,称之为包访问性。
二、包的定义
在默认情况下,系统创建一个无名包,而无名包中的类不能被其它包中的类所引用与复用,为此需要创建有名字的包。Java有一个语言约定习惯:包名全部采用小写字母
(1)语法
package 包名;
例如:package school;//定义该类属于包school
package school.test;//定义该类属于包school下的子包test中
(2)命名规则
只能包含数字、字母、下划线、小圆点,但是不能以数字开头,不能包含关键字与保留字
(3)命名规范
一般是小写字母加小圆点组成
com.公司名.项目名.业务模块
三、包的引用
(1)加载需要使用的类
格式 :import 包名.类名;
例如:import java.util.Scanner;//使用Java util包下的Scanner类
适用:所需包中的类较少时,直接加载所需类
(2)加载整个包
格式 :import 包名.*;
其中,通配符“ * ”指代该包中根目录下的所有类,但不包含其子目录里的类
例如 :import java.util.*;//加载Java util包下的所有类
适用:当所需包中的类很多时,直接加载整个包里的类
(3)直接使用包名、类名作为前缀
格式: 包名.类名
这种方式无需用import语句提前加载包,使用同一个包中的类,无需加上包名作为前缀;若使用其他包中的类,则需要加上包名作为类名的前缀
(4)常用包
java.lang包:它是Java语言的核心类库,包含了运行Java程序必不可少的系统类,该包系统会自动加载无需用import语句导入
java.io包:它是Java语言的标准输入与输出的类库,包含了实现Java程序与操作系统、用户界面以及其他Java程序做数据交换所使用的类
java.util包:它包含了Java语言中的一些低级的实用工具,如如何处理时间的Date类、处理动态数组的Vector类、栈Stack类、散列表HashTable类等等
四、ClassPath 类路径
classpath 是系统环境变量,作用是指明所有缺省的类字节码文件(.class文件)的路径,当编辑器编译时找不到所需要的类的.class文件时,系统则自动转到classpath所指明的路径中去寻找。
可以通过右击:计算机---->属性---->高级系统设置---->环境变量---->新建(若已存在,编辑即可)---->添加变量值(即Java文件的路径)---->最后加上英文分号和英文小圆点 ;.
分号“ ; ”用于分隔其它目录,小圆点“ . ”表示当前的目录,如下图:
五、包的应用举例
编写一个银行卡类,其中有用户ID,用户名,用户余额三个属性,有构造方法和相应的toString方法,再编写其一个子类中国工商银行卡类,包含计算利息与存款两个最基本的方法;定义一个接口里面包含一个计算利息的抽象方法,再定义一个异常类,对用户所输入的存款额度进行监测
(1)不使用包,将类全部写在一起
//测试类
public class TestGoldICBCBankCard{
public static void main(String args[]){
GoldICBCBankCard c=new GoldICBCBankCard("3209212001","小顾");
System.out.println(c);
System.out.println("测试存款功能depositNew(-500):");
try{
c.depositNew(-500);
}
catch(Exception e){
System.out.println(e);
}
System.out.println(c);
System.out.println("测试存款功能depositNew(500):");
try{
c.depositNew(500);
}
catch(Exception e){
System.out.println(e);
}
System.out.println(c);
System.out.println("测试计算利息功能intrestCounting(“20220325”,1):");
c.intrestCounting("20220325",1);
System.out.println(c);
}
}
//父类
class ICBCBankCard{
protected String ID;
protected String name;
protected double balance;//卡上余额
public ICBCBankCard(String uid,String uname,double balance){
ID=uid;
name=uname;
this.balance=balance;
}
//父类带两个参数的构造方法
public ICBCBankCard(String uid,String uname){
ID=uid;
name=uname;
}
public String toString(){
return "用户ID:"+ID+" 用户名:"+name+" 卡上余额:"+balance+"元";
}
}
//子类
class GoldICBCBankCard extends ICBCBankCard implements InterestCounter
{
public GoldICBCBankCard(String uid,String uname) //工商银行开户(办卡)
{
super(uid,uname); //直接调用父类带2个参数的构造方法
}
public void intrestCounting (String indate, int years) //实现接口中“计算利息”的抽象方法
{
balance=balance+balance*0.035*years;
}
public void depositNew(double money) throws MoneyException
{
if(money<0)
throw new MoneyException("对不起,钱款不能为负数,请您重新输入!"); //抛出一个MoneyException异常对象
this.balance += money;
}
}
//接口
interface InterestCounter //定义接口
{
public abstract void intrestCounting (String indate, int years); //“计算利息”
}
//异常
class MoneyException extends Exception//定义异常
{
public MoneyException(String str)
{
super(str);
}
}
(2)使用包进行类管理
代码还是上面的代码,只是将不同功能的类放到不同的包中进行管理,需要使用的话,调用即可
classpath环境变量需要设置如下,否则将报错,无法找到xxx类!
变量值设置到Java源文件所在子文件夹的上一层目录即可,最后别忘了加上 ;.
(3)总结
方法一不使用包将所有的类文件全部写在一起,这倒是有点像C语言面向过程的程序设计风格了,从main开始往下,自顶向下,逐步细化。但是缺点也很明显,其组织结构性很差,不适合企业级软件开发。Java中的类机制就很巧妙地解决了这个问题,使类的结构、层次、关系一目了然,当出现bug时只需要到对应的包中去修改即可而不必像C语言那样“ 牵一发而动全身 ”!
相反, 方法二用包进行类管理可以使得类的结构成体系化,功能相似的类或者接口放在同一个包中,需要时使用import语句导入类即可。所以简单来说,包的本质就是创建不同的文件夹/目录来保存类文件。
=========================================================================
如果觉得我写的还可以能给你带来一点收获的话
点赞加关注,谢谢了您嘞