Что означает то, чтобы метод был public/private/other в Java? [закрытый]

9
задан David 15 April 2010 в 16:49
поделиться

6 ответов

Когда метод общедоступный , это означает, что к нему могут обращаться другие объекты

Например:

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
 }

Преимущество ... ну, вы можете использовать его из других мест.

Когда метод является частным , это означает, что к нему могут получить доступ только объекты ОДНОГО КЛАССА

Например, в этом новом определении:

class David {
     public String getName() {
         return "David";
     }
     // private method... nobody but David's "instances" can use it.. 
     private int getAge() {
         return 19;
     } 

 }

Метод getAge не может быть доступен другим классам, потому что он частный. Если вы попытаетесь это сделать, компилятор выдаст вам сообщение об ошибке:

 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();
     }
 }

Преимущество? Вы можете создать несколько методов и хранить их в секрете, избегая повреждения данных или в целом сохраняя ваши объекты инкапсулированными

Об инкапсуляции

В ООП (объектно-ориентированное программирование) намерение состоит в том, чтобы смоделировать программное обеспечение по образцу реальных объектов.

Объекты реальной жизни имеют (среди прочего) атрибуты и методы для доступа к этим атрибутам.

Вы хотите сделать некоторые из этих методов общедоступными, а другие оставить закрытыми.

Например, Человек существо имеет сердце. Но это доступно не всем, это было бы опасно. Он инкапсулирован внутри нашего тела.

Если бы мы смоделировали программное обеспечение по образцу реального Человека , мы можем объявить метод: heartBeat частным (чтобы никто не мог получить к нему доступ)

С другой стороны , было бы полезно использовать общедоступные методы, такие как getGender , чтобы узнать, является ли ваш экземпляр Human мужским или женским.

Существуют и другие модификаторы доступа, такие как: "protected" и package protected (у которого нет ключевого слова)

 class David {
      // protected method
      protected int getBalance() { 
          return 1000000; 
      }
      // package protected or "default" method
      boolean knowsOop(){ 
          return true;
      }
 }

Там метод getBalance может быть доступен только Дэвиду ] экземпляров и подклассов Дэвида (создайте другой поток для того, что является подклассом)

Метод знает, что Уп может быть доступен любому внутри пакета, как определено Дэвидом.

Не беспокойтесь об этих двух модификаторах доступа, они будут иметь смысл, когда вы узнаете больше о ООП и Java.

Наконец, вам действительно стоит уделить время, чтобы прочитать:

http://java.sun.com/docs/books/tutorial/java/javaOO/index.html

Надеюсь, это поможет

14
ответ дан 4 December 2019 в 10:03
поделиться

К общедоступному методу можно получить доступ отовсюду, а к частному методу можно получить доступ только из того же класса. Главное преимущество - это контроль над API класса. Если я сделаю общедоступным только то, что необходимо, я могу изменить внутреннее поведение класса, не нарушая код, зависящий от этого класса. Вам следует проявлять осторожность, потому что программное обеспечение часто меняется в реальном мире (по крайней мере, это мой опыт и у других тоже есть) и чем больше ломается каждое изменение, тем больше энергии вы тратите на обслуживание или тем больше ошибок в вашем программном обеспечении. В конце концов, это вопрос стоимости.

Возможность скрыть внутренние компоненты вашего класса от пользователей этого класса, чтобы избежать взлома кода последующими изменениями, часто называется инкапсуляцией или сокрытием информации .

Две опции, помимо публичной и частной, - это пакет (без модификатора) и защищенный. Доступ к методу, доступному для пакета, также можно получить из классов того же пакета. Я не помню, чтобы использовал эту опцию каким-либо полезным образом. к защищенным методам можно получить доступ из классов, наследующих рассматриваемый класс. Это часто используется для создания классов с конкретным поведением для определенного API базового класса. Например, вы могли бы реализовать новый класс List, расширив AbstractList , и вам нужно только реализовать get и size (и один set-метод для изменяемых списков). Другие методы, предоставляемые API List, определены в базовом классе, при необходимости вызывая три других метода.

5
ответ дан 4 December 2019 в 10:03
поделиться

Частные методы могут вызываться только внутри класса. Вы можете вызывать общедоступные методы вашего класса в любом месте программы. Методы без модификатора доступа должны иметь область видимости пакета (она называется default ), поэтому вы можете вызывать ее в любом месте пакета, где определен класс.

См. http: //en.wikipedia.org / wiki / Object_orient_programming # Encapsulation

1
ответ дан 4 December 2019 в 10:03
поделиться

H Модификаторы public, protected и private контролируют, какой другой код может видеть эти методы (или поля). Речь идет об управлении интерфейсом, который вы открываете.

Наиболее полезными из них являются:

Модификатор public: любой другой может видеть ваш метод.

Модификатор private: никакой код, кроме вашего класса и любых внутренних классов, не может видеть ваш метод.

Это может быть полезно, например, если вы хотите убедиться, что когда-либо был создан только один экземпляр класса ( шаблон singleton ). Вы можете сделать конструктор закрытым, создать единственный экземпляр и сохранить как закрытый член, называемый instance, и предоставить открытый метод примерно так:

public static MyObject getInstance() {
  return instance;
}

, и поэтому вы можете гарантировать, что у каждого будет только один экземпляр.


Обновление - еще один пример по запросу.

Другой пример: у вас есть сложный общедоступный метод и вы хотите разбить его на более простые части. Вы можете разбить его на более простые методы, каждый из которых выполняет часть работы, но вы не хотите, чтобы другой код вызывал эти частичные методы, поскольку они не будут работать сами по себе - поэтому вы должны сделать меньшие методы частными, гарантируя что их нельзя вызывать вне вашего класса.

1
ответ дан 4 December 2019 в 10:03
поделиться

Для начала я бы хотел максимально ограничить доступ. Начните с частного . Если вам понадобится конструктор, метод или поле откуда-то еще, но вы не можете получить к нему доступ из-за ограничения, тогда следующие шаги будут заключаться в том, чтобы спросить себя:

  1. Если это метод, вам действительно нужен доступ к нему ? Изменяет ли это поведение класса / экземпляра? Разве вы не должны позволить этому классу делать работу? Разве текущий класс (которому требуется это поле или метод) не должен быть ближе к этому классу?
  2. Если это поле, нужно ли вам получить или установить его значение? Разве вы не должны добавить метод, который делает именно это?

Точка 1 позволяет избежать неправильного связывания, а точка 2 улучшает инкапсуляцию. После того, как вы рассмотрели вышеизложенное и пришли к выводу, что действительно необходимо меньше ограничений, установите его на один или несколько шагов дальше.

0
ответ дан 4 December 2019 в 10:03
поделиться

основная причина называется инкапсуляцией: не предоставлять доступ к внутреннему состоянию объекта.

0
ответ дан 4 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: