Java中有三种修饰符:public、protected、private。实际上还隐藏着一个缺省的包。
public:定义了类型的主要功能。
protected:定义了子类可获得的用于特化目的的功能。
private:定义仅仅此类的特定功能。
package(缺省):定义了包内其他代码可获得的用来实现包类型之间协作的功能。
例子:
package P1;
public abstract class AbstractBase {
public AbstractBase() {
System.out.println("\nCreate Object : " + getClass());
}
private void pri() {System.out.println("AbstractBase.pri()");}
void pac() {System.out.println("AbstractBase.pac()");}
protected void pro() {System.out.println("AbstractBase.pro()");}
public void pub() {System.out.println("AbstractBase.pub()");}
public final void show() {
pri();
pac();
pro();
pub();
}
}
package P2;
import P1.AbstractBase;
public class Concrete1 extends AbstractBase {
public void pri() {System.out.println("Concrete1.pri()");}
public void pac() {System.out.println("Concrete1.pac()");}
public void pro() {System.out.println("Concrete1.pro()");}
public void pub() {System.out.println("Concrete1.pub()");}
}
package P1;
import P2.Concrete1;
public class Concrete2 extends Concrete1 {
public void pri() {System.out.println("Concrete2.pri()");}
public void pac() {System.out.println("Concrete2.pac()");}
public void pro() {System.out.println("Concrete2.pro()");}
public void pub() {System.out.println("Concrete2.pub()");}
}
package P3;
import P1.Concrete2;
import P2.Concrete1;
public class Concrete3 extends Concrete2 {
public void pri() {System.out.println("Concrete3.pri()");}
public void pac() {System.out.println("Concrete3.pac()");}
public void pro() {System.out.println("Concrete3.pro()");}
public void pub() {System.out.println("Concrete3.pub()");}
public static void main(String[] args) {
new Concrete1().show();
new Concrete2().show();
new Concrete3().show();
}
}
四个类,三个包,AbstractBase和Concrete2在包P1中,Concrete1在P2中,Concrete3在P3中。
运行结果:
写道
Create Object : class P2.Concrete1
AbstractBase.pri()
AbstractBase.pac()
Concrete1.pro()
Concrete1.pub()
Create Object : class P1.Concrete2
AbstractBase.pri()
Concrete2.pac()
Concrete2.pro()
Concrete2.pub()
Create Object : class P3.Concrete3
AbstractBase.pri()
Concrete3.pac()
Concrete3.pro()
Concrete3.pub()
结果分析:
1,所有子类都不能看到private,那么private方法始终没有被覆盖。
2,protected和public都能够被子类覆盖。
3,默认的package的是最有意思的,Concrete1和AbstractBase不在同一包不能覆盖正常,Concrete2和AbstractBase在同一包能够覆盖也正常,Concrete3 和AbstractBase不在同一个包,居然因为Concrete2已经覆盖了pac的方法,把这个打开成了public的了,没有想到。