关键字protected
授予对相同包和子类(http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html)中的类的访问权限。
现在,每个类都有一个java.lang.Object
超类(http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html)。
因此,我得出结论,即使每个类都可以访问java.lang.Object
的方法protected
。
看下面的例子:
公共课程Testclass {
公共对象getOne()抛出CloneNotSupportedException {
返回this.clone();
}
公共对象getTwo()抛出CloneNotSupportedException {
return((Object this this).clone();
}
}
在getOne()
编译良好的同时,getTwo()
给出
Testclass.java:6:clone()在java.lang.Object中具有受保护的访问
return((Object this this).clone();
我既不理解为什么getTwo()
不编译,也不知道与的区别(关于java.lang.Object
s成员的访问权限)getOne()
。
如果引用的表达式的编译时类型是您自己的类或子类,则只能访问其他包中某个类型的受保护成员。(“
your”类是包含代码的类。)您自己的类也必须是最初声明方法的类型的子类。
这是一个例子。假定Base
与所有其他类都在不同的包中:
package first;
public class Base
{
protected void Foo() {}
}
// Yes, each class is really in its own file normally - but treat
// all the classes below as being in package "second"
package second;
public class Child extends Base
{
public void OtherMethod(Object x)
{
((Base) x).Foo(); // Invalid: Base is not Child or subclass
((Child) x).Foo(); // Valid: Child is Child
((GrandChild) x).Foo(); // Valid: GrandChild is subclass of Child
((OtherChild) x).Foo(); // Invalid: OtherChild is not Child or subclass
}
}
public class GrandChild extends Child {}
public class OtherChild extends Base {}
换句话说,它使您可以访问“像您一样的对象”的受保护成员。
详细信息在Java语言规范的6.6.2节中:
甲
protected
对象的成员或构造可以从它仅由代码中声明的封装,它负责该对象的执行外部访问。6.6.2.1访问受保护的成员
令 C 为声明受保护成员 m 的类。访问仅在一个子类的主体允许 小号 的 Ç
。此外,如果Id表示实例字段或实例方法,则:如果通过限定名称 Q.Id 进行访问,其中 Q 是 ExpressionName
,则且仅当表达式 Q 的类型为 S时 ,才允许访问或 S 的子类 。如果通过字段访问表达式 E.Id进行 访问,其中 E 为
主要对象 表达,或通过一个方法调用表达式 (。)E.Id ,其中 Ë 是一个 主要 表达,则接入是允许的,当且仅当的类型 ë 是
小号 或的一个子类 小号 。
我有两个不同包的亲子班。我正在重写受保护类型的方法。我想访问子类中的超类保护方法。 考虑以下代码: 认为我是Java新手,并在main方法中提供替代comment的答案。
问题内容: 出于好奇, 为什么将方法的访问修饰符设置为。为什么不能呢?有人可以向我解释这背后的任何具体原因吗? 另外,我知道该方法仅被调用一次。如果我在程序内部两次调用它,会发生什么情况?垃圾收集器会再次调用吗? 问题答案: 我用另一个问题回答您的问题: 为什么方法不应该受到保护? 通常,您应该尝试使事物尽可能私密。这就是封装的全部意义所在。否则,您 什么都 可以做。不能(因为派生类应该能够访问它
我尝试模拟父类的受保护方法。因此,我使用&。我的家长班。
问题内容: 定义为的受保护的具体原因是什么? 问题答案: 克隆受到保护的事实非常令人怀疑-事实是该clone方法未在Cloneable接口中声明。 它使该方法对于获取数据副本非常无用,因为你不能说: 我认为,Cloneable现在的设计在很大程度上被认为是一个错误(以下引用)。我通常希望能够实现接口的实现,Cloneable但不一定要实现接口Cloneable(类似于的使用Serializable
6xx受保护 600 Series,Repliesregardingconfidentialityandintegrity 631 Integrityprotectedreply. 632 Confidentialityandintegrityprotectedreply. 633 Confidentialityprotectedreply.
问题内容: 如何在受保护的python类中定义一个方法,只有子类才能看到它? 这是我的代码: 我只希望看到的方法的子类。 问题答案: Python不像C ++ / Java / C#支持访问保护。一切都是公开的。座右铭是:“我们都是成年人。” 记录下您的课程,并坚持要求您的合作者阅读并遵守文档。 Python的文化是,以下划线开头的名称意味着:“除非您真正知道应该使用这些名称,否则请不要使用它们。