Java - что такое метод с явно не подписью - PullRequest
1 голос
/ 19 января 2011

Другими словами, может ли кто-нибудь объяснить мне цель этого:

Consumer(Producer p) {
    producer = p;
}

в контексте:

class Consumer extends Thread {
    Producer producer;

    Consumer(Producer p) {
        producer = p;
    }
}

, как я понимаю, это, кажется, методбез подписи или конструктора, так как он разделяет имя класса, но не отображается в моей IDE как таковой.Может кто-нибудь объяснить, что это такое и для чего это нужно?

Любая помощь будет чрезвычайно признательна.

Ответы [ 4 ]

4 голосов
/ 19 января 2011

Вы смотрите на конструктор класса Consumer.Единственная проблема, которую я вижу, это то, что ему не предоставлен уровень доступа (общедоступный, закрытый и т. Д.), Поэтому похоже, что по умолчанию он защищен от пакетов, то есть только классы в одном пакете могут его видеть.

3 голосов
/ 19 января 2011

Consumer(Producer p) { ... } - конструктор для класса Consumer.

Обычно вы видите конструкторы как public, например ::

public Consumer(Producer p) { ... }

Однако, когда public (или любой модификатор доступа, например protected или private) не указан (для любого метода или члена, включая конструкторы), конструктор доступен только для пакета класса объявлен в.

Ознакомьтесь с руководством Oracle по управлению доступом .

1 голос
/ 19 января 2011

Да, это конструктор. Он может выглядеть как «метод без сигнатуры» синтаксически (более конкретно, конструктор не может иметь возвращаемый тип, но может иметь модификаторы доступа и, конечно, параметры), но на самом деле он довольно сильно отличается от метода в несколько способов.

Целью конструктора является создание экземпляров (объектов) класса. За некоторыми относительно экзотическими исключениями (клонирование и десериализация) каждый объект Java создается путем вызова конструктора. Каждый класс имеет по крайней мере один конструктор, но если ни один из них не объявлен, а суперкласс имеет конструктор без параметров, компилятор неявно добавляет конструктор без параметров, который ничего не делает, кроме вызова конструктора суперкласса. Аналогично, первое, что делает любой конструктор, это вызывает конструктор суперкласса. Опять же, это может быть неявным, если в суперклассе есть конструктор без параметров.

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

0 голосов
/ 19 января 2011

Как уже упоминалось, это конструктор, защищенный пакетом, то есть он может вызываться только из методов самого класса или других классов в том же пакете. Я не уверен, какие преимущества это дает по сравнению с более часто используемыми конструкторами protected или private, которые не позволяют непосредственно создавать экземпляр класса и обычно используются для реализации шаблона Singleton .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...