关于protected访问权限的疑惑! 
我写的两个测试程序:
test.java
/////////////////////////////
package cn.mytest;public class Test 
{
  public void pubmethod()
  {
      System.out.println("Test's pubmethod()");
  }
  protected void promethod()
  {
      System.out.println("Test's promethod()");
  }
  void defmethod()
  {
  }
  private void primethod()
  {
  }
}Test2.java
/////////////////////////////////
package com.wingsunlight;import cn.mytest.Test;
public class Test2 extends Test
{
  /*public void fn()
  {
    //pubmethod();
    promethod();
    //defmethod();
    //primethod();
  }*/
  /*public void promethod()
  {
      System.out.println("Test2's promethod()");
  }*/
  
  public static void main(String [] args)
  {
      Test t=new Test();
      t.promethod();
    Test2 t2=new Test2();    //t.pubmethod();
    t2.promethod();
    
    //t.defmethod();
    //t.primethod();
  }
}
编译过程如下:javac test.java  没有任何问题
接着编译:javac Test2.java  报错如下:
D:\java编程\test>javac test2.java
test2.java:21: promethod() 可以在 cn.mytest.Test 中访问 protected
        t.promethod();
         ^
1 错误
问题:test2这个类是从test继承来的,promethod()方法的访问权限是proctected。应该在test2中是可以访问的,为什么还会出这样的编译报错那?恳请高手指教。谢谢!

解决方案 »

  1.   

    public   static   void   main(String   []   args) 
        { 
                Test   t=new   Test(); 
                t.promethod();  //这里是错的
            Test2   t2=new   Test2();         //t.pubmethod(); 
            t2.promethod(); 
            
            //t.defmethod(); 
            //t.primethod(); 
        } 1 Test的promethod方法是protected,也就是不能通过Test的实例来调用promethod
    2 Test2继承Test,对Test2来说,promethod是可见的,也就是可以调用的,但是这里的调用是通过Test2的实例来调用的,同样的,如果Test2里new一个Test对象,并调用该Test对象的promethod方法,也是会出错的,原因就是1说的。
      

  2.   

     尽量在程序中不要使用protected
      

  3.   

     尽量在程序中不要使用protected
    ---
    胡说,protected有些时候是必要的。在一些时候你不需要将方法给其它类调用,但是需要给子类调用的时候是很有用的。
      

  4.   

    你在Test2类中写个自己的方法,例如:
    public void test(){
        promethod ();}
      

  5.   

    这是可见度的问题。
    protected是包可见的。
    在非继承的情况下,不同的包中是不能调protected方法的。