Nano Hash - криптовалюты, майнинг, программирование

Почему конструктор нельзя вызывать как функцию?

Следующий код не работает, потому что компилятор говорит, что функция AnotherNewClass() не существует? Это почему? Разве конструктор не просто функция? Почему конструктор не может работать без ссылки на конкретный объект?

class AnotherNewClass
{

    public AnotherNewClass(){
        System.out.println("Hello World!!");
    }

    public AnotherNewClass(String arg){
        System.out.println("Hello World!!");
    }


    public static void main(String []args){
        AnotherNewClass("Hello World!!");//This is the offending code; where the compiler throws an error
    }

}

PS. Из нескольких комментариев ниже я хотел бы уточнить, что я понимаю, что я не использую ключевое слово new, цель этого вопроса состояла в том, чтобы подчеркнуть разницу между функцией и конструктором (который нельзя вызвать БЕЗ «нового»)


  • должно быть new AnotherNewClass("Hello World!!"); 06.04.2014
  • Вы никогда не показываете оскорбительный код... хммм. 06.04.2014

Ответы:


1

Можно, но вам понадобится ключевое слово new.

new AnotherNewClass("Hello World!!");

Обратите внимание, что это больше, чем просто вызов конструктора. Именно поэтому вам нужно ключевое слово new. Ключевое слово new выделяет память в куче, куда может поместиться объект вашего класса. Но эта память еще не содержит такого объекта. Затем конструктор инициализирует этот фрагмент памяти. Вот почему вы не хотите использовать конструкторы как обычные функции.

05.04.2014

2

Цель наличия конструкторов — инициализировать объекты в Java.

Конструкторы нельзя вызывать напрямую; они вызываются неявно, когда ключевое слово new создает объект. Методы можно вызывать непосредственно для объекта, который уже был создан с помощью new.

поэтому ответ на ваш вопрос, по моему мнению, таков: их не может быть, потому что они не должны быть, так это задумано. вы можете далее прочитать, что происходит, когда мы говорим new Class() в глубине, вы узнаете настоящую причину.

05.04.2014

3

1 - Конструкторы используются для создания экземпляров классов, и здесь вы делаете это неправильно. Должен быть

new AnotherNewClass("Hello World!!");

Взгляните на этот вопрос для хорошего объяснения.

2 - В Java мы говорим о методах, а не о функциях.

05.04.2014

4

Ответ о причине может быть либо довольно философским, либо просто сослаться на Спецификация языка Java. В любом слючае,

new AnotherNewClass("Hello World!!")

должно сработать.

05.04.2014

5

Я предполагаю, что вы спрашиваете с точки зрения языка. Другими словами, почему Java не позволяет этого, а не как это сделать.

Я думаю, это потому, что функция (метод) обычно требует экземпляр объекта. Конструктор — это особый случай, потому что он создает этот экземпляр, для которого требуется ключевое слово new. Конструкторы не должны вызываться в любое другое время по очевидным причинам!

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

05.04.2014

6

Вот что я понял из комментариев и ответов ниже:

Конструктор по своей сути отличается от любой другой функции в Java, фактически это функция только по форме, а не по обработке.

Конструктор может обрабатывать только часть памяти, назначенную ему оператором «новый», или любую локальную память. В то время как функция может обрабатывать память, на которую может ссылаться вызывающий объект.

Оператор «новый» назначает эту часть памяти, таким образом, по существу «создавая» объект, а конструктор «заполняет» эту часть памяти. ЭТА часть памяти (предоставленная ему оператором «новый») является ГЛАВНЫМ различием между функцией и конструктором с точки зрения обработки, которую они выполняют.

06.04.2014
  • под обработкой я подразумеваю, какие манипуляции с данными выполняет функция/конструктор. 06.04.2014

  • 7

    Прежде всего, вы можете вызывать статические методы только из метода main. И, как уже говорили другие, конструкторы должны вызываться с помощью оператора new.

    AnotherNewClass an = new AnotherNewClass("Hello World!!");
    

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

    an.someMethod();
    
    06.04.2014
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..