请教:关于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看来, "我现在在一个与我的类毫不相干的类中,而且这个类和我还不在一个包内 "