在一权威的java教材中提到“protected" 修饰的方法和属性对于包外的子类是可见的,其实这个表达有些不够严密,导致很多人产生歧义。经过论坛讨论和大量的程序测试,对“protected"语义的探究逐渐明晰。现总结如下:

(1)除了在(2)中表述的有关继承方面的区别之外,在某个类中定义的protected 方法和属性(注意是定义的,不是继承而来的,对于继承而来的情况在(2)中有表述)和默认权限方法和属性是一样的。比如,某类的protected 方法和属性在包外是不能通过该类对象进行访问的(你能在包外访问一个类的默认权限的方法和属性吗?当然不能),这就是为什么在某对象所在的包的以外的任何地方,你不可以通过该类的对象引用来调用它的protected 方法和属性,哪怕是在该类的子类中也不可以这样做。在该类包外的子类中能“看到“的只是子类自己继承来的protected 方法和属性,它是不能“看到“它的父类对象的protected方法和属性的。

(2)protected 修饰的方法和属性和默认权限方法和属性的区别在于:在包外的子类可以继承protected 方法和属性,而且被继承的protected 方法和属性,在子类中仍然是protected(如果方法没有被override),但是要注意的是,我这里说它们仍然是protected,是从它们可以由该子类的包外的子类继续继承的递归性角度来说的,实际上它们的可见范围和该子类中新定义的protected 方法和属性是有区别的 。不同之处在于在该子类中新定义的protected 方法和属性对该子类所在的包是可见的。而从父类中继承的protected 方法和属性在该子类所在的包中仅仅对该子类是可见的,同时另外它们还享有被继承前的可见范围(即被被继承前的可见范围仍然保持。这让人想起oop中的一个原则,方法和属性被继承后,其可见的范围只能扩大,不能缩小)。比如某类中定义某个protected方法,那么在该类所在的包中是可以访问该类的包外的子类的通过继承得到的该protected方法的(尽管该子类是在包外)。同时不可以在该类(代号A)的包外定义的某个类B中调用类A的子类SA的继承该类得到的该protected 方法(类B可以是A子类也可以不是A子类,类SA可以是在任何一个包中,但是B和SA是不同的两个类)。

(3)对于构造函数,protected修饰词带给它的语义本质上和带给其他方法的是一样的。但因为构造函数相比一般的方法有特别之处,所以protected语义在具体体现上也会有些不同。比如构造函数不存在继承的问题,但是构造函数有一个隐含或显式super()调用的问题。如果您对protected语义有了本质的认识,您一定能想到,你在包外的任何地方你都不能用new的方式直接调用某类的protected构造函数,但是在该类的包外的子类的构造函数中,是可以隐含地调用前者的protected构造函数的,也可以显式的通过super()调用(这个不难理解,就像他的其他protected方法可以用super.的方式来调用一样)。另外提醒下,构造函数从来都不是继承得来的,构造函数的可见性和父类的构造函数的可见性没有什么必然联系。

(4)综述之,protected的确切语义是:protected修饰的方法或变量将会被任何位置的子类继承,但是永远只能被最早定义他的父类所在的包的类所见(除了该类以及其子类能看到本身的该protected方法或变量之外。)

