看完C和指针,原本是打算学习C++的,因为大一下老师课程非常紧,自己也没怎么看书,对C++好多基本的东西都还不是很了解。但是这学期参加了“大学生创业创新项目”,所以得把自己原先的计划放一边了,先学习JAVA和Android Stdio。

Java学习我看的是《Java编程思想》第四版,在第六章:“访问权限控制”中,对包感到十分疑惑。前前后后来回看了老久,废话不多说,解决问题。

在初调用包时,总会出现“程序包***不存在”的情况。首先我们从三种情况来说明。以Child.java为自创包内的类,Father.java中会调用Child的方法 为例。(我所用的编译器为Ediplus)

1、Child.java和Fther.java在同一个子目录中。如它们都在C:/javacode这个文件夹中。

java 创蓝 java创包_java

Child中代码为:

public class Child 
{
	void print(){
		System.out.println("Child ");
	}
}



Father中代码为:


class Father 
{
	public static void main(String[] args) 
	{
		Child a=new Child();
		a.print();
	}
}


运行结果:


java 创蓝 java创包_java_02


有没有感到很神奇,明明Child没有“打包”,却仍能被Father中的主方法创建对象,并调用其中的方法。《Java编程思想》给出的解释是:Father.java可以访问Child.java的原因是因为他们同处于相同的目录并且没有给自己设定任何的包名称,Java把这样的文件自动看做是隶属于该目录的默认包之中,于是它们为该目录中所有其他文件都提供了包访问权限。(《Java编程思想》第四版P117 )

所以当两个.java在同一文件夹时,根本不用包,也可以相互访问(和protected限制词也有关系,这一点在第二种情况会说明)。


2、当Child.java在Father.java所在目录的子目录时。例如Child.java在D:/javacode/mypackage/print里  Father.java在D:/javacode里

Child中的代码:


//D:/javacode/mypackage/print
package mypackage.print;

public class Child 
{
	public void print(){
		System.out.println("Child ");
	}
}


和第一种情况有所不同,mypackage/print设为包名。方法print()被设置为pubilc,这样包外的类才能访问print()方法,而方法一中print()没有任何修饰,缺省为protected,同一个包中类其他类才可以访问print()。


Father中的代码:


//D:/javacode
import mypackage.print.Child;

class Father 
{
	public static void main(String[] args) 
	{
		Child a=new Child();
		a.print();
	}
}


运行结果:

java 创蓝 java创包_Java_03

整个过程能够编译成功。


3、“程序包***不存在”主要是由第三种情况引起的:Father在电脑中任意位置。例如Father在桌面,Child在D:/javacode/mypackage/print;


Child中的代码:


//D:/javacode/mypackage/print
package mypackage.print;

public class Child 
{
	public void print(){
		System.out.println("Child ");
	}
}

与第二种情况相比没有任何变化


Father中的代码:


//C:\Users\asus\Desktop
import mypackage.print.Child;

class Father 
{
	public static void main(String[] args) 
	{
		Child a=new Child();
		a.print();
	}
}

Father与第二种情况相比也没有任何变化 除了位置不同外。


运行结果:

java 创蓝 java创包_java_04



那么为什么有的人就不能成功呢,原因主要在于CLASSPATH的设置,为了任何地方的Father.java都能够访问Child,必须添加CLASSPATH的路径。在本例中Child在D:/javacode/mypackage/print中 ,其中mypackage/print为包名,那么需把D:/javacode添加到CLASSPATH中。改完后仍然不能编译Father.java,只需要重启电脑后就可以了。

为什么添加之后就能访问了呢。在编译Father.java时,CLASSPATH会自动在路径中找子目录有mypackage/print,并且含有Child.java类的路径。在本例中,CLASSPATH确定为D:/javacode,并自动吧mypackage/print添加到D:/javacode后面,编程完整路径D:/javacode/mypackage/print,并找到其中的类Child。这样整个编译过程顺利完成。