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.mainTooSee 类的静态方法。因此它可以访问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 类是分开的,因此它看不到私有字段。如果CantSeeToSee 都是同一类的成员,或者一个是另一个的成员,那么您能够读取私有字段。下面是一些私有字段可读的结构示例:

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 可见性修饰符的含义的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin 中内部可见性修饰符的范围

private/默认/protected/public权限修饰符的区别

Koltin——最详细的可见性修饰符详解

Kotlin学习笔记之可见性修饰符

Objective-C:你在你的代码中使用@private 可见性/访问修饰符吗?

public private protected 三种访问修饰符在c#中的区别