包及访问控制权限
访问控制专注于类库的创建者和该类库的外部使用者之间的关系。控制成员的访问权限有两个原因:
第一:为了使用户不要碰到他们不该碰触的部分,这部分对于类内部的操作时必要的,但是它并不属于客户端程序员所需接口的一部分。
第二:为了让类库工作者可以更改类的内部工作方式,而不必担心这样会对(已经使用该类库的)客户端程序员产生重大的影响。即访问权限控制可以确保不会有任何的客户端程序员依赖于某个类的底层实现的任何部分。
一、包的定义及使用
1.1、包的定义
在同一个文件夹中是不可能同时存在同一个*.class文件的,但是在不同的文件夹之中就可以存在,所以所谓的包实际上就属于一个文件夹,如果要定义一个包,可以使用package关键字完成。
package org.wsz.demo; public class Hello { public static void main(String args[]) { System.out.println("HelloWorld!!!"); } };
此时通过package定义了一个包,所以现在一个类的完整名称是“包.类”名称。
一旦程序中定义完了一个包之后就可以通过以下的命令进行编译:javac -d . Hello.java
·-d:表示将根据package的定义生成文件夹
·.:表示在当前所在的文件夹之中生成*.class
但是,访问的时候必须连包一起访问:java org.wsz.demo.Hello
1.2、包的导入
如果现在需要导入不同包的类的话,可以使用import语句。
import 包.类 ;
import org.demo.* ; //导入所需要的类
使用*的导入与具体类的导入在性能上是完全一样的,因为即使使用了*,也会根据自己的需要加载所需要的类,不需要的类根本就不会被导入。
如果现在同时导入了不同包的同名类的话呢?那么在这种情况下,只能通过完整的“包.类”的方式进行对象的实例化。
package org.demob; import org.demoa.*; //导入所需要的类 import org.democ.*; //导入所需要的类 public class Hello { public static void main(String args[]) { org.demoa.Info info = new org.demoa.Info(); info.print(); } };
1.3、JDK 1.5新特性——静态导入
在JDK1.5之后,如果一个类中的全部方法都是静态方法的话,则可以使用静态的导入方式,直接将方法导入进来。
package org.wsz.demo; public class MyMath { public static int add(int x, int y) { return x + y; } public static int sub(int x, int y) { return x - y; } };
在最早的做法中,是将MyMath的类导入,所以语法如下:
import org.wsz.demo.*; //导入所需要的类 public class MyMathDemo { public static void main(String args[]) { System.out.println(MyMath.add(10, 20)); } };
但是,如果现在使用的是静态导入:
package org.hello; import static org.wsz.demo.MyMath.*; //静态导入所需要的方法 public class MyMathDemo { public static void main(String args[]) { System.out.println(add(10, 20)); } };
1.4、系统的常用包
在Java语言中为开发者准备了各种各样的开发包,常见的包有以下几种:
·java.lang:是一个基础的开发包,里面包含了一些常用类:String、Integer、Exception、Object
·java.lang.reflect:是反射操作包
·java.util:为开发的工具包
·java.io:完成IO操作的开发包
·java.sql:完成数据库的开发包
·java.text:格式化的开发包
·java.applet:Applet程序的实现包
·java.awt、javax.swing:图形界面的开发包
1.5、JAR命令
在实际的开发中,如果一个开发人员已经开发出了许多的类,这个时候如果要交付给客户使用的话,则一个个独立的*.class文件会太多,维护起来也不方便,所以一般都会将其进行压缩,在java中就依靠jar进行压缩。
package org.democ; public class Info { public void getHello() { System.out.println("Hello"); } };
D:\testjava>jar -cvf my.jar org
added manifest
adding: org/(in= 0) (out= 0)(stored 0%)
adding:org/democ/(in = 0) (out= 0)(stored 0%)
adding:org/democ/Info.class(in = 396) (out= 280)(deflated 29%)
将jar添加classpath中
二、访问控制权限
在Java中一共规定出了四种访问控制权限:
对于private、default(缺省时候为包访问权限)、public、protected权限。
No. |
位置 |
private |
default |
protected |
public |
1 |
本类 |
√ |
√ |
√ |
√ |
2 |
本包中的其他类 |
× |
√ |
√ |
√ |
3 |
不同包的子类 |
× |
× |
√ |
√ |
4 |
不同包的非子类 |
× |
× |
× |
√ |
范例:定义父类
package org.demoa; public class A { protected String name = "Hello World!!!"; };
范例:定义不同包的子类
package org.demob; import org.demoa.*; public class B extends A { public void print() { System.out.println(super.name); // 访问protected属性 } };
之后通过程序进行测试。
package org.democ; import org.demob.*; public class C { public static void main(String args[]) { new B().print(); } };
三、类的访问权限
1、每个文件都只能有一个public类,(≤1个)
2、Public类的名称必须和文件名相匹配,包括大小写。
3、一个编译单元不包含public类也是可能的,在这种情况下,可以随意命名。
下面的类任意命名(比如Test.java),编译产生的类文件名还是Mug.class
class Mug { public static void main(String[] args) { System.out.println("没有public修饰的类"); } }
类的访问权限只有两个选择:缺省(包访问权限)或者Public,(内部类除外)。
如果一个类为包访问权限,它对别的包中的类不可见。
package org.demoa; class A { };
别的包中的类想使用它,报The type A is not visible错误
package org.democ; import org.demoa.A; // 此行编译错误,The type A is not visible错误 public class C { };
四、命名规范
在进行Java开发的时候一定要遵守以下的命名规范要求:
1、 定义类名称的时候,每个单词的首字母大写:HelloInfo
2、 定义方法名称的时候,第一个单词的首字母小写,之后每个单词的首字母大写:printInfo(),驼峰命名法
3、 定义属性的时候,第一个单词的首字母小写,之后每个单词的首字母大写:empName
4、 定义常量的时候,所有的单词字母都要大写:INFO
5、 定义包名称的时候,所有的单词的字母都要小写:org.demo