Private 可见性修饰符的含义
Posted
技术标签:
【中文标题】Private 可见性修饰符的含义【英文标题】:Meaning of the Private visibility modifier 【发布时间】:2013-09-25 20:54:19 【问题描述】:在下面的“Tosee”类中,当我调用 s.hiddenInt 时,hiddenInt 是可见的。 但是,当我在另一个类“CantSee”中创建“ToSee”对象时,私有变量不可见。为什么会这样?我的印象是私有意味着在类的任何实例中,客户端都看不到那个特定的实例变量或方法?那为什么我能在 'ToSee' 的 main 方法中看到 hiddenInt 呢?
public class ToSee
private int hiddenInt = 5;
public static void main(String[] args)
ToSee s = new ToSee();
System.out.println(s.hiddenInt);
public class CantSee
public static void main(String[] args)
ToSee s = new ToSee();
System.out.println(s.hiddenInt);
【问题讨论】:
之所以称为私有是因为它只对特定类的实例可见 【参考方案1】:Java 中的私有意味着变量或方法只能在声明它的类中访问。如果您对私有的印象是真实的,那么它将无法在任何地方访问,这使得它完全无用。
【讨论】:
【参考方案2】:main
方法在 Java 中具有特殊的含义,但它仍然是属于特定类的方法。
main
方法可以通过本地实例(在实例字段的情况下)或直接(在static
字段的情况下)访问封闭类中的私有字段。
【讨论】:
【参考方案3】:修饰符 private 使变量或方法对声明它的类型(类)是私有的。所以只有这个类可以看到它。
您可以在ToSee.main
中看到变量hiddenInt
,因为ToSee.main
是TooSee
类的静态方法。因此它可以访问ToSee
的所有私有变量,无论是静态变量还是实例变量。
私有也不意味着实例私有。一个类的实例可以访问同一类的另一个实例的私有变量。
public class ToSee
private int hiddenInt = 5;
public void printInt(ToSee toSee)
System.out.println(toSee.hiddenInt);
public static void main(String[] args)
ToSee tooSee1 = new ToSee();
ToSee tooSee2 = new ToSee();
tooSee2.hiddenInt = 10;
tooSee1.printInt(tooSee2); // will output 10
【讨论】:
【参考方案4】:I was under the impression that private means that in any instance of a class,
the client cant see that particular instance variable or method?
不正确! 私有访问修饰符仅仅意味着使用它的变量只能在封闭类中访问。时期。由于您的 main() 方法位于 ToSee 类中,该类中您拥有 hiddenInt 私有实例变量,因此它是可见的。与不在 ToSee 类中的 CantSee 类一样,它是不可见的(您需要使用 getter/setter 方法。)
【讨论】:
【参考方案5】:private
意味着对于它所在的最外层封闭类之外的任何代码都不可见。由于CantSee
类与ToSee
类是分开的,因此它看不到私有字段。如果CantSee
和ToSee
都是同一类的成员,或者一个是另一个的成员,那么您将能够读取私有字段。下面是一些私有字段可读的结构示例:
public class Outer
public class ToSee
...
public class CantSee
...
或
public class CantSee
...
public class ToSee
...
【讨论】:
不,这是误导。private
表示在定义它的 类 之外不可见,而不是文件。
@DuncanJones 这措辞很糟糕,但在技术上是正确的; "A private class member or constructor is accessible only within the body of the top level class",每个文件只包含一个***类。
@DuncanJones 是的,解决了这个问题。忘了你可以在同一个文件中有两个***类。
Sam,您当前的编辑现在在技术上是不正确的,因为private
成员在内部/外部类中可见。
用一些例子修正了答案,希望减少技术上的不正确/不完整以上是关于Private 可见性修饰符的含义的主要内容,如果未能解决你的问题,请参考以下文章
private/默认/protected/public权限修饰符的区别