package pack2;
public class O1{
private void f1(){}
protected void f2(){
System.out.println("hckacnms");
}
void f3(){}
public void f4(){}

package pack3;
import pack2.O1;
class O2 extends O1{
protected void g(){
System.out.println("jskh bkdb");
f2();//此方法可见
}

}public class Package { /**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
        new O2().f2();//这行是错误的
        new O2().g();//这行是对的,但g()和f()方法都是protected,喂什么上一个不行呢?
}}

解决方案 »

  1.   

    因为 O2、Package 两个类在同一个包下啊protected 的作用域范围:当前类、子孙类、同包中其他的作用域可见范围:作用域        当前类       同package    子孙类      其他package
    public        √             √           √            √
    protected     √             √           √            ×
    friendly      √             √           ×            ×
    private       √             ×           ×            ×friendly 表示缺省的作用域
      

  2.   

    protected 的作用域在同一个包中是可见的,这个是比较容易忽视的。嘿嘿,顺便我自己也加深印象,上面的那个表还是有规律的,可见范围一个比一个少
      

  3.   

    作用域问题!
    详细请参见如下作用域当前类同包子孙类其他
    public √ √ √ √
    protected √ √ √ ×
    default √ √ × ×
    private √ × × ×