Какой тип возврата конструктора в Java? - PullRequest
15 голосов
/ 15 января 2012

Поскольку мы знаем, что нам не нужно добавлять какой-либо тип возвращаемого значения в конструктор Java.

class Sample{
  .....
  Sample(){
    ........
  }
}

В Objective C, если мы создаем конструктор, он возвращает указатель на свой класс.Но это не обязательно, я думаю.

AClass *anObject = [[AClass alloc] init];//init is the constructor with return type a pointer to AClass

Аналогично, преобразован ли конструктор в метод, который возвращает ссылку на свой собственный класс ??

Как это:

class Sample{
    .....
    Sample Sample(){
      ........

      return this;
    }
}

Добавляет ли компилятор возвращаемый тип ссылку на тот же класс в конструктор?Что происходит с конструктором?Любая ссылка для изучения этого?

РЕДАКТИРОВАТЬ:

На самом деле я хочу, чтобы ответы были на уровне байтового кода или уровня JVM или даже ниже.

Ответы [ 8 ]

17 голосов
/ 15 января 2012

Многие ответили, как конструкторы определены в Java.

На уровне JVM статические инициализаторы и конструкторы являются методами, возвращающими void. Статические инициализаторы являются статическими методами, однако конструкторы используют this и не должны ничего возвращать. Это потому, что вызывающий отвечает за создание объекта (не конструктор)

Если вы попытаетесь создать объект только в байт-коде без вызова конструктора, вы получите VerifyError. Однако в оракуле JVM вы можете использовать Unsafe.allocateInstance () для создания объекта без вызова конструктора,

Статический инициализатор называется <cinit>, который не принимает аргументов, а конструктор называется <init>. Оба имеют тип возврата void.

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

3 голосов
/ 15 января 2012

Конвертируется ли конструктор в метод, который возвращает ссылку на свой собственный класс ??

Нет но да, если это указано.

Добавляет ли компилятор возвращаемый тип ссылку на тот же класс в конструктор ??

Нет Это не

Что происходит с конструктором ??

Это метод, который запускается при создании объекта. Как правило, с помощью «нового» ключевого слова. Он может выполнить какое-то предварительное задание, либо вернуть что-то, либо присвоить некоторые значения во время построения.

Любая ссылка для изучения этого .??

3 голосов
/ 15 января 2012

Хотя конструкторы похожи на методы, они не являются методами.Они не имеют возвращаемого типа, не наследуются и не могут быть скрыты или переопределены подклассами.

Конструкторы вызываются выражениями создания экземпляра класса (в основном, с использованием new) путем явного вызова из другихконструкторы (используя синтаксис this(...) или super(...)) и оператор конкатенации строк.Нет другого способа вызвать конструктор (в частности, они не могут быть вызваны как другие методы).

См. Раздел 8.8 спецификации языка Java для получения дополнительной информации.

2 голосов
/ 15 января 2012

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

1 голос
/ 15 января 2012

Конструкторы вызываются через специальное ключевое слово java new, которое создает (и инициализирует) объект указанного конкретного типа.

Полагаю, вы могли бы сказать, что комбинация new и выбранного конструктора "возвращает" объект, который в java, конечно, является указателем под прикрытием

0 голосов
/ 05 июля 2018

Тип возврата конструктора - соответствующий тип класса.

package com.ie.test;
import java.lang.reflect.*;

public class a {
    public  a() {
        super();
        System.out.println("*** no-arg constructor ***");
    }

    public static void main(String[] args) {

        Constructor[] constructors =  a.class.getConstructors();

        for (Constructor constructor:constructors) {

            int i =  constructor.getModifiers();
            AnnotatedType annotatedType =  constructor.getAnnotatedReturnType();
            System.out.println("***********Returntype *******"+annotatedType.getType());
            System.out.println("*******constructor *****"+Modifier.toString(i));
        }

        Method[] methods =  a.class.getDeclaredMethods();

        for (Method method:methods) {
            int i =  method.getModifiers();
            //  Class c =  method.getReturnType();
            AnnotatedType annotatedType =  method.getAnnotatedReturnType();
            System.out.println("***********Returntype *******"+annotatedType.getType());
            //   System.out.println(c);
            System.out.println("*******methods*******"+Modifier.toString(i));
        }
    }

    public int m1() {
        System.out.println("***************");
        return 0;
    }
}
0 голосов
/ 22 марта 2015

Конструктор используется только для инициализации члена класса и

  • Имя конструктора и имя класса совпадают
  • Конструктор не может иметь тип возврата
  • Конструктор всегда вызывается при создании объекта
  • Конструктор всегда публичный
0 голосов
/ 17 февраля 2012

Конструктор возвращает ссылку на класс класса, для которого он вызывается. Например:

class A {
    int x;
    A(int a) {
        x = a;
    }
}
class B {
    public static void main(String asd[]) {
        A a = new A(4);
        System.out.println(a);
    }
}

Здесь после вызова конструктора A(...) этот конструктор возвратит ссылку на тип класса Aдля вызывающего абонента (то есть A a = new A(4)).

...