本章目标:
- 掌握包的定义及作用
- 掌握java新特性 -- 静态导入
- 了解java中的常用系统包
- 掌握jar命令的作用
- 掌握java中的4种访问权限
- 掌握java语言的命名规范
索引
8.1 包的基本概念
8.2 jar命令的使用
8.3 访问权限控制
8.4 java命名规范
8.5 本章要点
8.6 习题
8.1 包的基本概念
8.1.1 包的基本概念
package关键字来避免出现类名称相同的情况。package是在使用多个类或接口时,为了避免名称重复而采用的一种措施,直接在程序中加入package关键字即可。格式如下
package 包名称.子包名称;
打包程序
package org.forfan06.demo08; //定义一个包
class Demo{ //定义Demo类
public String getInfo(){
return "Hello World!!!";
}
}
public class PackageDemo01{
public static void main(String args[]){
System.out.println(new Demo().getInfo()); //实例化本包对象
}
}
因为以上程序是在包中,所以此时完整的类名称应该为“包名称.类名称”,即“org.forfan06.demo08.PackageDemo01”
此时编译该段代码也不能像之前那样直接 javac 类名称.java。。必须加上若干参数才行,编译语法如下:
javac -d . PackageDemo01.java
在以上的编译命令中加入了一下两个参数
- -d: 表示生成目录,生成的目录以package的定义为准。
- . 表示在当前所在的文件夹中生成。
编译完成之后可以发现,程序会自动为程序进行打包操作。 会自动生成相应的文件夹(包),之后再执行类时就必须输入完整的“包.类名称”,执行语法如下:
java org.forfan06.demo08.PackageDemo01 //正常运行
java PackageDemo01 //此时会报错
8.1.2 import语句
如果几个类存放在不同的包中,则在使用类时就必须通过import语句导入。 格式如下
import package.subPackage.class; //手工导入所需要的类
import package.subPackage.*; //由JVM自动加载所需要的类
以上两种格式本身没什么区别。 一般都使用后者。
实例:
package org.forfan06.demo08.a;
class Demo{
public String getInfo(){
return "Hello World!!!";
}
}
package org.forfan06.demo08.b;
import org.forfan06.demo08.a.Demo; //导入不同包中的Demo类
public class ImportDemo01{
public static void main(String args[]){
System.out.println(new Demo().getInfo());
}
}
以上程序中的ImportDemo01类中因为要用到Demo类,所以在package语句后,通过import导入了所需要的类。
以上程序在编译的时候,应该先编译Demo.java; 然后再编译ImportDemo01.java
编译 Demo.java: javac -d . Demo.java
编译 ImportDemo01.java: javac -d . ImportDemo01.java
编译时出错,说Demo类不是public定义的。在ImportDemo01类中无法进行访问。 如果一个类想要被外包访问,则此类一定要定义成public class。
如果一个类声明为public class。 则文件名必须与类名一致, 而且在一个类文件中只能有一个public class; 如果使用class声明一个类,则文件名称可以与类名称不一致,但是执行时必须执行生成的class文件名称。
public class和class在包的访问上有所限制,如果一个类只在本包中访问,不需要被外包访问,则直接声明成class即可; 而如果一个类需要被外包访问,则必须声明成public class |
所以想要上面程序编译通过正常运行,必须修改Demo类
package org.forfan06.demo08.a;
<span style="color:#ff0000;">public class</span> Demo{
public String getInfo(){
return "Hello World!!!";
}
}
使用导入"*"的方式由JVM根据需要自己加载所需的类.
- 导入类的方式:import org.forfan06.demo08.a; 和 import org.forfan06.demo08.*; 哪种性能更高??
- 这两种导入方式本身不存在任何的性能问题,因为使用“*”时程序也是自动加载所需要的类,而不需要的类根本是不会被加载进来的!!!
如果在一个程序中同时导入了两个包的同名类,在使用时就必须名窃地写出完成的“包.类名称”。 有点像绝对路径的概念。
8.1.3 系统常见包
序号 | 包名称 | 作用 |
1 | java.lang | 此包为基本的包,String类都保存在此包中。此包 现在是自动导入的 |
2 | java.lang.reflect | 此包为反射机制的包,是java.lang的子包。 |
3 | java.util | 此包为工具包,一些常用的类库、日期操作等 都在此包中,如果把此包掌握精通,则各种设计思路都好理解 |
4 | java.text | 提供了一些文本的处理类库 |
5 | java.sql | 数据库操作包,提供了各种数据库操作的类和接口 |
6 | java.net | 完成网络变成 |
7 | java.io | 输入、输出处理 |
8 | java.awt | 包含了构成抽象窗口工具集(abstract window toolkits)的多 个类,这些类被用来构建和管理应用程序的图形用户界面(GUI) |
9 | java.swing | 此包用于建立图形用户界面(GUI),此包中的组件 相对于java.awt包而言是轻量级组件 |
*********java.util包在开发中使用较多,因为其支持大量的工具类操作,象本书中的常用类库、java类集都是围绕此包展开讲解的*****
*****java.lang.reflect这个包一般在面试时有可能会问到,此包属于比较高级的开发包*****
8.1.4 Java新特性 -- 静态导入
如果一个类中的方法全部都是使用static声明的静态方法,则在导入时就可以直接使用import static的方式导入,格式如下
import static package.class.*;
实例: 使用静态导入
package org.forfan06.demo08.e;
public class Operate{
public static int add(int i, int j){
return i + j;
}
public static int sub(int i, int j){
return i - j;
}
public static int mul(int i, int j){
return i * j;
}
public static int div(int i, int j){
return i / j;
}
}
以上代码的类中的全部方法为static类型,所以在导入时就可以使用静态导入的方法。
package org.forfan06.demo08.f;
import static org.forfan06.demo08.e.Operate.*;
public class StaticImportDemo{
public static void main(String args[]){
System.out.println("7 + 7 = " + add(7, 7));
System.out.println("7 - 5 =" + sub(7, 5));
System.out.println("9 * 7 = " + mul(9, 7));
System.out.println("9 / 3 = " + div(9, 3));
}
}
使用静态导入,所以Operate类中的所有静态方法可以直接在StaticImportDemo类中使用,而不再需要使用“类.静态方法()”的形式调用!!!
8.2 jar命令的使用
通过JDK中bin目录里的jar.exe可以将所有的类文件.class进行压缩,此命令是随JDK一起安装的,直接在命令行中输入jar,可以看到此命令的提示界面。
得到一个jar文件后,可以通过设置classpath的方式在系统中注册好此jar文件,以供程序使用。
jar命令中的主要参数:
jar -cvf my.jar org
- c: 创建新的文档。
- v: 生成详细的输出信息。
- f: 指定存档的文件名。
如果想查看一个jar文件中的全部内容,可以直接输入“jar -tvf jar文件的名称”
8.3 访问权限控制
Java中,一共存在4种访问空问权限,即private、default(默认)、protected和public
- private访问权限, 私有访问权限。 只能在本类中进行访问。
- default(默认)访问权限 如果一个类中的属性或方法没有使用任何的访问权限声明,则就是默认的访问权限,默认的访问权限可以被本包中的其他类所访问,但是不能被其他包的类所访问 。
- protected访问权限 受保护的访问权限。 一个类中的成员如果使用了protected访问权限,则只能被本包及不同包的子类访问。
- public访问权限 公共访问权限。 如果一个类中的成员使用了public访问权限,就可以在所有的类中被访问,不管是否在同一个包中。
范围 | private | default | protected | public |
同一类 | √ | √ | √ | √ |
同一包中的类 | √ | √ | √ | |
不同包的子类 | √ | √ | ||
其他包中的类 | √ |
关于protected访问权限
在org.forfan06.demo08.g包中定义一个HelloDemo类,其中包含一个protected访问权限的成员。
package org.forfan06.demo08.g;
public class HelloDemo{
protected String name = "forfan06"; //只能被本包及不同包的子类访问
}
<span style="background-color: rgb(255, 255, 255);"> </span>
<span style="background-color: rgb(255, 255, 255);">在org.forfan06.demo08.h包中的子类访问此类中的那么属性。</span>
<span style="background-color: rgb(255, 255, 255);">
</span>
<span style="background-color: rgb(255, 255, 255);">
</span>
package org.forfan06.demo08.h;
import org.forfan06.demo08.g.HelloDemo;
class SubHelloDemo extends HelloDemo{ //定义HelloDemo子类
public void print(){
System.out.println("" + super.name); //可以访问protected权限的属性和方法
}
}
public class ProtectedDemo01{
public static void main(String args[]){
SubHelloDemo sub = new SubHelloDemo(); //实例化子类对象
sub.print();
}
}
运行结果:
访问受保护属性: forfan06
以上程序在不同包的子类里访问了protected属性,而如果现在由不同包的类直接访问HelloDemo类中的protected属性,则会出现下面的编译错误
package org.forfan06.demo08.h;
import org.forfan06.demo08.g.HelloDemo;
public class ProtectedDemo02{
public static void main(String args[]){
HelloDemo sub = new HelloDemo();
System.out.println(sub.name); //<span style="color:#cc0000;"><del>错误,不同包的类无法访问protected属性</del></span>
}
}
编译时会出现以下错误:
ProtectedDemo02.java:7: name has protected access in org.forfan06.demo08.g.HelloDemo
System.out.println(sub.name);
1 error
8.4 java命名规范
- 类: 所有单词的首字母大写。 如TestJava.
- 方法: 第1个单词的首字母小写,之后每一个单词的首字母大写。如testMethod().
- 属性: 第一个单词的首字母小写,之后每一个单词的首字母大写。如studentName.
- 包: 所有单词的字母小写。 如org.forfan06.demo
- 常量: 所有单词全部大写,如FLAG.
8.5 本章要点
- java中使用包可以实现多人协作的开发模式。应避免类名称重复的麻烦。
- 在java中使用package关键字来讲一个类放入一个包中
- 在java中使用import语句可以导入一个已有的包
- 如果在一个程序中导入了不同包的同名类,在使用时一定要明确地写出"包.类名称"
- java中的访问权限控制分为4种,即private、default、protected、public
- 使用jar命令可以将一个包打成一个.jar文件,以供用户使用
8.6 习题