我之前从未尝试过编写以下代码,因为它在生产中没有多大意义。但令我惊讶的是,这段代码成功编译。 为什么它被设计为允许在同一个类的实例上从静态方法调用私有方法?
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!
}
}
答案 0 :(得分:6)
为什么他们不能打电话给他们? private
限制访问同一个类。静态方法属于同一类。所以它可以访问私有方法。
访问修饰符在类级别工作,而不是在实例级别工作。它们在实例级别工作,您无法编写静态工厂方法(调用私有构造函数和初始化方法),equals()
方法和compareTo
方法(比较两个实例的私有字段)等。< / p>
答案 1 :(得分:2)
访问级别修饰符确定其他类是否可以使用特定字段或调用特定方法。 private
访问说明符限制了类外部的可见性,但它允许方法/字段在类中可见和可用。
答案 2 :(得分:1)
您可以通过包含非静态方法的类的实例从静态方法访问非静态方法。所以这里
您可以调用非静态方法,因为您有实例
您可以将私有方法作为同一类中的两种方法调用。
答案 3 :(得分: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
}
}
答案 4 :(得分:0)
您注意到的行为是与private
定义最为一致的行为。
在Java中,private
表示“只能从同一个类中调用”。它并不意味着“只能由拥有对象调用”。我怀疑这是Java的起源,其中许多决策是出于与C ++相似的原因而做出的,C ++与private
具有相同的定义。
它还允许您执行诸如只有private
构造函数的类和用于实例化类的static
方法之类的事情。