Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.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中,方法为public/private/other意味着什么?_Java_Methods - Fatal编程技术网

在java中,方法为public/private/other意味着什么?

在java中,方法为public/private/other意味着什么?,java,methods,Java,Methods,java中的公共/私有/其他方法意味着什么 这些选项的优缺点是什么? 作为一个试图成为一名优秀程序员的人,我关心的动力是什么 主要原因称为封装:不允许访问对象的内部状态。公共、受保护和私有修饰符控制其他代码可以看到这些方法(或字段)的内容。它是关于控制你正在公开的界面 常用的方法有: 公共修饰符:任何其他人都可以看到您的方法 私有修饰符:除了类和任何内部类之外,没有其他代码可以看到您的方法 例如,如果您希望确保只创建了一个类的实例(),那么这些将非常有用。您可以将构造函数设为私有,创建一个实例,

java中的公共/私有/其他方法意味着什么 这些选项的优缺点是什么?

作为一个试图成为一名优秀程序员的人,我关心的动力是什么

主要原因称为封装:不允许访问对象的内部状态。

公共、受保护和私有修饰符控制其他代码可以看到这些方法(或字段)的内容。它是关于控制你正在公开的界面

常用的方法有:

公共修饰符:任何其他人都可以看到您的方法

私有修饰符:除了类和任何内部类之外,没有其他代码可以看到您的方法

例如,如果您希望确保只创建了一个类的实例(),那么这些将非常有用。您可以将构造函数设为私有,创建一个实例,并将其存储为名为instance的私有成员,并提供一个类似以下内容的公共方法:

public static MyObject getInstance() {
  return instance;
}
所以你可以保证每一个例子都只有一个


更新-请求的另一个示例


另一个例子可能是,您有一个复杂的公共方法,希望将其分解为更简单的部分。您可以将其分解为simplr方法,每个方法都做部分工作,但您不希望其他代码调用这些部分方法,因为它们本身无法工作-因此您可以将较小的方法设置为私有方法,确保它们不能在类外调用。

只能在类内调用私有方法。您可以在程序中的任何位置调用类的public方法。不带访问修饰符的方法意味着具有包可见性范围(它被称为default),所以您可以在包中定义类的任何地方调用它


请参见

公共方法可以从任何地方访问,而私有方法只能从同一类访问。主要优点是可以控制类的API。如果我只公开所需的内容,我可以更改类的内部行为,而不会破坏依赖于该类的代码。你应该关心,因为软件在现实世界中经常发生变化(至少我和其他人都有这种经验),每次变化中断的次数越多,你需要投入更多的精力进行维护,或者你的软件有更多的bug。归根结底,这是一个成本问题

对该类的用户隐藏类的内部以避免以后的更改破坏代码的可能性通常称为封装或修改


除了public和private之外,还有两个选项是package(不带修改器)和protected。包可访问方法也可以从同一包的类内访问。我不记得以任何有用的方式使用过这个选项。可以从继承相关类的类访问受保护的方法。这通常用于为基类的已定义API创建具有具体行为的类。例如,您可以通过扩展实现一个新的列表类,并且只需要实现get和size(以及一个用于可修改列表的set方法)。List的API公开的其他方法在基类中定义,如果需要,调用其他三个方法。

对于初学者,我希望开始尽可能地限制访问。从
private
开始。如果您碰巧需要来自其他地方的构造函数、方法或字段,但由于限制而无法访问它,那么接下来的步骤将是询问您自己:

  • 如果它是一种方法,您真的需要访问它吗?它是否会改变类/实例的行为?你不应该让那个班做作业吗?当前类(需要该字段或方法)不应该更紧密地连接到该类吗
  • 如果是字段,是否需要获取或设置其值?难道你不应该添加一个方法来做到这一点吗

  • 第1点避免了错误的耦合,第2点改进了封装。一旦您考虑了上述内容并得出结论认为确实需要较少的限制,然后将其进一步打开一步或更多。

    当一个方法是public时,意味着它可以被其他对象访问

    例如:

    class David {
         // public method, can be use by anyone
         public String getName() {
             return "David";
          }
     }
    
    方法
    getName
    可能被其他类访问,因为它是公共的:

     class Other  {
          David davidOne = new David();
          String davidsName = davidOne.getName(); //<-- compiles and runs
     }
    
    方法
    getAge
    不能被其他类访问,因为它是私有的,如果您尝试这样做,编译器将给您一条错误消息:

     class Other  {
          David davidOne = new David();
          String davidsName = davidOne.getName(); 
          int davidsAge = davidOne.getAge(); //<-- Compiler error, getAge() is not visible
     }
    
    优势是什么?您可以创建一组方法并保持它们的私有性,从而避免数据损坏或通常保留您的对象

    关于封装

    在面向对象编程(object oriented programming,面向对象编程)中,意图是根据真实对象对软件进行建模

    现实生活中的对象具有(除其他外)属性和访问这些属性的方法

    您希望公开其中一些方法,而对其他方法保密

    例如,一个人,有一颗心。但并不是所有人都能接触到它,这将是危险的。它被包裹在我们体内

    如果我们按照真实的人来建模软件,我们可以将方法声明为:
    heartBeat
    私有(因此,没有人可以访问它)

    另一方面,使用像
    getGender
    这样的public方法来确定您的Human实例是男性还是女性会很有用

    还有其他访问修饰符,例如:“protected”和package protected(其没有关键字)

    在那里,方法
    getBalance
    只能由
    David
    实例和
    David
    子类访问(为子类创建另一个线程)

    按照David的定义,包内的任何人都可以访问方法
    knowsOop

    别担心这两个
     class Other  {
          David davidOne = new David();
          String davidsName = davidOne.getName(); 
          int davidsAge = davidOne.getAge(); //<-- Compiler error, getAge() is not visible
     }
    
    class David {
         public String getName() {
             return "David";
         }
         // private method... nobody but David's "instance" can use it.. 
         private int getAge() {
             return 19;
         } 
         // Here the call to "getAge()" will succeed, because it is visible 
         // inside the class 
         public boolean hasSameAgeAs( David otherDavid ) {
             return this.getAge() == otherDavid.getAge();
         }
     }
    
     class David {
          // protected method
          protected int getBalance() { 
              return 1000000; 
          }
          // package protected or "default" method
          boolean knowsOop(){ 
              return true;
          }
     }