为啥我可以从 main 方法访问私有变量?

Posted

技术标签:

【中文标题】为啥我可以从 main 方法访问私有变量?【英文标题】:Why can I access a private variable from main method?为什么我可以从 main 方法访问私有变量? 【发布时间】:2011-06-10 02:24:38 【问题描述】:
package com.valami;

 public class Ferrari
 
  private int v = 0;


  private void alam()
  
   System.out.println("alam");
  

  public Ferrari()
  
   System.out.println(v);
  



  public static void main(String[] args)
  
   Ferrari f = new Ferrari();
   f.v = 5;
   System.out.println(f.v);
  

 

大家好! 我有一个简单的问题.... 为什么我可以从 main 方法访问私有变量?我知道,我在包含类中,但它是主要的。我相信 main 不是包含它的类的一部分......然后我不会联系私人成员,但我可以......为什么? 请帮忙...谢谢

【问题讨论】:

【参考方案1】:

类可以访问相同类型的(其他)对象的私有实例变量。

以下也是可能的

public class Foo 

    private int a;

    public void mutateOtherInstance(Foo otherFoo) 
        otherFoo.a = 1;
    

你可以争论这是否可取,但 JLS 指定这是合法的只是生活规则。

【讨论】:

赞成 - 我从来不知道这是可能的。我是 C# 人而不是 Java,但我刚刚在 C# 中对此进行了测试,它的工作方式相同。 这在 C# 中也是可能的,我认为 C++(但不要引用我的话),当你有当前对象(this)和相同的实例时,非常适合内部排序和 equals 函数类,需要比较私有数据。 有趣,我从来不知道 C#。在 C++ 中,这绝对是合法的。 @ArjanTijms 我想了解更多关于此的内容。你能帮我找到一个链接吗?我不确定我应该搜索什么。 @varunl 在我的脑海中,这本书至少解释了它:amazon.com/dp/0071591060 您可能想查看 JSL 以查看它是否包含更多细节。【参考方案2】:

Main 是你类的一部分,你已经在你的类中声明了它:) main 不是你的对象的一部分,它不会是你从类中创建的对象的任何部分,但它仍然是类的一部分。这对于任何静态函数都是正确的,因为 main 只是一个普通的静态函数,框架知道它应该在程序执行时查找它。

【讨论】:

【参考方案3】:

main 方法在 Ferrari 类中,因此可以访问私有变量,即使它是静态的。

【讨论】:

【参考方案4】:

好吧,main() 包含类的一部分。实际上,main() 与其他所有方法完全一样,只是您可以启动 JVM 并告诉它从命令行运行某个类的 main() 方法。

【讨论】:

【参考方案5】:

只要私有变量与 main() 方法在同一个类中,那么 main() 方法就可以访问它。通常,即使是静态方法也可以访问同一类实例的私有字段。

【讨论】:

【参考方案6】:

main 方法的唯一特殊功能是它用于告诉编译器应该从哪里开始执行程序。除此之外,它的行为与任何其他类方法一样,并且可以像任何其他类方法一样访问私有变量。

【讨论】:

【参考方案7】:

因为 main 是静态的并且你的类还没有被实例化。

例如,您没有可访问的 Ferrari 对象。您必须创建一个 Ferrari 对象,然后访问它的成员。 static main 是一个特殊的静态函数。如果你愿意,你可以把它看作是一种独立的。因此,如果您将 main 方法移到 Ferrari 之外,您会期望您必须创建一个 Ferrari 实例才能使用它......这里也是一样。

【讨论】:

以上是关于为啥我可以从 main 方法访问私有变量?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我能够从在同一对象的另一个实例上调用的方法访问一个实例的私有实例变量? [复制]

从 C++ 中的类访问私有变量

为啥我可以在复制构造函数中访问私有变量?

为啥我应该在属性访问器中使用私有变量?

[从Java中的其他类访问私有变量

为啥 var_dump 可以确定私有变量的值,但在尝试访问单个属性时却不能