程序如下:
类A:
package cn;public class A {
protected void proMethod()
{
System.out.println("base protected method");
}
}A中有protected方法。B类为A类的子类(包名不同):package com;
import cn.A;;
public class B extends A{
public static void main(String[] args) {
  A a = new A();
  a.proMethod();
}
}以上B中的a.proMethod();出错。出错信息为:The method proMethod() from the type A is not visible为什么?protected方法不是可以对子类公开的吗?

解决方案 »

  1.   

    补充一下:以上jdk在1.4和1.5中都试过。
      

  2.   

    看来你还没有理解什么是对子对象公开,对子对象公开是指在子类内部可以直接调用这个方法,如果像上面那么调用就得是public的了,可以将a.proMethod();改成proMethod();
      

  3.   

    我这样认为不知道是对错:
     
    protected 中对子类可见,这个没有错。
    错在:类B和类A不在同一个包,同时,你是在main方法用类A生成的对象调用方法proMethod()
    public static void main(String[] args) 这个方法是一个特殊的方法,是静态,只是给运一个类的入口。基本上不属于这个类。你的代码改为:
      public static void main(String[] args) {
      B a = new B();
      a.proMethod();
    }
    就可以了,因为B已经继承了A中的这个方法
      

  4.   

    楼上的同学给出了正确的答案,虽然,B可以看见proMethod,但是,它却不能调用a对象的proMethod方法。
      

  5.   

    to:wzlsquall(亮亮)
    你的意思我大概明白了。
    把B改为:
    package com;
    import cn.A;
    public class B extends A{
     A a = new A();
    public void fn()
    {
    proMethod();
    }
    public static void main(String[] args) {
      A a = new A();
      //a.proMethod();
    }
    }
    是可以的。
    我理解为对子类公开 和 子类可以继承这个方法的意思是完全一致的。
      

  6.   

    lz记住,当父类和子类不在同一个包内的情况下,子类不能够通过父类的引用来访问父类中的protected方法,只能通过自身引用这种继承的方式来访问,就像楼上写的那样
      

  7.   

    谢谢dreamfly_888() 。
    我觉得你的说法中有点问题,请指教:
    》》你是在main方法用类A生成的对象调用方法proMethod()
    public static void main(String[] args) 这个方法是一个特殊的方法,是静态,只是给运一个类的入口。基本上不属于这个类。如果我用一个成员方法中,或者直接把A作为B的属性的话,调用A的对象的proMethod方法也是不可以的。所以我还是同意wzlsquall(亮亮)和sonyejin(和着音乐,一个球飞过来——新闻联播开始了) 。
      

  8.   

    protected 在包外继承时候可见,不是对象调用时候可见
      

  9.   

    a声明类型是A.
    对于编译器来讲编译器只知道B的超类是A,并不知道A有哪些子类.
    在a看来,"我现在在一个与我的类毫不相干的类中,而且这个类和我还不在一个包内"
      

  10.   

    谢谢dreamfly_888() 。
    我觉得你的说法中有点问题,请指教:
    》》你是在main方法用类A生成的对象调用方法proMethod()
    public static void main(String[] args) 这个方法是一个特殊的方法,是静态,只是给运一个类的入口。基本上不属于这个类。如果我用一个成员方法中,或者直接把A作为B的属性的话,调用A的对象的proMethod方法也是不可以的。所以我还是同意wzlsquall(亮亮)和sonyejin(和着音乐,一个球飞过来——新闻联播开始了) 。
    //==============================================
    你的理解,和我想说的是有点偏差。
    ---protected 中对子类可见,这个没有错。
    错在:类B和类A不在同一个包,同时,你是在main方法用类A生成的对象调用方法proMethod()
    ----我想说的,重点是上面这句。 
    --下面这句是想强调main是一个特殊方法,不过用在这里确实会引起这样的想法:
    “是不是我不在main()方法中,而在别的方法中这样写就可以了”,这个是我的错
    ----
    public static void main(String[] args) 这个方法是一个特殊的方法,是静态,只是给运一个类的入口。基本上不属于这个类。你的代码改为:
      public static void main(String[] args) {
      B a = new B();
      a.proMethod();
    }
    就可以了,因为B已经继承了A中的这个方法