java protected 构造方法_Java中protected语义解释相关推荐

  1. java random构造方法_Java中的Random()函数及两种构造方法

    Java中存在着两种Random函数: java.lang.Math.Random; 调用这个Math.Random()函数能够返回带正号的double值,该值大于等于0.0且小于1.0,即取值范围是 ...

  2. java file构造方法_Java中FileOutputStream类的常用方法

    今天动力节点java学院小编将为大家分享Java中FileOutputStream类的常用方法,希望通过此文能够帮助到大家,下面就随小编一起看看Java中FileOutputStream类的常用方法都 ...

  3. java 生成构造方法_Java中的构造方法

    Java中的构造方法(构造器) 定义 一个在创建对象时自动被调用的特殊方法 作用 为对象进行初始化(成员变量)工作,即初始化类对象的属性,而构造对象是通过new关键字 特征 构造器是一种特殊的方法 构 ...

  4. java默认作用域_java中默认的作用域

    Java期末复习题全_其它_高等教育_教育专区.JAVA语言程序设计(第2版)吕凤翥 马浩编著 第一部分 Java 语言概述 1 选择题 1-1 在下列概念中,Java 语言只保留了 ...... ( ...

  5. java show过时_Java中show() 方法被那个方法代替了? java编程 显示类中信

    你说的show是swing里的吧,在老版本中Component这个超类确实有show这个方法,而且这个方法也相当有用,使一个窗口可见,并放到最前面.在jdk5.0中阻止了这个方法,普遍用setVisi ...

  6. java 序列化实例_Java中的序列化与反序列化实例

    创建的字节流与平台无关.因此,在一个平台上序列化的对象可以在另一个平台上反序列化. 为了使Java对象可序列化,我们实现java.io.Serializable可序列化接口. ObjectOutput ...

  7. java幻灯片效果_java中怎么实现幻灯片切换特效?详细实例展示

    在java的使用过程中,我们会发现它的功能真的很强大,完成内容也极其丰富.今天就给大家介绍一下如何在java中实现幻灯片切换特效,以及通过实际的代码来为大家展示. 在最开始,需要说明的是,这个代码是实 ...

  8. java 数据类型分为_JAVA中分为基本数据类型及引用数据类型

    byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0 short:短整型,在内存中占16位,即2个字节,取值范围-32768~32717,默认值 ...

  9. java 字符串总结_Java中字符串(String)总结

    先说说JDK API: JDK中包含大量的API类库,所谓API(Application Programming Interface,应用程序编程接口,这些功能以类的形式封装). JDK API包含的 ...

  10. java set 空值_Java中如何更优雅的处理空值

    经常看到项目中存在到处空值判断的情况,这些判断,会让人觉得摸不着头绪,它的出现很有可能和当前的业务逻辑并没有关系.但它会让你很头疼.有时候,更可怕的是系统因为这些空值的情况,会抛出空指针异常,导致业务 ...

最新文章

  1. Matlab图像复原(运动模糊、散焦模糊)
  2. 分布式TCP压力测试工具 tcpcopy
  3. pyglet and opengl -- 纹理映射以及动画
  4. 按时间片轮转调度算法(C++实现)
  5. ACM-ICPC 2018 沈阳赛区网络预赛 F. Fantastic Graph(有源上下界最大流 模板)
  6. matlab根据转移函数绘制放大器幅频响应和相频响应
  7. P1971 [NOI2011]兔兔与蛋蛋游戏
  8. 基于LVS对LAMP做负载均衡集群
  9. html怎么用js播放音频,用Javascript播放音频?
  10. 程序为什么非得装入内存再执行?
  11. JS规则 自加一,自减一 ( ++和- -) 【mynum = mynum + 1;//等同于mynum++;】
  12. uniapp - 接入科大讯飞语音评测
  13. Milogs客户销售工作日志软件系统简介
  14. Ti的C28x系列的DSP(28069)(28377D)使用经验,CMD文件
  15. Hive分区修复msck repair
  16. 如何给Word参考文献加方括号
  17. 洛谷P2141珠心算测验
  18. android开发中,apk文件安装到\system\app 的解决办法 仅限root机
  19. 计算机自定义桌面设置在哪里设置,桌面显示日历设置方法
  20. PS-sixday-裁剪和切片(标尺使用)

热门文章

  1. 安卓手机做电脑摄像头(USB连接1080P 60FPS低延迟非常稳定)
  2. 产品读书《B端产品经理必修课:从业务逻辑到产品构建全攻略》
  3. BLE 技术(四)--- 链路层五种通信模式和空口协议设计 (Core_v5.2)
  4. Spring Cloud Alibaba Nacos Config - - - >多配置文件/共享配置
  5. CSO246未能找到类型或命名空间名“System“(是否缺少using指令或程序集引用?)
  6. 84消毒液和酒精混合的化学反应分析
  7. 0704-Scala函数式编程高级
  8. 在线预览服务器搭建,『配置』服务器搭建 Office Online Server2016 实现文档预览 番外 错误篇...
  9. 《江村经济》读书摘记
  10. 笔记本电脑计计算机硬盘分区,笔记本电脑如何分区,教您笔记本电脑如何分盘...