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

 package cn.tedu.object.a;

 public class A {

     protected void m(){
System.out.println("A m~~~");
} }
 package cn.tedu.object.b;

 import cn.tedu.object.a.A;

 public class B extends A {
void callM() {
m();
super.m();
B b = new B();
b.m();
}
}

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

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

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

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

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

 package cn.tedu.object.b;

 import cn.tedu.object.a.A;

 public class C extends A {

     void callM() {
m();
super.m();
B b = new B();
b.m(); //The method m() from type A is not visible
} }

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

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

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

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

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

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

 package cn.tedu.object.b;

 import cn.tedu.object.a.A;

 public class B extends A {

     void callM() {
A a=new A();
a.m(); //The method m() from type A is not visible
} }

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

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

 

protected修饰符详解的更多相关文章

  1. Java之Static静态修饰符详解

    Java之Static静态修饰符详解 Java之Static静态修饰符详解 一.特点 1.随着类的加载而加载,随着类的消失而消失,生命周期最长 2.优先于对象存在 3.被所有类的对象共享 4.可以直接 ...

  2. abstract关键字、final关键字、static关键字、访问修饰符详解

     abstract关键字.final关键字.static关键字.访问修饰符详解 abstract关键字: final关键字: static关键字: 访问修饰符:

  3. Koltin——最详细的可见性修饰符详解

    在Kotlin中,不管是类,对象,接口,构造函数,函数,属性及其设置器都具有可见性修饰符.Kotlin中的可见性修饰符共四种.即public.protected.private.internal.在不 ...

  4. Kotlin——中级篇(三):可见性修饰符详解

    在Kotlin中,不管是类,对象,接口,构造函数,函数,属性及其设置器都具有可见性修饰符.Kotlin中的可见性修饰符共四种.即public.protected.private.internal.在不 ...

  5. C#修饰符详解

    不定期更新,2017.8.9 一.new 别看new这个修饰符经常用,恐怕很多人都不知道其本质.我们先来看看new修饰符的官方定义: new 仅允许在嵌套类声明中使用,表明类中隐藏了由基类中继承而来的 ...

  6. java中的访问修饰符详解

    主要讲述一下java中protected的修饰控制范围. 在叙述protected修饰符使用之前,先来说一下java,可以发现,开发java程序是一个时时刻刻都在编写类.开发类.定义类的过程.类里面可 ...

  7. C# 中4个访问符和8个修饰符详解

    4个访问修饰符(是添加到类.结构或成员声明的关键字) Public:公有的,是类型和类型成员的访问修饰符.对其访问没有限制. Internal:内部的,是类型和类型成员的访问修饰符.同一个程序集中的所 ...

  8. C# 之 4个访问修饰符和8个声明修饰符详解

    一.4个访问修饰符(是添加到类.结构或成员声明的关键字) [1] Public:公有的,是类型和类型成员的访问修饰符.对其访问没有限制. [2] Internal:内部的,是类型和类型成员的访问修饰符 ...

  9. C#.net 中 修饰符 详解 (来自MSDN)

    自己理解的不够深刻,无奈基础较差!记上一笔,记忆深刻些,哈哈…… 1. 访问修饰符 public 同一程序集中的任何其他代码或引用该程序集的其他程序集都可以访问该类型或成员. private 只有同一 ...

随机推荐

  1. spring定时器quartz版本问题

    如果quartz的版本是1.8.5启动会报错,修改给2.0版本以上即可 <dependency> <groupId>org.quartz-scheduler</group ...

  2. 6.spring:AOP(注解)

     spring Aop AOP面向切面编程,与OOP面向对象编程相辅相成 AOP中最基本的单元是切面 问题: 代码混乱:越来越多的业务需求(日志&验证)加入后,原有的业务方法急剧膨胀,每个方法 ...

  3. 面试准备——(二)专业知识(2)Python

    面试遇到的问题: 滴滴: 1. Python的数据结构 2. list和tuple的区别 3. list中有哪些操作?append和extend的区别? 4. list和dict的却别?dict是有序 ...

  4. Android平台上PMEM的使用及Platform设备注册(二)

    三.注册PMEM设备 这里我们除了描述PMEM设备,还将注册一个拥有memory空间和IRQ资源的示例设备example_device. 对于example_device,定义如下结构体: stati ...

  5. Xcode 7提示App Transport Security has blocked a cleartext HTTP (http://) resource load的解决办法

    Xcode 7提示App Transport Security has blocked a cleartext HTTP (http://) resource load的解决办法   今天使用Xcod ...

  6. 微信小程序,搜索结果关键词高亮 wxml不能动态识别html标签

    wxml中使用rich-text标签放置动态html标签 js:

  7. Azure服务器上不了外网

    将服务器的DNS改成223.5.5.5或者223.6.6.6

  8. 使用dbca命令静默卸载数据库

    1)     help查询dbca的选项 su - oracledbca -help dbca [-silent | -progressOnly | -customCreate] {<comma ...

  9. AFNetworking 打印错误信息(二进制信息)

    AFNetworking 打印错误信息(二进制信息) NSError *underError = error.userInfo[@"NSUnderlyingError"]; NSD ...

  10. 『ACM C++』 Codeforces | 1003C - Intense Heat

    今日兴趣新闻: NASA 研制最强推进器,加速度可达每秒 40 公里,飞火星全靠它 链接:https://mbd.baidu.com/newspage/data/landingsuper?contex ...