访问修饰符和CLASSPATH,封装
package语句和import语句
有个示范程序如下:
package com.javier.simple;
public class Demonstrantion {
public static void main(String...args){
System.out.println("Demonstrantion");
}
}
语句中的package com.javier.simple;指明了当前编译后文件在本地系统的CLASSPATH所制定的目录结构下(注:使用的开发工具,将直接导致最终生成的.class文件的位置不同)
假设现在使用命令行的方式工作:
假设源文件在C:/DOCS/javaDemo/src/com/javier/simple/Demonstrantion.java
首先必须切换到文件所在目录,当然也可以直接使用绝对路径。
我们现在使用相对路径编译,如下
C:/DOCS/javaDemo/com/javier/simple>javac –d C:/DOCS/javaDemo/bin Demonstrantion.java
当编译源文件后,就会在指定的目录下(这里指定了 C:/DOCS/javaDemo/bin),生成一个包路径,com/javier/simple,所以这里完整的.class文件生成的位置在 :
C:/DOCS/javaDemo/bin/com/javier/simple/Demonstrantion.class
注意了,此时若是想运行编译后的程序则必须配置CLASSPATH
按照现在的目录层次结构,CLASSPATH中的配置应该是 :
.;C:/DOCS/javaDemo/bin
这里配置了2个.class文件的路径,其中第一个 . 表示当前目录,用 ; 分隔符添加多个路径
修改了CLASSPATH后,别忘记重新启动命令行工具。
现在运行编译后的文件,则可以在任何路径下
如 d:/> java com.javier.simple.Demonstrantion
必须使用改源文件生成时的包路径名 加 类名,注意,不需要加没有.class
系统会自动搜索CLASSPATH,然后会在你配置的CLASSPATH中搜索到C:/DOCS/javaDemo/bin下面的com.javier.simple.Demonstrantion这个类文件
当然,如果使用eclipse这样的IDE开发工具,就不需要如此复杂了,只需要设置好eclipse的运行环境,会在工程目录下指定编后后的文件,你所要做的只是在编译源文件时候,指定上 package 语句,
为什么要使用package语句?
为了避免不同开发者之间开发的类库文件冲突,所以使用包的概念,将每个开发者所开发的文件唯一区分开,Sun公司建议开发者使用自己的域名反转后来命名包文件
如
com.javier.simple
同样,你要使用别人开发好的库文件,就必须使用import语句
import com.javier.simple.Demonstrantion;
这样就可以使用刚才编译好的Demonstrantion.class文件了
当运行产生不顺利的时候,首先想到的便是classpath是否指定了目录路径,仔细检查一定会有收获的,相对而言,用集成开发环境比较方便简单。不会被classpath所困扰,然而,只有在深入了解了classpath之后,才能从容的去应对任何集成开发工具中的路径问题和环境变量问题。
访问权限:
java中的4种访问权限
public , protected , 默认(空者不写) , private
访问权限从大到小依次是:
public -- 对所有其他类是可见的,最大的访问权限。
protected -– 对继承的子类可见的,即使子类不在同一包中,同时,对同一包中的其他类可见。
默认 -- 对同一包中的其他类可见。
private – 只有在同一类中可见。
建一个private的典型例子:
package com.javier.simple;
public class Demonstrantion {
private Demonstrantion() {
}
public static Demonstrantion makeDemo() {
return new Demonstrantion();
}
}
class Test {
public static void main(String[] args) {
// The constructor Demonstrantion() is not visible
// Demonstrantion d = new Demonstrantion();
Demonstrantion d = Demonstrantion.makeDemo();
}
}
在这个范例中,你无法通过Demonstrantion d = new Demonstrantion(); 来创建Demonstrantion类的对象,因为构造器是private的,所以,你只能通过其中的一个公共的静态方法来创建对象,这样可以控制其他类任何去创建一个他的对象了。
而且,如果构造器设置为私有的,将阻止了其他类的继承。
需要注意的是,一个标准的类不可以是private或者protected,但是,内部类除外。
所谓封装:
根据上面的例子:通过设置private的访问权限,来达到控制别人创建对象的目的
当然,你可以将成员字段设置为private,然后,提供一个public的方法去访问这些设置为private的成员字段,并且在这个public的方法中提控一些访问的条件控制,比如大于某数,或者等于某字符或者其他等等的控制,来达到一个访问控制,这种将成员字段设置为private,而将方法设置为public的做法,通常而言就称之为封装,这样带来的好处就是,调用者不需要知道成员字段的具体实现方法,而只需调用即可,而类的创建者则可以有用完整的控制权力,以防止调用者给出一个非法的参数,
通常,类创建者将字段设置为private,而提供public访问权限的 set/get的方法名,这也是普遍并且标准的做法之一。