A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 顾传文 中级黑马   /  2013-3-8 10:55  /  1537 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 顾传文 于 2013-3-8 12:31 编辑

package A;//A包
public class Fu {
    protected void show(){
       System.out.println("父类show方法");
    }
}
package B;//B包
import A.Fu;
public class Zi extends Fu{
    public static void main(String[] args) {
       Fu fu = new Fu();
       fu.show();//编译不通过
       Zi zi = new Zi();
       zi.show();//编译通过
    }
}
记得访问修饰符是在子类中有访问权限的,为什么上面的代码,一句编译通过,而另一句没通过呢?

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

8 个回复

倒序浏览
因为show方法是在fu类中,并被protected所修饰,protected意思是受保护的,该修饰符是对其他类访问该show方法进行一定程度的限制
当父类对象调用show方法时,是通过的。
当子类对象调用该方法时,由于该方法被protected所修饰,调用此方法时,会受到限制,使其不能被其他类的对象调用

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
我想说你写错了吧?这个fu.show();编译不通过吧,因为父类的是protected 修饰的只能同包下访问
回复 使用道具 举报
本帖最后由 袁见 于 2013-3-8 11:30 编辑

                   访问控制级别表

                      private        default        protected        public
同一个类中:     是              是                 是                   是
同一个包中:                       是                是                  是
子类中:                                                  是                 是
全局范围内:                                                                 是

Zi zi = new Zi();zi.show();//编译不通过
这两句代码是能通过的啊!


评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
挺纠结的一个问题,其实Zi类既然已经继承了Fu,何必还建立Fu类的对象调用Fu类的方法呢。我试过了对象时可以建立的但是如果加上fu.show();方法是会提示编译通不过。
Zi.java:12: show() 可以在 A.Fu 中访问 protected
       fu.show();
编译器估计就是叫你别做这种多此一举的事情。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
本人也觉得这是一个比较纠结的问题,看来java有的地方真是十分微妙啊,我试了试,这个问题在同包下是没问题的,看来就出在protected这个修饰符身上啦!
细细品味一下下面红色的字。
请看:



  1. package A;//A包
  2. public class Fu {
  3. protected void show(){
  4. System.out.println("父类show方法");
  5. }
  6. }

  7. package B;//B包
  8. import A.Fu;
  9. public class Zi extends Fu{
  10. public static void main(String[] args) {
  11.   Fu fu = new Fu();
  12. fu.show();//编译不通过
  13. Zi zi = new Zi();
  14. zi.show();//编译通过
  15. }
  16. }
复制代码
这里我在 Zi 继承另一个包中的Fu,这个Fu中有一个名为show()的protected方法。在Zi 类中调用Zi 类的实例zi 的show()方法,编译不会报错。而同样调用Fu类的实例fu的show()方法,编译报错!protected方法不是可以被子类访问的吗?
从接触Java开始就了解Java中访问修饰符的权限可以用下面这个表格概括:

作用域
当前类
同包
子孙类(不同包)
其他
public
Y
YYY
protected
Y
Y
Y
N
default
Y
Y
N
N
private
Y
N
N
N
default为不写访问修饰符时。

现在必须明确的是:类Zi确实是继承了类Fu(包括它的show方法),所以在类Zi中可以调用自己的show方法。但类Fu的protected方法对其不同包子类Zi来说,是不可见的。
注意protected访问修饰符的规则及其微妙。

评分

参与人数 1技术分 +1 收起 理由
洪建超 + 1

查看全部评分

回复 使用道具 举报
被protected修饰的成员只有子类才可以访问,Fu不是自身的子类,无法访问。
回复 使用道具 举报
整个修饰符有意思啊    一个类在不同包的子类中创建了对象  却不能访问本类中的protected方法   那应该也不能访问本类的私有成员变量吧  那这个类怎么创建的呢?  
回复 使用道具 举报
本帖最后由 黑马17期-闫东东 于 2013-3-10 21:33 编辑

           private  :仅本类成员可见
       default  :本类+同包类可见(默认)
          protected:本类+同包+不同包的子类
       public   :公开
protected void show(){  }
show()方法拥有  protected访问修饰符,但  你父类对象引用去调用show()方法就就错误了,
protected修饰符不同包下的子类可以访问,是指子类可以访问父类的成员方法,属性。如zi.show()正确,而不是说可以通过父类实例去访问成员方法。
        

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马