一个Java文件中可以包含多个类。
如果有public类,则文件名必须和public类一样。
例如:
1 class Pie { 2 void f(){ 3 System.out.println("Pie.f()"); 4 } 5 } 6 7 class Cake { 8 public static void main(String[] args){ 9 Pie x = new Pie(); 10 x.f(); 11 } 12 } 13 14 class Cake1 { 15 public static void main(String[] args){ 16 Pie x = new Pie(); 17 x.f(); 18 } 19 }
该文件名可以是Cake2.java或者其它。但如果该文件中有public 类,则文件名必须和public 类名一样。
上述文件编译产生如下的文件:
编译和运行命令如下:
1 关于类的访问权限控制:public 或者什么都不写(包访问权限,其它包的类不能访问该类)。
2 方法和字段的访问权限顺序从大到小:Public, protected, 默认(包访问权限), private。
2.1 protected 修饰的成员,如果其它package中的类继承了该类,就可以访问该成员。比默认的权限高。
3 使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。
4 由于final变量和static变量可以说都只能存一个数据,他们惟一的区别是static变量是属于类的,是类变量,只会被加载一次。
5 final和abstract 修饰的类,第一个不能继承,第二个继承必须实现存在的abstract方法。
6 abstract方法所在的类必须用abstract修饰。abstract修饰的类不能实例化,可以不存在抽象方法。
关于final
使用final的原因有两个。效率/设计。早期的编译器会针对final方法,进行特殊的优化。但是现在的编译器不推荐用户使用final关键字,
编译器和JVM会去处理相关的效率问题。
特别的,final方法不能被覆盖。因为private方法是不能够继承的,所以private 方法隐式的是final的。
"覆盖"只有在某方法是基类的接口的一部分时才会出现。如果某方法为private,它就不是基类的接口的一部分。
由于private方法无法触及而且能有效的隐藏,所以除了把它看成是因为它所属的类的组织结构的原因而存在外,其他任何事物都不需要考虑到它。
继承的初始化顺序
1 package reusing; 2 class Insect{ 3 private int i = 9; 4 protected int j; 5 public Insect() { 6 System.out.println("i = " + i + ", j = " + j); 7 j = 39; 8 } 9 private static int x1 = printInit("static Insect x1.initalized"); 10 static int printInit(String s){ 11 System.out.println(s); 12 return 47; 13 } 14 } 15 public class Beetle extends Insect{ 16 private int k = printInit("Beetle.k initalized"); 17 public Beetle(){ 18 System.out.println("k = " + k); 19 System.out.println("j = " + j); 20 } 21 private static int x2 = printInit("static Beetle x2.initalized"); 22 public static void main(String[] args){ 23 System.out.println("Bettle Constructor"); 24 Beetle b = new Beetle(); 25 } 26 27 /* 28 * static Insect x1.initalized 29 * static Beetle x2.initalized 30 * Bettle Constructor 31 * i = 9, j = 0 32 * Beetle.k initalized 33 * k = 47 34 * j = 39 35 * 36 */ 37 }