Код у конструкторі з "void" не виконується

Якщо я використовую це

class Test {
    public Test() {
        System.out.println("constructor");
    }
}

public class MainClass {
    public static void main(String[] args) {
        Test t1 = new Test();
        Test t2 = new Test();
    }
}

Я отримую 2 виходи конструктор конструктор

Але якщо додати конструктор void (public void Test ()) - висновок порожній. Чому так дивно?

2
додано Автор yAnTar, джерело
Конструктори @Jayram мають void тип повернення в JVM , але він прихований від розробників
додано Автор Anirudha, джерело
конструктор не має типу повернення
додано Автор Jayram Singh, джерело
Чому конструктори в java не мають атрибутів тип повернення "> stackoverflow.com/questions/6801500/…
додано Автор Swapnil, джерело

8 Відповіді

Це не дивно, це його нормальна поведінка. Конструктор не має типу повернення

public Test() {
    System.out.println("constructor");
}

є конструктором, але

public void Test() {
    System.out.println("constructor");
}

це простий метод, який можна викликати за допомогою t1.Test() .

This page lists the differences between constructors and methods:

1) Перша різниця між методом vs конструктор в Java полягає в тому, що ім'я конструктора має бути однаковим з назвою класу, але такої вимоги до методу в Java немає. Методи можуть мати будь-яке довільне ім'я в Java.

     

2) Друга відмінність між методом і конструктором в Java полягає в тому, що конструктор не має будь-якого типу повернення, але метод має тип повернення і повертає щось, якщо його void.

     

3) Третя відмінність між конструктором і методом в Java полягає в тому, що конструктори прив'язані і викликаються в певному порядку, такого методу немає.

     

4) На відміну від методу, конструктор, ще оголошений в класі, не вважається членом класу. Конструктори не успадковуються дочірніми класами, але методи успадковуються дочірніми класами, поки вони не стають приватними. в якому випадку вони видно тільки в класі, на якому вони оголошені. Аналогічним чином приватний конструктор означає, що ви не можете створювати об'єкт цього класу ззовні, це одна з методів, що використовуються для реалізації шаблону Singleton в Java.

     

5) Іншою відмінністю між методом і конструктором в Java є те, що спеціальне ключове слово this і super використовується для явного виклику конструктора. для методу немає такої речі, вони мають власну назву, яку можна використовувати для виклику.

10
додано
@yAnTar Як правило, ми бачимо його як метод, але це не простий метод, ви не можете назвати його, використовуючи t1.Test() як будь-який інший метод, конструктор викликається, коли ви ініціалізуєте об'єкт
додано Автор BackSlash, джерело
Дякую, але я думаю, що конструктор також є методом (але специфічним)
додано Автор yAnTar, джерело
Спасибі, це трохи відрізняється від інших мов, я не знав і моє питання було дурним.
додано Автор yAnTar, джерело
На рівні JVM конструктори мають тип повернення void, але прихований від розробників
додано Автор Anirudha, джерело
@yAnTar Конструктор не є методом . Це шматок коду, який виглядає як метод, але: (a) він не має типу повернення (b) може бути викликаний тільки через new вираз (c) його єдина мета полягає в доведенні знову виділеного Пам'ять до дійсного стану для створеного об'єкта (d) не може бути викликана на існуючий об'єкт після створення і, таким чином, не вважається методом при проектуванні та аналізі програмного забезпечення. Спосіб його реалізації на різних мовах не має значення .
додано Автор Theodoros Chatzigiannakis, джерело

Тому що, якщо ви додасте void до конструктора, який більше не є конструктором. Це просто метод, який має таку ж назву, як і клас.

Тоді ви можете запитати: "але як я можу викликати конструктор, якщо він не існує?" Ну, кожен клас має неявний конструктор без аргументів.

Висновок: конструктор не повинен мати тип повернення.

5
додано

Конструктори не мають типу повернення. Методи мають тип повернення. Якщо ви додасте void() , то він перетвориться на метод. Для виклику методу потрібно викликати його.

t1.test();
2
додано
Але я думаю - конструктор також є методом (але специфічним).
додано Автор yAnTar, джерело
Можна також сказати, що конструктори не мають імені, тільки тип повернення :)
додано Автор dasblinkenlight, джерело

Його специфікація на мові Java

Docs saying

Клас містить конструктори, які викликаються для створення об'єктів з класу blueprint. Декларації конструктора виглядають як декларації методів, за винятком того, що вони використовують ім'я класу і не мають типу повернення.

1
додано

Коли ви пишете:

public Test() 
    {
        System.out.println("constructor");
    }

Це, безумовно, конструктор. І, як ви створюєте перший об'єкт класу Test, напишіть:

    Test t1 = new Test();

Це призведе до виклику вашого конструктора вперше, і код, який ви написали в операторі print, тобто конструктор, буде надруковано на консолі. Пам'ятайте, що конструктори автоматично викликаються, коли ви створюєте об'єкт класу.

Другий раз при створенні об'єкта записом:

    Test t2 = new Test();

Це викликало б один і той же конструктор, і друк одного і того ж "конструктора" на екрані, але це буде другий раз.

Отже, ви отримаєте відповідь конструктор конструктор

In the second case, Коли ви пишете:

public void test()
    {
        System.out.println("constructor");
    }

компілятор розглядатиме його як метод, а не як конструктор.

Навіть якщо void нічого не повертає, це "тип повернення", і конструктори ніколи не можуть мати тип повернення, ніколи. Це не означає, що вони вам нічого не повертають, але вони просто не мають типу повернення.

Таким чином, метод не викликається автоматично, коли об'єкт класу створюється. Отже, не варто очікувати того самого результату.

Тепер ви отримуєте порожній вивід, тому що компілятор надає кожному класу фіктивний/за замовчуванням конструктор, навіть якщо ви його не визначите. Цей конструктор за замовчуванням буде викликатися кожного разу, коли ви створюєте об'єкт класу, незалежно від того, чи ви його називаєте явно чи ні!

конструктор за замовчуванням може бути написаний десь як:

test() {   }

тепер ви можете собі уявити, що відбувається, коли ви створюєте два об'єкти, програма буде компілюватися і працювати правильно, повертаючи вам порожній вивід!

Сподіваюся, це допомогло вам.

1
додано

Конструктор Java має таку ж назву, як і ім'я класу, до якого він належить. Синтаксис конструктора не включає тип повернення, оскільки конструктори ніколи не повертають значення.

 public Test() {
    System.out.println("constructor");
}
0
додано

Тому що конструктори не мають типу повернення. Те, що ви створюєте під час додавання типу void , - це метод з назвою Test() , який нічого не повертає.

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

0
додано

Якщо ви додасте тип повернення до конструктора, то він більше не буде конструктором. Це щось на зразок методу.

0
додано
ІТ КПІ - Java
ІТ КПІ - Java
436 учасників