在一权威的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方法或变量之外。)
分享到:
相关推荐
NULL 博文链接:https://837062099.iteye.com/blog/1609340
java中public、protected、默认、private关键字
Java类protected继承链访问控制机制研究
主要介绍了Java编程中protected关键字与static关键字的作用,是Java入门学习中的基础知识,需要的朋友可以参考下
java中50个关键字的作用 Abstract break continue final protected ==
父子类可以是不同包 在不同包下面只有public 与 protected 可以访问,而且protected必须是在继承关系下才能够访问
用java代码来解析private、public、default、protected的权限问题
JAVA 访问修饰符 及 protected 几点被人忽略的致命要害,不看后悔哦,亲
java八股文 "Java八股文"通常指的是一种简单的模板化回答,用于解答关于Java编程语言的基础... Java中的四种访问权限是public、protected、default和private,分别表示公开、受保护、默认(包内可见)和私有。 5. **J
下面小编就为大家带来一篇Java中的private、protected、public和default的区别(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
该类有两个构造方法Person()和Person(姓名,性别,年龄),构造方法Person()中设置姓名,性别为空字符串,年龄为0,构造方法Person(姓名,性别,年龄)中设置姓名,性别只能为“男”或“女”,年龄大于0、小于...
2.2.3 Java中的数组 2.3 绝对不要清除对象 2.3.1 作用域 2.3.2 对象的作用域 2.4 新建数据类型:类 2.4.1 字段和方法 2.5 方法、自变量和返回值 2.5.1 自变量列表 2.6 构建Java程序 2.6.1 名字的可见性 2.6.2 使用...
最近在实现java项目对discuz的整合。 网上资料好多,大家可百度,google 现将java代码传上 需要修改config....protected String urlencode(String value){ return urlencode(value, "GBK"); } 换UTF-8或其他
Java 访问修饰符 public protected private
Java语言定义了public、protected、private、abstract、static和final这6常用修饰词外还定义了5个不太常用的修饰词,本文简单介绍了这11个Java修饰词。
2.2.3 Java中的数组 2.3 绝对不要清除对象 2.3.1 作用域 2.3.2 对象的作用域 2.4 新建数据类型:类 2.4.1 字段和方法 2.5 方法、自变量和返回值 2.5.1 自变量列表 2.6 构建Java程序 2.6.1 名字的可见性 2.6.2 使用...
答案:Java中的访问修饰符有public,protected,private,以及默认的(即不写任何修饰符)。它们分别表示对其他类或者其他包的访问权限。其中,public表示所有类都可以访问,protected表示同一包中和子类中可以访问...
答:protected`: `protected` 是 Java 中的一种访问修饰符,它用于指定一个成员变量或方法 可以被同一包内的类和所有子类访问。在访问控制方面,`protected` 介于 `public` 和 `private` 之间。在编程中,`protected...
C、在Java中一个类不能同时继承一个类和实现一个接口。D、在Java中类只允许单一继承。 17. 下列类定义中,不正确的是(C )。 A) class x { .... } B) class x extends y { .... } 1 C) static class x implements y1...
2.2.3 Java中的数组 2.3 绝对不要清除对象 2.3.1 作用域 2.3.2 对象的作用域 2.4 新建数据类型:类 2.4.1 字段和方法 2.5 方法、自变量和返回值 2.5.1 自变量列表 2.6 构建Java程序 2.6.1 名字的可见性 2.6.2 使用...