楼上的错了, 友好的(即默认的)不是protected 虽然两者很接近,但是还是有细微差别 see http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html
首先没有明确使用package来声明的同一目录下的类被视为“默认包”,没有修饰符的类能够被同包的其他类访问。上面Cake和Pie依此原则属于同包,所以Cake可以访问Pie,同时即使编译Cake之前没有编译Pie,Pie也会自动编译。其次,如果你在一个类的定义前面加上Package 声明,其实就是定义了一个新的包,同时包跟源文件所在的目录有关系。比如,你的classpath是d:\java,package cx; public class XX { //... } 这个源文件就应该放在d:\java\cx\XX.java,这样才能被别人正确引用。而且运行时才要通过 java cx.XX来运行。在d:\java\cx下面java XX是会出错的,java编译器会告诉你找不到类。如果目录不对,那么编译的时候没问题,但是运行时会出错。你自己做做实验来看吧。
我为什么回提出第一个问题呢?是因为我看了一篇号称权威的文章,转载如下:d:\mypackage\A.javapackage mypackage; public class A{ public A(){ System.out.println("Create A"); } }d:\mypackage\B.javaimport mypackage.*; class B{ B(){ System.out.println("Create B"); } public static void main(String[] args){ A a=new A(); B b=new B();
}
首先set classpath=.;d:\ 表示到当前目录和d盘根目录查找包,包名与目录名一致。如mypackage包 位于d:\mypackage java通过classpath找到d:\然后通过包名找到 d:\mypackage目录,在d:\mypackage目录下找到A.classD:\mypackage>javac A.java 没问题 D:\mypackage>javac B.java ★★★★★★★★★★★★★★★★★★ B.java:7: cannot access A bad class file: .\A.class class file contains wrong class: mypackage.A Please remove or make sure it appears in the correct subdirectory of the classpa th. A a=new A(); ^ 1 error将B.java移至d:\B.java然后运行D:\>javac B.javaD:\>java B Create A Create B一切正常。 总结:因为B class不在mypackage中,也就是说B class 要使用在mypackage 中的class,那么class B应该位于mypackage包所在目录之外才能避免冲突。不然默认class B与它所在目录的class位于同一个package中。 我觉得他的总结是屁话 请注意★★★★★★★★★★★★★★★★★★号处,我认为编译不会出错, thinking in java说的很明白了,
1。类前面没有没有任何修饰符就说明他是包级安全的就是说只有同一个包里的可以访问到,所以你要做的只是保证这两个类在同一个包里就可以了。think in java的修饰符那一张说得很明白(我想你对这些修饰符的意义理解有问题),你可以再仔细看看。2。不会有任何问题,编译器会帮你完成任务。
classpath中的路径,如果有pie.java,既没有编译成class文件时,
会先将pie.java编译成pie.class,再引用这个类的
编译是有先后顺序.关于第一个问题(我的理解):
在Java里对一个类的友好(protected)访问权限可以进行访问的类可以在
同一个目录或这个类的子类,并不是只有这个类的子类. 关于这点
你只要仔细看一个这本书就能会明白.
友好的(即默认的)不是protected
虽然两者很接近,但是还是有细微差别
see http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html
public class XX {
//...
}
这个源文件就应该放在d:\java\cx\XX.java,这样才能被别人正确引用。而且运行时才要通过 java cx.XX来运行。在d:\java\cx下面java XX是会出错的,java编译器会告诉你找不到类。如果目录不对,那么编译的时候没问题,但是运行时会出错。你自己做做实验来看吧。
public class A{
public A(){
System.out.println("Create A");
}
}d:\mypackage\B.javaimport mypackage.*;
class B{
B(){
System.out.println("Create B");
}
public static void main(String[] args){
A a=new A();
B b=new B();
}
首先set classpath=.;d:\
表示到当前目录和d盘根目录查找包,包名与目录名一致。如mypackage包
位于d:\mypackage java通过classpath找到d:\然后通过包名找到
d:\mypackage目录,在d:\mypackage目录下找到A.classD:\mypackage>javac A.java 没问题
D:\mypackage>javac B.java ★★★★★★★★★★★★★★★★★★
B.java:7: cannot access A
bad class file: .\A.class
class file contains wrong class: mypackage.A
Please remove or make sure it appears in the correct subdirectory of the classpa
th.
A a=new A();
^
1 error将B.java移至d:\B.java然后运行D:\>javac B.javaD:\>java B
Create A
Create B一切正常。 总结:因为B class不在mypackage中,也就是说B class 要使用在mypackage 中的class,那么class B应该位于mypackage包所在目录之外才能避免冲突。不然默认class B与它所在目录的class位于同一个package中。
我觉得他的总结是屁话
请注意★★★★★★★★★★★★★★★★★★号处,我认为编译不会出错,
thinking in java说的很明白了,