gpt4 book ai didi

java - 继承后保护成员行为。

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:59:34 28 4
gpt4 key购买 nike

我对 protected 标识符有一些疑问。在 K.Sierra 的 Sun Certified Java Programmer Study Guide 第一章中,我找到了以下信息:

“一旦包外的子类继承了 protected 成员,该成员(由子类继承)对子类之外的任何代码都是私有(private)的,子类的子类除外。”

我提供了反射(reflect)上述陈述的示例代码,这对我来说是绝对清楚的。

// Parent class
package package1;

import package2.Child;
public class Parent {

protected int i = 5;

}

// Child class
package package2;

import package1.Parent;

public class Child extends Parent {

// variable 'i' inherited

}


package package2;

public class Neighbour {

public void protectedTesting(){
Child child = new Child();
System.out.println(child.i); // no access
}
}

我已经开始试验并做了一个小改动——将 Neighbor 移到了 package1。并且可以访问“i”变量,这对我来说有点令人惊讶,因为它不符合声明“对子类之外的任何代码变得私有(private)”

修改后的邻居类:

package package1;

import package2.Child;

public class Neighbour {

public void protectedTesting(){
Child child = new Child();
System.out.println(child.i); // access!
}
}

请给我解释一下。谢谢。

最佳答案

简而言之,protected 是包私有(private)的,并且对子类可见。甚至 JLS 对此也含糊不清 ( JLS §6.6.2 ):

A protected member or constructor of an object may be accessed from outside the package in which it is declared only by code that is responsible for the implementation of that object.

它指定在包外,只有子类可以访问 protected 成员。这暗示您还可以访问包内的变量。措辞不佳,但 protected 成员具有包级可见性以及子类级可见性。

另见:

关于java - 继承后保护成员行为。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12861807/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com