Java OOP Public vs Private vs Protected

gma*_*ter 7 java oop variables methods class

我了解公共,私人和受保护的行为.我知道您应该使用它们来遵循面向对象编程的概念,并且我知道如何在使用多个类的程序中实现它们.

我的问题是:为什么我们这样做?为什么我不能直接修改另一个类的全局变量?即使你不应该为什么保护,私人和公共修饰符甚至是必要的?这就好像程序员不相信自己不这样做,即使他们是编写程序的人.

提前致谢.

Nat*_*hes 9

你是对的,这是因为我们不能相信自己.可变状态是计算机程序复杂性的一个主要因素,它很容易构建起初看起来不错的东西,随后随着系统变大而变得失控.限制访问有助于减少对象状态以不可预测的方式发生变化的机会.这个想法是让对象通过明确定义的渠道相互通信,而不是直接调整彼此的数据.通过这种方式,我们有一些希望测试单个对象,并对它们如何作为更大系统的一部分表现出一些信心.


hav*_*exz 7

让我举一个基本的例子(这只是为了说明):

class Foo {
  void processBar() {
    Bar bar = new Bar();
    bar.value = 10;
    bar.process();
  }
}

class Bar {
  public int value;
  public void process() {
    // Say some code 
    int compute = 10/value;
    // Her you have to write some code to handle
    // exception
  }
}
Run Code Online (Sandbox Code Playgroud)

每件事看起来都很好,你很开心.现在稍后您意识到其他开发人员或您用于设置值的其他apis正在设置0,这会导致您的Bar.process()函数出现异常.

现在根据上面的实现,你无法限制用户将其设置为0.现在看下面的实现.

class Foo {
  void processBar() {
    Bar bar = new Bar();
    bar.setValue(0);
    bar.process();
  }
}

class Bar {
  public int value;
  public void setValue(int value) {
    if(value == 0)
      throw new IllegalArgumentException("value = 0 is not allowed");

    this.value = value; 
  }
  public void process() {
    // Say some code
    int compute = 10/value;
    // No need to write exception handling code
    // so in theory can give u better performance too

  }
}
Run Code Online (Sandbox Code Playgroud)

您不仅可以进行检查,还可以提供信息性异常,这有助于在早期阶段快速发现错误.

这只是其中一个例子,OOP(封装,抽象等)的基础知识,帮助您标准化界面并隐藏底层实现.