现在想好好学学java了,学校里的c和汇编帮我打下了学语言的基础。要把Thinking in java看完,并写些程序。
Package
Package感觉类似于c中的include语句,主要是让我们可以使用编译好的class文件(一个compile unit如果有多个类的话,会有多个class文件)。但是为什么用了import 之后java可以找到对应的class文件所在地了?需要在环境变量中设置CLASSPATH,它会告诉java去哪里找package,这也是为什么java是跨平台的,当程序换了环境,不需要修改代码! 因为程序都是使用的相对路径,而非绝对路径,根据目录的路径。
Example:
在Eclipse的default package中新建了package :TestingPackage,并在其中新建类MyClass,代码如下:
package TestingPackage;
public class MyClass {
public int ii;
public MyClass(int i){
this.ii = i;
}
public void print(){
System.out.println("This is package TestingPackage");
}
public static void main(){
}
}
再在default Package中新建类TestPackage,代码如下:
import TestingPackage.*;
public class TestPackage {
public static void main(String args[]){
MyClass me = new MyClass(12);
me.print();
}
}
结果如下:
This is package TestingPackage
因为我在同一个目录下加的Package,所以并没有在classpath中设置路径也可以运行。以上便实现了如何调用不同Package下的类。
Java access specifiers
Java中的public,private,protected是挺好的设计,把不必要的细节全部隐藏,只提供必要的接口。好比我去银行,不需要知道银行的内部细节,只要一个服务员能和我交流,帮我把我需要的事情干完。但是C中如果有全局变量或者函数,全部都展现给我,我有点不知从哪里看起。还是含蓄的比较好,只给我想看的,这样也减少了程序复杂度。
- Testing case 1:
相同Package下能否访问public,protected,private变量。
Testing Code:
刚才的TestingPackage下新建CLASS SamePackage:
package TestingPackage;
public class SamePackage {
public static void main(String args[]){
MyClass me = new MyClass(23);
System.out.println(me.ss);
}
}
原MyClass下新建变量:
protected String ss = new String("i am protected");
分别改变protected限定词
Conclusion:相同Package下可以访问Public和Private变量。
- Testing case2
不同Package下能否访问public,protected,private变量。
Testing code:
在default Package下新建ClassTestPackage:
import TestingPackage.MyClass;;
public class TestPackage {
public static void main(String args[]){
MyClass me = new MyClass(12);
me.print();
//can not use, not the same package
//System.out.println(me.ss);
}
}
Conclusion:不同Package下只能访问Public!
Class access
一个compilation unit下只有一个Public class,并且这个类的名称和文件名必须相同。书中还有一个有趣的例子如下:
class Soup {
private Soup() {}
// (1) Allow creation via static method:
public static Soup makeSoup() {
return new Soup();
}
// (2) Create a static object and return a reference
// upon request.(The "Singleton" pattern):
private static Soup ps1 = new Soup();
public static Soup access() {
return ps1;
}
public void f() {}
}
class Sandwich { // Uses Lunch
void f() { new Lunch(); }
}
// Only one public class allowed per file:
public class Lunch {
void test() {
// Can't do this! Private constructor:
//! Soup priv1 = new Soup();
Soup priv2 = Soup.makeSoup();
Sandwich f1 = new Sandwich();
Soup.access().f();
}
} ///:~
Soup的构造函数是private来修饰,谁都不能访问。相当于把一个class当一个函数来使用了。