Допустим, у меня есть следующий класс:

public class Human(){

    String eyeColor;

    public Human(String faceDescription){
           this.eyecolor = determineEyeColor(faceDescription);
    }

    private String determineEyeColor(String faceDescription){
          String eyeColor;
          <algorithm that extracts the actual eye color substring">
          return eyeColor;
    }
}

И в моем основном методе я получил такой вызов:

String faceDescription = "<String where a face gets described in detail>";
Human human = new Human(faceDescription);

Если я сейчас сформирую Список, скажем, из 10 000 объектов Human (). Создается ли метод defineEyeColor () (поскольку он находится внутри класса Human) 10 000 раз и, следовательно, является большим приемником памяти? Есть ли существенная разница в ресурсах, если я запрограммирую это следующим образом:

public class Human(){

   String eyeColor;

   public Human(String eyeColor){
          this.eyecolor = eyeColor;
   }
}

Поместите метод defineEyeColor () ** вне ** класса Human и сделайте вызов в моем основном методе следующим образом:

String faceDescription = "<String where a face gets described in detail>";
Human human = new Human(determineEyeColor(faceDescription));

Метод вызывается при каждом создании экземпляра. Сам кодовый блок определения цвета глаз () написан также только 1 раз в моем общем коде.

Единственная разница в том, что сам алгоритм не создается внутри каждого объекта, верно? У меня в основном нет 10 000 x define Eye Color () в каждом экземпляре Human ().

Обратной стороной этого является то, что я не могу сразу же повторно использовать этот класс в других программах, так как мне также нужно внести изменения в класс создания экземпляра (добавив defineEyeColor () в класс создания экземпляра).

Это вообще правда? Создается ли экземпляр метода в каждом экземпляре Human () или Java распознает это и разделяет метод со всеми объектами, только используя разные поля, сопоставленные с соответствующим экземпляром Human ().

-1
MajesticOl 20 Ноя 2020 в 13:30

2 ответа

Лучший ответ

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

Назначение данных (свойств объекта) - определить, как ведут себя методы. Таким образом, в зависимости от данных каждый метод будет вести себя по-разному, но код метода не меняется для каждого объекта.

Когда вы создаете 10 000 объектов класса Human, вы создаете 10 000 контейнеров для данных, связанных с реализацией класса Human. Это означает, что вы можете выполнять методы класса Human для каждого набора данных. Вызов метода объекта может привести к другому результату, несмотря на выполнение одного и того же блока кода.

1
Dharman 20 Ноя 2020 в 13:36

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

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

0
Dharman 20 Ноя 2020 в 13:29
64927827