如何把变动的事物与保持不变的事物区分开来,也就是在前端程序员(通过将各个类库中的类、方法组合在一起完成一些项目的开发者)与后端程序员(类库的开发者)之间划清一道界限,需要一定的访问控制机制来完成。而访问权限的控制常被称为具有实现的隐藏。把数据和方法包装进类中,以及具有实现的隐藏,常共同被称为封装。而被封装形成的其实就是一个拥有特征和行为的数据类型。在Java中主要的访问控制主要通过包机制、权限修饰符来实现的。
一、Java的包控制机制
1.背景
为了防止类冲突,Java提出将具有相同作用或意义的一个或多个类装进包中(关键字package),一是便于管理这些类,二是对于具有相同名字的类进行区分以防止冲突。
2.包需注意的几点
每个编译单元(也就是一个类文件),只能有一个对外包可见的public类(公共类),如果出现多个编译时会报错,如果需要其他的类进行对主类的功能辅助,则不能使用pubic进行修饰。虽然一个.java文件中可以有多个类,但是通过Java编译器生成的.class文件却有多个,即每一个类都会生成一个由类名命名的.class文件。
- 包的创建:包在每个编译单元中(Java文件)都应该放在最顶端,表示此文件是由这个包进行管理的,如需访问包中的可访问内容需通过此包名的引荐才可以做到。为保证包名的冲突和辨认,包一般采用全小写字母的反向域名+【name】进行表示(因为每个项目所申请的域名一定是唯一的,这样可以保证包的独一性),但是如果没有域名也可以采用多字段组合来表示包名,但是一定要用尽可能不重复的名字。
如:com.practicepackage.util 或 name.sex.phone.hfdy.util
package com.practicepackage.util; public class TestPackage{ }
- 包的使用:通过包进行类的访问有俩种方式——
一是,通过包名直接调用:(此种方法冗余)
com.practicepackage.util.TestPackage t = new com.practicepackage.util.TestPackage();
二是,通过import关键字进行引入:(此种方法使用灵活,建议使用)
import com.practicepackage.util.TestPackage; class Test{ public void usePackage(){ TestPackage t=new TestPackage(); } }
包在创建时,实际已经给定了编译器指定的目录结构用以寻找.java文件和存放.class文件。
二、Java的访问修饰符
就像之前所说的,Java的访问修饰符有三种,按照访问域范围的大小,分别是:public、protected、private,但是Java为了防止程序员在编写程序时忘记书写访问修饰符所以提供了一种默认的访问权限,也称为包访问权限,就如其名字一样,包访问权限修饰的只能被同一个包内的类访问,接下来分别介绍这四种访问权限(按由大到小的限制域范围)。
- public:就如此单词的意思一样,用此修饰符修饰的无论是类、方法还是成员变量对于真个项目来说是公共资源,任何类都可以这些资源进行访问。所以如果你希望前端程序员可以任意使用和改变这些资源,此修饰符将是最佳的选择。
- protected:被此修饰符修饰的资源首先可以被拥有继承关系的类进行访问,也就是说如果在A包中有一个类Aclass中有一个方法 “protected f(){}”,此时有另一个B包中的类Bclass想要访问f()方法,要想访问成功必须做的动作就是在俩个类间建立继承关系,即“Bclass extends Aclass”。其实protected也提供了包访问权限,也就是说同一个包下或者不同包下的子类都可以访问父类中protected修饰的资源。
- 默认包访问权限:只有同一包内的类才能对拥有默认访问权限的资源进行访问。
- private:此修饰词正因为其访问域非常小,使得其在实际开发中显得尤为重要,为系统的稳定性和安全性提供了保障。因为有很大一部分资源应该对客户端程序员是隐藏的,这样对于后续的jar包(类库)升级有很大帮助,因为即使修改了一些private的资源,对客户端程序员来说也不会影响很大,同样对使用此jar包开发的项目来说也不会有致命影响。
此外需要注意的一点是,在日常开发中,类是不可以使用private和protected进行修饰的,而只能使用public和默认访问权限,如果不希望其他类对该类有访问权限,可以将此类的构造器设置为private,此时可以通过俩种方式对此类进行实例化,一是,可以通过在此类中创建static修饰的方法中进行类的实例化,然后外部类通过static修饰的这个方法获取实例;二是,可以通过单例模式,实现如下:
public class Test{ private Test(){} //方式一获取类实例 public static Test useTest(){ return new Test(); } //方式二——单例模式(此种方式只能创建一个对象,因为test是私有的公共资源) private static Test test=new Test(); public static Test makeTest(){ return test; } }
( 还要注意的一点,也是一个小小的编程技巧是:在编写一个类时,无论是成员变量还是方法最好按照权限域由大到小的顺序进行编写,因为public修饰的基本上是对外的接口,也就是前端开发人员最关心的,这样的编写方式具有很好的可读性。)
以上四种访问修饰各有其特点,在实际开发中都有着非常重要的作用,要想开发出优秀的软件项目,程序员要细细斟酌哪些资源需要使用哪些访问权限。所以我们要养成良好的编程习惯,切不可一路public。