Java类管理机制——包的详解

目录

 

前言:

一、包的概念

二、包的定义

(1)语法

(2)命名规则

(3)命名规范

三、包的引用

(1)加载需要使用的类

(2)加载整个包

(3)直接使用包名、类名作为前缀

(4)常用包

四、ClassPath 类路径

 五、包的应用举例

(1)不使用包,将类全部写在一起

(2)使用包进行类管理

(3)总结


 

前言:

包的概念一开始对初学者而言很容易搞晕,导致程序编译频繁报错,究其原因还是对包的定义与使用理解得不够深刻,本文针对以上问题进行解答与总结。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQXJpY2wu,size_20,color_FFFFFF,t_70,g_se,x_16

一、包的概念

包(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文件的路径)---->最后加上英文分号和英文小圆点 ;. 

分号“ ; ”用于分隔其它目录,小圆点“ . ”表示当前的目录,如下图:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQXJpY2wu,size_20,color_FFFFFF,t_70,g_se,x_16

 五、包的应用举例

        编写一个银行卡类,其中有用户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);
		}
}

 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQXJpY2wu,size_20,color_FFFFFF,t_70,g_se,x_16

 

(2)使用包进行类管理

代码还是上面的代码,只是将不同功能的类放到不同的包中进行管理,需要使用的话,调用即可

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQXJpY2wu,size_20,color_FFFFFF,t_70,g_se,x_16

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQXJpY2wu,size_20,color_FFFFFF,t_70,g_se,x_16

 classpath环境变量需要设置如下,否则将报错,无法找到xxx类!

变量值设置到Java源文件所在子文件夹的上一层目录即可,最后别忘了加上 ;. 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQXJpY2wu,size_20,color_FFFFFF,t_70,g_se,x_16

(3)总结

     方法一不使用包将所有的类文件全部写在一起,这倒是有点像C语言面向过程的程序设计风格了,从main开始往下,自顶向下,逐步细化。但是缺点也很明显,其组织结构性很差,不适合企业级软件开发。Java中的类机制就很巧妙地解决了这个问题,使类的结构、层次、关系一目了然,当出现bug时只需要到对应的包中去修改即可而不必像C语言那样“ 牵一发而动全身 ”!

    相反,  方法二用包进行类管理可以使得类的结构成体系化,功能相似的类或者接口放在同一个包中,需要时使用import语句导入类即可。所以简单来说,包的本质就是创建不同的文件夹/目录来保存类文件。

 

=========================================================================

如果觉得我写的还可以能给你带来一点收获的话

点赞加关注,谢谢了您嘞

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQXJpY2wu,size_19,color_FFFFFF,t_70,g_se,x_16

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

顾老师不懂代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值