java 自创包发生“程序包***不存在”情况
2016-04-04 00:18
661 查看
看完C和指针,原本是打算学习C++的,因为大一下老师课程非常紧,自己也没怎么看书,对C++好多基本的东西都还不是很了解。但是这学期参加了“大学生创业创新项目”,所以得把自己原先的计划放一边了,先学习JAVA和Android Stdio。
Java学习我看的是《Java编程思想》第四版,在第六章:“访问权限控制”中,对包感到十分疑惑。前前后后来回看了老久,废话不多说,解决问题。
在初调用包时,总会出现“程序包***不存在”的情况。首先我们从三种情况来说明。以Child.java为自创包内的类,Father.java中会调用Child的方法 为例。(我所用的编译器为Ediplus)
1、Child.java和Fther.java在同一个子目录中。如它们都在C:/javacode这个文件夹中。
Child中代码为:
Father中代码为:
运行结果:
有没有感到很神奇,明明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中的代码:
Father中的代码:
运行结果:
整个过程能够编译成功。
3、“程序包***不存在”主要是由第三种情况引起的:Father在电脑中任意位置。例如Father在桌面,Child在D:/javacode/mypackage/print;
Child中的代码:
与第二种情况相比没有任何变化
Father中的代码:
运行结果:
那么为什么有的人就不能成功呢,原因主要在于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。这样整个编译过程顺利完成。
Java学习我看的是《Java编程思想》第四版,在第六章:“访问权限控制”中,对包感到十分疑惑。前前后后来回看了老久,废话不多说,解决问题。
在初调用包时,总会出现“程序包***不存在”的情况。首先我们从三种情况来说明。以Child.java为自创包内的类,Father.java中会调用Child的方法 为例。(我所用的编译器为Ediplus)
1、Child.java和Fther.java在同一个子目录中。如它们都在C:/javacode这个文件夹中。
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(); } }
运行结果:
有没有感到很神奇,明明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(); } }
运行结果:
整个过程能够编译成功。
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\DesktopFather与第二种情况相比也没有任何变化 除了位置不同外。
import mypackage.print.Child;
class Father { public static void main(String[] args) { Child a=new Child(); a.print(); } }
运行结果:
那么为什么有的人就不能成功呢,原因主要在于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。这样整个编译过程顺利完成。
相关文章推荐
- Java继承和初始化顺序
- Eclipse导入项目后,XDoclet错误:Missing library: xdoclet-1.2.1.jar. S...he home directory for XDoclet. 1.2.1
- 复习 spring
- Spring官网下载dist.zip的几种方法
- Java第五周学习总结
- java common mail
- 3.3Java基本数据类型-浮点型和字符型,布尔型
- win7下java环境变量设置
- Java的方法
- Java构造方法(构造函数)
- 解决Eclipse建Maven项目module无法转换为2.5
- 再窥HashMap
- 在Ant的javac中指定源文件编码方式,以避免"警告: 编码 GBK 的不可映射字符"的错误
- 使用ant javadoc 命令个性化生成项目javadoc (主要参数说明)
- 命令行玩JAVA
- 学号20145220 《Java程序设计》第5周学习总结
- Exception in thread "main" java.lang.NoSuchMethodError
- 是时候复习一下Java基础了(二)
- 20145329 《Java程序设计》第五周学习总结
- Java Design Pattern 2