Java中包的机制
来源:互联网 发布:js 获取所有表单元素 编辑:程序博客网 时间:2024/05/14 04:37
随着程序代码撰写越来越多,程序内容越来越大,您会发现管理程序中的变量名称、函式名称、类别名称也会是一件麻烦的事,尤其是一些同名问题的发生,例如在程序中,您也许会定义一个Point类别代表2维空间的点,也许在程序的某个地方,您也会定义一个 Point类别来表示一个3维空间的点,其它像函式同名、共享变量同名的情况也可能发生,当这种情况发生时,其中一个定义就可能将另一个定义给覆写掉了。
Java提供package机制,它就像是一个管理容器,可以将您所定义的名称区隔管理在package下,而不会有相互冲突的发生,例如您定义了一个 dimension2d与dimension3d的package,在它们之下都有一个Point类别,但由于属于不同的package,所以这两个名称并不会有所冲突。
Java平台的classes是被储存在Java安装目录的jre/lib/下的rt.jar,另外额外的第三组件(third-party)可以放在/jre/lib/ext/中,在我们之前的例子中,使用import就是在告知编译器我们的类别位于哪一个package下,这些类别必须设定好CLASSPATH才可以被编译器找到,预设上是jre/lib/下的rt.jar、jre/lib/ext/中相关扩充组件与现行工作目录。
Java的package被设计为与档案系统结构相对应,如果您的package设定是caterpillar.demo,则该类别应该在指定目录的caterpillar/demo/下可以找到,为了要能建立与package相对应的档案系统结构,我们在编译时可以加入-d参数,并指定要建立在哪一个目录之下。
下面这个程序使用package关键词来建立package以管理我们所定义的类别:
代码:
package caterpillar.demo;
public class UsePackage {
public static void main(String[] args) {
System.out.println("Hello! World!";
}
}
在编译时我们使用以下的指令:
代码:
$ javac -d . UsePackage.java
我们在编译时使用-d参数,并指定在现行目录 "." 中建立档案与系统结构,则编译完成之后,在现行目录中会出现caterpillar/demo/目录,而当中有一个UsePackage.class档案,在编译完成之后,package的指定就成为class名称的一部份了,我们在执行时可以这么下指令:
代码:
$ java caterpillar.demo.UsePackage
Hello! World!
我们可以为类别建立package管理,我们举下面的例子来说:
代码:
package caterpillar.demo;
public class Point2D {
private int x, y;
public Point2D() {x = 0; y = 0;}
public Point2D(int x, int y) {this.x = x; this.y = y;}
public int getX() {return x;}
public int getY() {return y;}
}
这个类别建立在Point2D.java档案中,我们可以先用以下的指令来编译它:
代码:
$ javac -d . Point2D.java
我们之前说过,package名称为类别名称的一部份,除非您重新编译类别,否则的话无法改变这个名称,为了要使用这个类别,方法之一是使用完全描述(fully qualified)名称,也就是完整的指出package与类别名称,例如:
代码:
public class UsePackage {
public static void main(String[] args) {
caterpillar.demo.Point2D p1 = new
caterpillar.demo.Point2D(10, 20);
System.out.println("p1: (x, y) = (" +
p1.getX()+ ", " + p1.getY() + "";
}
}
当然这个方法在使用上不是很方便,我们可以使用import关键词,告知我们要使用的类别是位于哪一个package之下,例如:
代码:
import caterpillar.demo.*;
public class UsePackage {
public static void main(String[] args) {
Point2D p1 = new Point2D(10, 20);
System.out.println("p1: (x, y) = (" +
p1.getX()+ ", " + p1.getY() + "";
}
}
上面两个程序的执行结果都是相同的:
代码:
$ java UsePackage
p1: (x, y) = (10, 20)
注意如果您提供的类别若不位于相同的package中,您的类别必须宣告为public,若不宣告则类别预设只能于同一个package中被存取,例如将之前Point2D类别的public拿掉,则编译UsePackage.java档案时,会出现以下的错误:
代码:
$ javac UsePackage.java
UsePackage.java:5: caterpillar.demo.Point2D is not public in caterpillar.demo; cannot be accessed from outside package
要存取package的class也与CLASSPATH的设定有关,建议您也看看官方有关于设定CLASSPATH的文章,您对package的了解会更深入:
http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/classpath.html
Java提供package机制,它就像是一个管理容器,可以将您所定义的名称区隔管理在package下,而不会有相互冲突的发生,例如您定义了一个 dimension2d与dimension3d的package,在它们之下都有一个Point类别,但由于属于不同的package,所以这两个名称并不会有所冲突。
Java平台的classes是被储存在Java安装目录的jre/lib/下的rt.jar,另外额外的第三组件(third-party)可以放在/jre/lib/ext/中,在我们之前的例子中,使用import就是在告知编译器我们的类别位于哪一个package下,这些类别必须设定好CLASSPATH才可以被编译器找到,预设上是jre/lib/下的rt.jar、jre/lib/ext/中相关扩充组件与现行工作目录。
Java的package被设计为与档案系统结构相对应,如果您的package设定是caterpillar.demo,则该类别应该在指定目录的caterpillar/demo/下可以找到,为了要能建立与package相对应的档案系统结构,我们在编译时可以加入-d参数,并指定要建立在哪一个目录之下。
下面这个程序使用package关键词来建立package以管理我们所定义的类别:
代码:
package caterpillar.demo;
public class UsePackage {
public static void main(String[] args) {
System.out.println("Hello! World!";
}
}
在编译时我们使用以下的指令:
代码:
$ javac -d . UsePackage.java
我们在编译时使用-d参数,并指定在现行目录 "." 中建立档案与系统结构,则编译完成之后,在现行目录中会出现caterpillar/demo/目录,而当中有一个UsePackage.class档案,在编译完成之后,package的指定就成为class名称的一部份了,我们在执行时可以这么下指令:
代码:
$ java caterpillar.demo.UsePackage
Hello! World!
我们可以为类别建立package管理,我们举下面的例子来说:
代码:
package caterpillar.demo;
public class Point2D {
private int x, y;
public Point2D() {x = 0; y = 0;}
public Point2D(int x, int y) {this.x = x; this.y = y;}
public int getX() {return x;}
public int getY() {return y;}
}
这个类别建立在Point2D.java档案中,我们可以先用以下的指令来编译它:
代码:
$ javac -d . Point2D.java
我们之前说过,package名称为类别名称的一部份,除非您重新编译类别,否则的话无法改变这个名称,为了要使用这个类别,方法之一是使用完全描述(fully qualified)名称,也就是完整的指出package与类别名称,例如:
代码:
public class UsePackage {
public static void main(String[] args) {
caterpillar.demo.Point2D p1 = new
caterpillar.demo.Point2D(10, 20);
System.out.println("p1: (x, y) = (" +
p1.getX()+ ", " + p1.getY() + "";
}
}
当然这个方法在使用上不是很方便,我们可以使用import关键词,告知我们要使用的类别是位于哪一个package之下,例如:
代码:
import caterpillar.demo.*;
public class UsePackage {
public static void main(String[] args) {
Point2D p1 = new Point2D(10, 20);
System.out.println("p1: (x, y) = (" +
p1.getX()+ ", " + p1.getY() + "";
}
}
上面两个程序的执行结果都是相同的:
代码:
$ java UsePackage
p1: (x, y) = (10, 20)
注意如果您提供的类别若不位于相同的package中,您的类别必须宣告为public,若不宣告则类别预设只能于同一个package中被存取,例如将之前Point2D类别的public拿掉,则编译UsePackage.java档案时,会出现以下的错误:
代码:
$ javac UsePackage.java
UsePackage.java:5: caterpillar.demo.Point2D is not public in caterpillar.demo; cannot be accessed from outside package
要存取package的class也与CLASSPATH的设定有关,建议您也看看官方有关于设定CLASSPATH的文章,您对package的了解会更深入:
http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/classpath.html
- Java中包的机制
- Java中包的机制
- Java的包机制
- java包导入机制的研究
- java包导入机制的研究。
- java包机制(初稿)
- java中的"包"机制
- JAVA中的包机制
- Java 闭包机制
- Java中包的概念
- Java中常用的包
- java中包的使用
- JAVA中常用的包
- java中常用的包
- java中包的概念
- java中包的学习
- java中包的命名
- java中包的必要性
- 写心理测试 小控制台程序:您生命中现在是哪种原型在做主导?
- Myeclipse中安装SVN
- 利用Math.Random()方法来生成随机数。(转)
- Usb HID 详解
- apache 经典的两个问题
- Java中包的机制
- XSS Shortening Cheatsheet
- 类的声明与定义
- oracle CPU使用太高 如何诊断和解决CPU高度消耗(100%)的数据库问题
- C# 操作注册表 写入注册表 修改注册表 读取注册表
- Openmesh handle 转换
- Hit the Target!
- 金山新CEO张宏江:后悔从微软出来得太晚
- WPF数据绑定模型