2

我以前从未尝试过编写以下代码,因为它在生产中没有多大意义。但令我惊讶的是,这段代码编译成功。为什么它被设计为允许从同一类的实例上的静态方法调用私有方法?

public class Beverage {
    private void drink () {
        System.out.println("Beverage");
    }

    public static void main (String[] args) {    
        Beverage b = new Beverage();
        b.drink(); //call to private method!
    }
}
4

5 回答 5

6

为什么他们不能打电话给他们?private限制对同一类的访问。静态方法在同一个类中。所以它可以访问私有方法。

访问修饰符在类级别工作,而不是在实例级别。如果它们在实例级别工作,您无法编写静态工厂方法(调用私有构造函数和初始化方法)、equals()方法和compareTo方法(比较两个实例的私有字段)等。

于 2013-11-01T06:07:45.063 回答
2

访问级别修饰符确定其他类是否可以使用特定字段或调用特定方法。private访问说明符限制了类外部的可见性,但它允许方法/字段在类内部可见和可用。

于 2013-11-01T06:09:05.763 回答
1

您可以通过拥有包含非静态方法的类的实例从静态方法访问非静态方法。所以在这里

  1. 你可以调用非静态方法,因为你有一个实例

  2. 您可以将私有方法称为同一类中的两种方法。

于 2013-11-01T06:19:41.767 回答
0

静态成员是类成员,非静态成员是实例成员。在这里,您使用了一个实例来调用一个完全没问题的实例方法。但你不能像下面这样打电话。

public class Beverage {
    private void drink () {
        System.out.println("Beverage");
    }

    public static void main (String[] args) {    

        drink(); //call to private method!this is wrong no matter private or public
    }
}
于 2013-11-01T06:09:01.783 回答
0

您注意到的行为是与定义最一致的行为private

在 Java 中,private意味着“只能从同一个类中调用”。这并不意味着“只能被拥有的对象调用”。我怀疑这是 Java 起源的保留,因为与 C++ 的相似性而做出了很多决定,C++ 具有相同的定义private

它还允许你做一些事情,比如拥有一个只有private构造函数的类,以及static实例化类的方法。

于 2013-11-01T06:09:16.150 回答