Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么允许静态方法调用私有方法?_Java_Static_Private_Encapsulation - Fatal编程技术网

Java 为什么允许静态方法调用私有方法?

Java 为什么允许静态方法调用私有方法?,java,static,private,encapsulation,Java,Static,Private,Encapsulation,我以前从未尝试过编写以下代码,因为它在生产中没有多大意义。但令我惊讶的是,这段代码编译成功为什么它被设计为允许在同一类的实例上从静态方法调用私有方法? public class Beverage { private void drink () { System.out.println("Beverage"); } public static void main (String[] args) { Beverage b = new

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

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!
    }
}

为什么他们不能给他们打电话<代码>专用限制对同一类的访问。静态方法在同一个类中。因此它可以访问私有方法


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

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

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
    }
}

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

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

在Java中,
private
表示“只能从同一类中调用”。这并不意味着“只能被拥有的对象调用”。我怀疑这是java起源的一个保留,在这里,由于C++的相似性而做出了很多决定,它具有相同的定义:<代码>私有< /代码>。
它还允许你做一些事情,比如让一个类只有
private
构造函数,和
static
方法来实例化这个类。

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

  • 当您有一个实例时,可以调用非静态方法

  • 您可以将私有方法作为同一类中的两个方法调用


  • 关于静态工厂方法的观点很好!完全忘记了。