作用域 当前类 同一package 子孙类 其他package
public √ √ √ √
protected √ √ √ ×
friendly √ √ × ×
private √ × × ×
C++中不写时默认为friendly,指包访问权限,意味着当前的包中的所有其他类对那个成员都有访问权限。Java中没有友元的概念,可以借用内部类实现。
java有四种访问权限:1. private 私有;2. Default (默认的) 只有包内的类才能被访问,所以有"包访问权限"的称呼;3. protected 不但包内的类可以访问,而且继承的子类也可以访问;4. public 公有,都可以访问。 Java中所谓的“friendly”和“default”都只是一种说法,并不是说真有那么一个指定默认访问权限的关键字(default倒的确是个语言关键字,但那是用在switch语句中的)。default 只能在自己的包里可见;protected 在任何包里的子类里可见;java中默认的访问级别是同类和同包中可见。
class Base{
protected void print(){System.out.println("Base");}
public void srint(){System.out.println("Base");}
}
public class Derived extends Base{
public void rrint(){System.out.println("Derived");}
//void print(){System.out.println("Derived");} 错误,不能降低原有父类方法中的权限
//private void print(){System.out.println("Derived");} 错误,不能降低原有父类方法中的权限
//protected void print(){System.out.println("Derived");} 正确
public void print(){System.out.println("Derived");} 正确
//default void print(){System.out.println("Derived");} 错误 不存在default权限关键字
//friendly void print(){System.out.println("Derived");} 错误 不存在friendly权限关键字
public static void main(String[]args){
Base p=new Derived();
p.print();//result is Derived
p.srint();//result is Base
//p.rrint();//错误,不能访问只在子类中存在的方法
} }
------------------------------------------------------------------------
class Cleanser {
private String s = new String("Cleanser"); //私有变量无法在父类中继承
public void append(String a) { s += a; }
public void scrub() { append(" scrub()"); }
public void dilute() { append(" dilute()"); }
public String toString(){return s;}
public static void main(String[] args) {
Cleanser x = new Cleanser();
x.dilute();
System.out.print(x);
} }
public class Detergent extends Cleanser {
public void scrub() {
append(" Detergent.scrub()");
super.scrub();
}
public void foam() { append(" foam()"); }
public static void main(String[] args) { //允许多个main方法
Detergent x = new Detergent();
x.dilute();
x.scrub();
x.foam();
System.out.print(x);
System.out.println("Testing base class:");
Cleanser.main(args);
}
}
//程序的输出结果是:
Cleanser dilute() Detergent.scrub() scrub() foam()
Testing base class:
Cleanser dilute()