Есть ли такая вещь, как инициализация метода?

1

По моему мнению, это пример объявления переменной:

int variable;

и это пример инициализации переменных:

variable = 2;

Вместе мы можем как объявить, так и инициализировать переменную как таковую:

int variable = 2;

Для методов мы имеем аналогичные конструкции:

abstract int method(int param);

а также

int method (int param) {
return param;
}

но вместо этого мы называем первый прототип метода, а второй - декларацией.

Редактировать:

Другим примером может быть следующее:

static int differentMethod(int param);

public static void main (String[] args) {
...
}

static int differentMethod(int param) {
...
}

Редактировать 2: проигнорировать приведенный выше пример, поскольку он не поддерживается в Java (но что-то подобное существует в C).

Есть ли такая вещь, как инициализация метода?

  • 2
    С вашей точки зрения, где и когда должна вызываться инициализация метода, если он существует?
  • 0
    Хорошо, я отредактирую свой пост, но есть также случай, когда вы объявляете метод в верхней части вашего класса, чтобы определить его позже. Я полагаю, когда вы определяете тело метода, который будет рассматриваться как его инициализация.
Показать ещё 7 комментариев
Теги:

4 ответа

1

Все методы в java содержатся внутри класса, поэтому при загрузке класса его методы также загружаются в память. Существует раздел PermGen котором хранятся все методы (статические методы и статические переменные), PermGem является частью кучи.

Прототип метода, к которому вы обращаетесь, используется в интерфейсах и абстрактных классах. Обратите внимание, что это принудительно реализовать эти методы в конкретном классе, поскольку классы-классы являются теми, у которых в них есть conde, когда этот класс будет использоваться в коде (инициализирован), его методы будут загружены в память для выполнения.

  • 0
    Я думаю, что хороший способ подумать о ситуации - это сравнить классы в целом с переменными, а не только методы с переменными. примитивные типы, такие как классы, имеют как состояние, так и поведение, хотя их функциональность более проста. Поведение определяется при объявлении (например, объявление класса и, в свою очередь, объявление метода), а их состояние определяется при инициализации (например, при инициализации объекта). Когда я думаю об этом таким образом, все становится намного более осмысленным.
  • 0
    Классы - это сложные типы данных, это правда. Но primitive types, like classes, have both state and behavior вашего утверждения primitive types, like classes, have both state and behavior неправильно. примитивы - это просто именованные пространства памяти, которые используются для хранения данных определенного типа. У них нет методов, вы путаете их с их соответствующими типами-обертками, которые используются для представления примитивов в форме объектов, например: - Integer для int, они используются там, где нельзя использовать чистые примитивы, например, в коллекциях.
0

Переменные хранятся в памяти, то есть они имеют некоторое значение, и это значение сохраняется на некотором адресе памяти. Обратите внимание, что: это значение CAN позже будет изменено нами. Теперь давайте посмотрим методы, каждый метод также где-то хранится. Когда мы вызываем этот метод, его адрес разрешается, и тогда выполняется команда, хранящаяся по этому адресу. НО, по мере изменения значения переменной, обратите внимание, что значение адреса, на котором хранится метод, не может быть изменено нами. Он внутренне обрабатывается. Следовательно, нет такой вещи, как ИНИЦИАЛИЗАЦИЯ методов.

  • 0
    Интересно. Имеет смысл использовать слово «инициализация» в контексте того, что может измениться, например, переменные. Вы устанавливаете переменную на какое-то начальное значение, а позже можете назначать разные. Я полагаю, что мой вопрос требует последующего вопроса: «Есть ли такая вещь, как назначение метода?». Мой вывод будет «нет», потому что методы и переменные имеют много общего в синтаксисе, но не имеют отношения один к одному.
  • 0
    Да, здесь тоже нет ничего, что называется назначением метода. Все, что вы можете сделать - это объявление метода, затем его фактическая реализация, а затем вызвать его. Подумайте об этом более практично, будут ли initialization и assignment действительно полезны для методов?
Показать ещё 2 комментария
0

Интересно. Теоретически существует инициализация метода IS.

Инициализация метода может означать обработку методов как объектов первого класса и в среде выполнения, возможно, присвоение им определенного значения. Да, вы инициализируете метод один и более поздний, вы меняете его на другой. Также как объект.

Объектив-C имеет блоки. C имеет указатели на функции.

В java есть частичная поддержка для анонимных внутренних классов.

Вот статья о Википедии: http://en.wikipedia.org/wiki/First-class_function

  • 1
    Да, я согласен с тем, что есть поведение для определения тела метода позже (через анонимные внутренние классы). Я думаю, что мы не говорим об инициализации или присваивании методов, потому что они не так интуитивны, как инициализация или присваивание переменных. Функциональность может существовать, но проще назвать их чем-то другим.
  • 0
    Я абсолютно согласен.
0

Вы можете использовать концепцию, используемую в What's ближайшая замена для указателя функции в Java?

Таким образом, вы получите что-то вроде указателя метода, который может быть инициализирован позже. У вас нет указателя на функцию в java, поэтому вы должны обернуть его в объект.

EDIT: пример

    interface IntFunction {
        int function(int param);
    }

    public IntFunction method;

    void initializer() {
        method = new IntFunction() {

            @Override
            public int function(int param) {
                return param + 10;
            }
        };
    }


    void use() {
        int b = method.function(50);
    }

EDIT 2: управление прямым байткодом

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

  • 0
    Здорово! Тем не менее, это называется «использование анонимных внутренних классов», а не инициализация метода. Я предполагаю, что мы можем воссоздать поведение, но нет особой функциональности, которую мы можем назвать «инициализация метода».
  • 0
    Вы можете использовать манипулирование байт-кодом, как описано в «edit 2» моего ответа.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню