Java—包及访问权限

包是一个文件夹,它是类的一种特殊的性质,可以更合理地管理大量的类文件,设置他人对类成员的访问权等。

包的概念及使用

包的基本概念

在之前所编写的所有代码实际上都有一个问题,发现所有程序都直接保存在同一目录之中。但是,当一个大型程序由多个不同的组别或人员共同开发时,不可能保证每个人所写的类名称是完全不同的,这样一来就有可能出现同文件覆盖的问题。那么为了解决这样的麻烦确保程序可以正确运行,就必须通过使用package关键字来帮忙。所谓的包(package)指的就是一个文件夹,即在不同的文件夹之中可以保存同名的类文件。

包的使用方法:在类或接口的最上面一行加上package的声明。通常包全部用小写字母命名。

package的声明方法如下。
在这里插入图片描述
程序中如果有package语句,该语句一定是源文件中的第一条可执行语句,它的前面只能有注释或空行。另外,一个文件中最多只能有一条package语句。

经过package的声明之后,同一文件内的接口或类就都会被保存在相同的package中。

包的名字有层次关系,各层之间以点分隔。包层次必须与Java开发系统的文件系统结构相同。

若包声明如下:package java.awt.a,则文件中的接口和类都存放在…java\awt\a目录下。

package的使用(TestPackage1.java)
在这里插入图片描述
在这里插入图片描述
除了第1行加的package demo.java声明语句之外,其余的程序都是读者见过的。由于在第1行声明了一个demo.java的包,所以就相当于将Person类、TestPackage1类放入了…demo\java文件夹之下。

包的导入

使用包可以将功能相似的若干类保存在一个文件目录之中,但是这样一来就有可能出现包之间的互相访问问题,当一个程序需要其他包中类的时候可以通过import完成导入操作。package导入的方法如下。

在这里插入图片描述
若某个类需要被访问时,则必须把这个类公开出来,即此类必须声明成public。通过import命令,可将某个package内的整个类导入,后续程序可直接使用类名称,而不用再写上被访问的package的名称。

提示
若在不同的package中存在相同类名的public类,若要访问某个public类的成员时,在程序代码内必须明确地指明“被访问package的名称.类名称”。

下面用一个范例来说明import命令的用法。此范例与TestPackage1类似,只是将两个类分别放在了不同的包中,如下图所示。
在这里插入图片描述
Person类的声明(Person.java)。
在这里插入图片描述
第1行声明了一个demo.java.a的包,将Person类放入此包之中。

第4~7行在Person类中声明一个talk方法返回一串字符串。

包的导入使用范例1(TestPackage2.java)
在这里插入图片描述
在这里插入图片描述
第2行声明了一个demo.java.b包,将05行声明的TestPackage2类放入此包之中。

第3行使用import语句,将demo.java.a包中的Person类导入到此包之中。

第10行调用demo.java.a包中的Person类中的talk()方法。

提示
如果说一个项目之中有几百个类时,为了方便导入可以使用“包.”的形式完成。例如范例18-3可以使用import demo.java.a.进行导入。虽然现在使用的是“包.”,但实际上并不表示此包之中的所有类都会被导入,导入的时候也只是导入所需要的类,不需要的类是不会有任何加载的,所以分开导入和使用“”导入从性能上讲是完全一样的。

另外,上面的程序也可以写成如下的形式。

包的导入使用范例2(TestPackage3.java)。
在这里插入图片描述
可以看到,在程序中并没有使用import语句,但是在第7行使用Person类的时候使用了“包名.类名”的方式,所以在程序中也可以使用此方法来使用非本类所在的包中的类。

很多时候有可能在程序开发之中导入的包里面有同名的类,则这个时候再使用类的话就必须写上类的完整名称“包名.类名”才可以正确操作。

JDK中常见的包

SUN公司在JDK中为程序开发者提供了各种实用类,这些类按功能不同分别被放入了不同的包中,供开发者使用。下面简要介绍其中最常用的几个包。

  1. java.lang—包含一些Java语言的核心类,如String、Math、Integer、System和Thread,提供常用功能。在java.lang包中还有一个子包:java.lang.reflect,用于实现java类的反射机制。

(2) java.awt—包含构成抽象窗口工具集(abstract window toolkits)的多个类,这些类被用来构建和管理应用程序的图形用户界面(GUI)。

(3) avax.swing—此包用于建立图形用户界面,包中的组件相对于java.awt包而言是轻量级组件。

(4) java.applet—包含applet运行所需的一些类。

(5) java.net—包含执行与网络相关的操作的类。

(6) java.io—包含能提供多种输入/输出功能的类。

(7) java.util—包含一些实用工具类,如定义系统特性、与日期日历相关的方法。

导入一个Applet程序所需要的包(MyApplet.java)。
在这里插入图片描述
在这里插入图片描述
第2、3行导入实现小窗口应用程序的包。

第4行声明一个MyApplet类继承Applet类。

第8、9行分别调用Java中自带的方法在图形化窗口输出一行字和打印一条线段。

本例旨在使读者理解包的导入操作,具体的Applet相关的内容将在第24章详细介绍。在这里只做简单说明,Applet程序发现必须继承一个Applet类,Java是单继承局限,所以此程序肯定不会再用了。Applet程序和之前所编写的Application程序有一个最大的区别:Applet不是依靠主方法运行,而Application是依靠主方法运行的,Applet已经成为了一个过去。

类成员的访问控制权限

在Java中有4种访问控制权限,分别为private、default、protected、public。

  1. private访问控制符

在前面已经介绍了private访问控制符的作用,如果一个成员方法或成员变量名的前面使用了private访问控制符,那么这个成员只能在这个类的内部使用。

  1. default默认访问控制符

如果一个成员方法或成员变量名前面没有使用任何访问控制符,就称这个成员所拥有的是默认的(default)访问控制符。默认的访问控制成员可以被这个包中的其他类访问。如果一个子类与其父类位于不同的包中,子类也不能访问父类中的默认访问控制成员。

  1. protected访问控制符

如果一个成员方法或成员变量名前面使用了protected访问控制符,那么这个成员既可以被同一个包中的其他类访问,也可以被不同包中的子类访问。

  1. public访问控制符

如果一个成员方法或成员变量名前面使用了public访问控制符,那么这个成员可以被所有的类访问,不管访问类与被访问类是否在同一个包中。

最后,用下表来总结上述访问控制符的权限。
在这里插入图片描述
protected关键字的使用(Person.java)
在这里插入图片描述
第4行声明一个String类型的属性name,该变量用protected关键字声明,所以此属性只能在本类及其子类中使用。

类成员的访问控制权限使用范例1(Student.java)。
在这里插入图片描述
第2行通过导入demo.java.a.*而导入所需的Person类。

第3行Student类继承自Person类

第8行Student类访问Person类中的name属性。

类成员的访问控制权限使用范例2(TestPackage4.java)
在这里插入图片描述
在这里插入图片描述
第8行新建一个对象s。

第9行通过对象调用受保护的属性,所以程序在编译时JDK会报错。

Java的命名规范

大家通过查阅JDK文档,可以看到,JDK中类的声明、方法的声明、常量的声明等都是有一定规律的。

(1) 包名中的字母一律小写,如demo.java。

(2) 类名、接口名应当使用名词,每个单词的首字母大写,如TestPerson。

(3) 变量名(属性名)第1个单词小写,后面的每个单词首字母大写,如newLxh。

(4) 方法名的第1个单词小写,后面每个单词的首字母大写,如talkMySelf()。

(5) 常量名中的每个字母一律大写,如COUNTRY。

打包工具──Jar命令的使用

Jar文件即Java archive file的缩写,其应用与Java息息相关。Jar文件就是一种压缩文件,与常见的ZIP压缩文件格式兼容,习惯上称之为Jar包。如果开发者开发了许多类,当需要把这些类提供给用户使用时,通常都会将这些类压缩到一个Jar文件中,以Jar包的方式提供给用户使用。只要别人的classpath环境变量的设置中包含这个Jar文件,Java虚拟机就能自动在内存中解压这个Jar文件,把这个Jar文件当做一个目录,在这个Jar文件中去寻找所需要的类名及包名所对应的目录结构。

Jar命令是Java中提供的一个非常有用的命令,可以用来对大量的类(.class文件)进行压缩,然后存为.Jar文件。那么通过Jar命令所生成的.Jar压缩文件又有什么优点呢?一方面,可以方便管理大量的类文件,另一方面,进行了压缩也减少了文件所占的空间。对于用户来说,除了安装JDK之外什么也不需要做,因为SUN公司已经帮开发者做好了其他的一切工作。

在命令行窗口下运行jar.exe程序,就可以看到下图所示的界面。
在这里插入图片描述
如上图所示,从JDK的提示中可以看到,只要在命令行中使用以下命令就可以将一个包打成一个jar文件。

在这里插入图片描述
-c:创建新的存档。

-v:生成详细输出到标准输出上。

-f:指定存档文件名。

create.jar:是生成jar文件的名称。demo:要打成jar文件的包。

demo:要打成jar文件的包。

构造方法私有化—单例设计模式(Singleton)

在讲解本操作之前,首先来看一下下面的两段代码。

自动生成的构造方法的类(Singleton.java)
在这里插入图片描述
第1行声明了一个demo.java.b包,将Singleton类放入此包之中。

第4行在Singleton类中声明了一个Print方法,输出问候信息。

实际上现在在Singleton类之中是存在构造方法的,并且这个构造方法是无参的,什么都不做的,自动生成的构造方法,并且可以在主类中对其进行实例化。

实例化对象(TestInstance.java)
在这里插入图片描述
在这里插入图片描述
现在将代码Singleton.java变换一下,将构造方法明确定义,但是权限变为private。
在这里插入图片描述
那么现在重新运行【范例 TestInstance.java】则将出现错误:构造方法Singleton()被声明为private类型则只能在类内部访问。
在这里插入图片描述
那么请问,在不修改Singleton类的构造方法以及print()方法的前提条件下,Singleton类之中应该增加什么样的操作,才可以让主类得到Singleton类实例化对象,并且调用print()方法输出呢?

现在所有的问题都在于构造方法上使用了private进行定义,private的访问特点:只能够在本类中使用,所以现在可以尝试着在类中实例化属于自己的对象。

实例化属于自己的对象(TestSingleton.java)。
在这里插入图片描述
在这里插入图片描述
第1行声明了一个demo.java.d包将此类放置于该目录下。

第2~9行声明了一个Singleton类。第3行实例化一个对象。

第5行声明一个私有的构造方法。

第14行声明一个空的对象,第15行对该对象进行实例化。

类之中的所有属性只有在调用构造方法实例化对象之后才会分配空间,那么现在外部无法调用Singleton类的构造方法,所以依靠外部是不可能的,那么就必须从内部的instance定义上想办法,有没有一种方法可以让Singleton在没有实例化对象的时候就去操作instance呢?自然可以想到使用static定义。

可是针对于类之中所有定义的属性都会有一个明确的要求,必须使用private封装,那么一旦封装之后,如果此时还希望可以在没有实例化对象的时候取得instance属性,就必须利用static方法返回。

单例设计模式(TestSingleton01.java)。
在这里插入图片描述
在这里插入图片描述
如果要想产生类的实例化对象,那么一定要调用构造方法,如果把一个类的构造方法卡死了,那么就表示外部无法调用此构造,就意味着外部无法产生实例化对象。

同时在类内部定义的本类实例化对象使用的是static定义,static的特点是在全局数据区之中保存,是一个公共属性,那么这样一来,不管在外部声明了多少个对象,那么实际上只是取得了唯一的一个实例化对象,所以这样的设计在设计模式上讲称为单例设计模式。

提示
但是以上的代码编写实际上也存在一个问题,既然现在希望表示只有唯一的一个实例化对象,那么为了避免内部的对象会被重复实例化,所以最好加上一个关键字final定义。

多例设计模式

单例设计模式是只能够存在一个实例化对象,而多例设计模式指的是一个类可以定义指定多个对象,但是不管是单例还是多例,构造方法都不可能使用public定义。

实际上对于多例设计能够体现在很多的方面,例如:现在要定义一个表示一周时间数的类,那么这个类只能够有七个对象。如果定义一个表示性别的类,那么这个类只能有两个对象。例如表示颜色基色的类只有三个对象,这些都属于多例设计模式。下面看一个多例设计的例子。

多例设计(TestMultiton.java)。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1. 现在学习了四种访问权限之后,实际上就意味着封装性需要通过三个权限来实现:private、default、protected。但是面对个人开发,常用的权限就只有两个。

(1) 只要是定义属性不用思考直接写上private;

(2) 只要是定义方法不用思考直接写上public。

2. 什么是设计模式?

在进行程序设计时,逐渐形成的一些典型问题和问题的解决方案,这就是软件模式;每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案;当我们遇到模式所描述的问题,就可以直接用相应的解决方法去解决这个问题,这就是设计模式。

设计模式就是抽象出来的东西,它不是学出来的,是用出来的;或许你根本不知道任何模式,不考虑任何模式,却写着最优秀的代码,即使以“模式专家”的角度来看,都是最佳的设计,不得不说是“最佳的模式实践”,这是因为你积累了很多的实践经验,知道“在什么场合代码应该怎么写”,这本身就是设计模式。

3. 多例设计模式的特点如下。

(1) 多例类可以有多个实例。

(2) 多例类必须能够自我创建并管理自己的实例,并向外界提供自己的实例。

(3) 根据是否有实例上限分为:有上限多例类和无上限多例类。

Java—异常的捕获与处理

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值