如果我们可以使用访问器访问私有数据成员,那么为什么我们不能访问私有方法呢?

If we can access private data members using Accessors than why cant we access private methods?

我们可以使用访问器方法访问私有数据成员,例如

 private int num=5;

 public int get_num()
 {
  return num;
 }

我们可以从任何 class 访问返回值,即使 num 是私有数据成员。

所以在类似的注释中,我们不能创建 returns 私有方法的访问器方法吗? 我只是想了想,如果我们不能做到这一点,请 explain.Thank 你

因为访问器是public,所以可以从class外访问;即使它 returns 私有数据。

返回数据的访问修饰符不相关,只有方法的访问修饰符才重要。

如果您创建了一个返回私有方法引用的 public 方法,是的,您可以从 class 外部调用私有方法。然而,这将完全违背将方法设为私有的目的。

你我想知道 "why make a public getter to a private variable"。答案是虽然可以 检索 私有数据,但不可能(除非您也创建 public setter)到 更改 public 数据。这假设私人日子是不可变的。如果它是可变的,则重新调整对私有数据的引用会否定您通过将变量设为私有而获得的任何保护。

您可以通过public方法访问私有方法。这有时用于包装复杂的私有方法并公开更简单的方法,public API.

class Delegator {

    private void doPrivateStuff(int param) { ... }

    public void doStuffOnce() {
        doPrivateStuff(1);
    }

    public void doStuffIfConditionIsMet() {
        if(condition) {
            doPrivateStuff(1);
        }
    }
}

您还可以使用反射访问私有方法。 http://tutorials.jenkov.com/java-reflection/private-fields-and-methods.html

重构代码时会创建私有方法。它们是实施细节,外部没有人需要知道。它们在 public 方法中使用,这些方法应该提供您想要提供给客户的功能(每个 public 方法都可以称为 API,即 used/consumed其他 class 即它的客户)。

提供访问修饰符以帮助您实现适当的抽象。因此,任何标记为私有的内容只能在您的 class 内部直接访问。但是如果你想让外面的人知道 read/write 它的价值,你可以通过 getters/setters 公开它。同样,私有方法在 class 之外是不可访问的。但是没有人阻止您创建仅调用此私有方法的 public 方法。这样你就可以实现对私有方法的访问。但这将是一个非常糟糕的设计。

TL;DR

访问私有方法违反了encapsulation的基本面向对象原则。问题不是"can we access a private method?"而是"should we ever do it?"。它违背了信息隐藏的原则,并且违反了与消费者的对象 "offers" 的契约。强制您这样做的对象或 classes 应被视为设计不佳。

为什么你不应该访问私有成员

首先,classes 应该实现您的域逻辑的一部分,该逻辑密切相关,几乎不需要与外界进行交互来履行其职责(这称为高内聚)。然后,您为您的 class / 对象定义一个 public 接口,该接口具有您向外界公开的功能 - 您的对象的使用者只能使用此接口(这称为松散耦合)。

私有方法可以被视为一种以更易读的方式在 class 中构建代码的方式 - 它们不打算与外界共享。将它们视为 "safe space",供 class 的开发人员在不违反合同的情况下进行任意更改。这就是为什么如果您实际访问私有方法会产生不良副作用的原因:您的代码可能会破坏它 class 的开发人员决定更改此类方法的实现。 Effective Java, Chapter 4, Item 13protected 位成员解释:

For members of public classes, a huge increase in accessibility occurs when the access level goes from package-private to protected. A protected member is part of the class's exported API and must be supported forever. Also, a protected member of an exported class represents a public commitment to an implementation detail.

异常

我从 "not accessing private members outside of an object" 的规则中知道的唯一例外是在测试中,当您想要重置某个变量(例如 Singleton)或者您想要通过测试实现的私有部分,从而降低测试的复杂性。