zoukankan      html  css  js  c++  java
  • protected修饰符详解

    protected这个修饰符,各大参考书都会这样说:访问权限为类内,包内和子类,因此在父类中定义的方法和成员变量如果为protected修饰的,是可以在不同包中的子类进行访问的,示例代码如下:

    1 package cn.tedu.object.a;
    2 
    3 public class A {
    4     
    5     protected void m(){
    6         System.out.println("A m~~~");
    7     }
    8 
    9 }
     1 package cn.tedu.object.b;
     2 
     3 import cn.tedu.object.a.A;
     4 
     5 public class B extends A {
     6     void callM() {
     7         m();
     8         super.m();
     9         B b = new B();
    10         b.m();
    11     }
    12 }

    如上代码所示,class B继承了class A,但是两个类位于a、b两个不同的包中,此时class B可以直接访问class A中的protected修饰的方法。一共有三种方法访问:

    第一种为第7行,直接调用;

    第二种为第8行,加super关键字;其实前两种是等效的。

    第三种为第9、10行,实例化一个对象进行调用。

    那么问题来了,如果说在b包中新建一个class C,并且有如下代码,会报错吗?

     1 package cn.tedu.object.b;
     2 
     3 import cn.tedu.object.a.A;
     4 
     5 public class C extends A {
     6 
     7     void callM() {
     8         m();
     9         super.m();
    10         B b = new B();
    11         b.m();     //The method m() from type A is not visible
    12     }
    13 
    14 }

    会报错!那为什么会报错呢?

    因为b.m()这种调用属于子类对象调用,并不是子类调用。

    这个是非常需要引起注意的。因此,当创建子类对象调用父类的protected成员变量时,必须要注意:子类对象和子类是对应的!

    通过这个例子其实也可以看出来,当一个包外子类继承保护成员时,该成员在这个子类内实际上变为私有。

    事实上,除了以上三种调用父类protected成员变量的方法外,其余都是会报错的!

    包括用超类实例去访问。代码如下:

     1 package cn.tedu.object.b;
     2 
     3 import cn.tedu.object.a.A;
     4 
     5 public class B extends A {
     6     
     7     void callM() {
     8         A a=new A();
     9         a.m();  //The method m() from type A is not visible
    10     }
    11 
    12 }

    同样的,会报错!因此,可以得到结论:

    包外子类有权访问超类成员,它指子类继承该成员,然而,这并不意味着包外子类能够使用超类实例的引用访问该成员。

     
  • 相关阅读:
    纪念我用word发布的第一篇文章
    第一个SpringMVCHelloWorld
    JSTL学习笔记
    bonecp的使用
    hdu 1556 树状数组
    hdu 1561 树形DP
    MYSQL使用笔记
    Android中简单实现Spinner的数据绑定
    Android中利用Application实现多个Activity间共享数据
    技术到底重要不重要?
  • 原文地址:https://www.cnblogs.com/haojiejiejie/p/8762768.html
Copyright © 2011-2022 走看看