现在的位置: 首页 > 综合 > 正文

访问权限

2013年08月13日 ⁄ 综合 ⁄ 共 2184字 ⁄ 字号 评论关闭

 

作用域    当前类       同一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()

 

抱歉!评论已关闭.