日期:2014-05-20  浏览次数:20771 次

请教:关于protected的问题。
程序如下:
类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方法不是可以对子类公开的吗?



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

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中的这个方法


------解决方案--------------------
楼上的同学给出了正确的答案,

虽然,B可以看见proMethod,但是,它却不能调用a对象的proMethod方法。
------解决方案--------------------
lz记住,当父类和子类不在同一个包内的情况下,子类不能够通过父类的引用来访问父类中的protected方法,只能通过自身引用这种继承的方式来访问,就像楼上写的那样
------解决方案--------------------
protected 在包外继承时候可见,不是对象调用时候可见
------解决方案--------------------
a声明类型是A.
对于编译器来讲编译器只知道B的超类是A,并不知道A有哪些子类.
在a看来, "我现在在一个与我的类毫不相干的类中,而且这个类和我还不在一个包内 "