为什么我可以调用私有方法?

时间:2011-08-08 22:41:29

标签: java core

我不应该能够调用实例化对象的私有方法。我想知道为什么下面的代码有效。

public class SimpleApp2 {
    /**
     * @param args
     */
    private int var1;

    public static void main(String[] args) {
        SimpleApp2 s = new SimpleApp2();
        s.method1(); // interesting?!
    }

    private void method1() {
        System.out.println("this is method1");
        this.method2(); // this is ok
        SimpleApp2 s2 = new SimpleApp2();
        s2.method2(); // interesting?!
        System.out.println(s2.var1); // interesting?!
    }

    private void method2() {
        this.var1 = 10;
        System.out.println("this is method2");
    }
}

我知道可以从类中访问私有方法。但是,如果类中的方法实例化同一个类的对象,那么范围规则是否应该应用于该实例化对象?

像main这样的静态方法可以访问该类的非静态成员吗​​?如本例所示?

8 个答案:

答案 0 :(得分:11)

您的main方法是SimpleApp的方法,因此可以调用SimpleApp的私有方法。

仅仅因为它是一个static方法并不会阻止它在publicprivate等方面表现得像一个方法。private只会阻止其他类来访问SimpleApp的方法。

答案 1 :(得分:3)

因为main也是SimpleApp的成员。

答案 2 :(得分:2)

来自Java Tutorial

  

私人修饰符 - 该字段只能在自己的类

中访问

main方法与私有方法位于同一个类中,因此可以访问它。

答案 3 :(得分:2)

private意味着“只有这个课程中的东西可以乱用它”。它意味着“只有这个实例可以调用它的方法”,这似乎是你所期待的。 SimpleApp中的任何代码都可以使用任何SimpleApp中的任何内容。另一种方法是打破封装 - 例如,如果不需要访问另一个实例的字段,而不创建那些字段equals甚至{{1},您将如何制作正确的protected方法或者要求获取只能在类中可用的数据的getter?

答案 4 :(得分:2)

见下图

访问修饰符

                     **Same Class    Same Package   Subclass   Other packages**
**public**                Y               Y            Y              Y
**protected**             Y               Y            Y              N
**no access modifier**    Y               Y            N              N
**private**               Y               N            N              N

由于您的方法在车内,因此可以根据上述拇指规则进行操作。

答案 5 :(得分:0)

因为private范围限制了对定义方法的类的访问权限,并且您的main恰好位于同一个类中。

  

私人修饰符 - 该字段只能在自己的类中访问。

请参阅Java文档中的Access Modifiers

答案 6 :(得分:0)

您发出的呼叫来自私有方法所在的同一个类。这是允许的。这就是在java中定义'private'的方式。

答案 7 :(得分:0)

在程序中,我们使用了两个私有方法创建了类的两个实例。看到这个工作的一个有趣之处在于,这是我们使用对象引用在类之外调用公共或默认方法的方式。在这种情况下,它都在类定义中完成,因此它是有效的。放在类外的相同代码将导致错误。