Java: Как конструктор может вернуть значение?

$ cat Const.java 
public class Const {
    String Const(String hello) {
        return hello; 
 }
 public static void main(String[] args) {
     System.out.println(new Const("Hello!"));
 }
}
$ javac Const.java 
Const.java:7: cannot find symbol
symbol  : constructor Const(java.lang.String)
location: class Const
  System.out.println(new Const("Hello!"));
                     ^
1 error

Ответ 1

То, что вы определили, на самом деле не является конструктором, а методом под названием Const. Если вы изменили код на что-то вроде этого, он будет работать:

Const c = new Const();
System.out.println( c.Const( "Hello!" ) );

Если конкретный конструктор явно не определен, компилятор автоматически создает конструктор без аргументов.

Ответ 2

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

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

Почему я говорю, что вы не объявили конструктор? Поскольку, как только вы объявляете возвращаемое значение/тип для своего метода, это больше не конструктор, а обычный метод.

Из Документация по Java:

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

Если вы уточните, что вы пытаетесь достичь, кто-то может рассказать вам, как вы можете достичь этой цели.

Ответ 3

На самом деле конструктор в классе java не может вернуть значение, оно должно быть в следующем виде

public class Test {
 public Test(/*here the params*/) {
   //this is a constructor
   //just make some operations when you want to create an object of this class
 }
}

проверить эти ссылки http://leepoint.net/notes-java/oop/constructors/constructor.html http://java.sun.com/docs/books/tutorial/java/javaOO/constructors.html

Ответ 4

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

Ответ 5

Уже много отличных ответов. Я хотел бы добавить, что если вы хотите получить код возврата отдельно от самого объекта в результате вызова конструктора, вы можете обернуть конструктор в factory method, который при создании может, например, выполнять некоторые данные валидация внутри построенного объекта и возврат a boolean в зависимости от результата.

Ответ 6

Конструктор не может вернуть значение. Это окончательное. Это тот же смысл - он не может иметь тип возврата и почему вы получаете ошибку компиляции. Вы можете сказать, что возвращаемое значение всегда неявно является объектом, созданным конструктором.

Ответ 7

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

Ответ 8

public class Const {
  private String myVar;

  public Const(String s) {
    myVar = s; 
  }

  public String getMyString()
  {
      return myVar;
  }

  public static void main(String[] args) {
    Const myConst = new Const("MyStringHere"); 
    System.out.println(myConst.getMyString());
  }
}

Ответ 9

Я думаю, что лучший способ произвести эффект, который вы хотите, будет следующим:

public class Const {

    private String str;

    public Const(String hello) {
        str = hello; 
    }

    public String toString() {
        return str;
    }

    public static void main(String[] args) {
        System.out.println(new Const("Hello!"));
    }
}

Это заменяет метод public String Const(), который вы использовали ранее, и переопределяя метод public String toString() Object (который наследует все классы Java) значение String объекта печатается правильно, когда вы хотите распечатать объект, поэтому ваш основной метод остается неизменным.

Ответ 10

Чтобы передать значение из конструктора - просто передайте массив в качестве параметра. Чтобы проиллюстрировать принцип:

Test() {
    Boolean[] flag = new Boolean[1];
    flag[0] = false;
    new MyClass(flag);
    System.out.println(flag[0]); // Will output 'true'
}

class MyClass {
    MyClass(Boolean[] flag) {
        // Do some work here, then set flag[0] to show the status
        flag[0] = true;
    }
}

Ответ 11

/************************************************
   Put the return value as a private data member, which gets
   set in the constructor. You will need a public getter to
   retrieve the return value post construction
******************************************************/

class MyClass
{
   private Boolean boolReturnVal;

   public Boolean GetReturnVal() { return(boolReturnVal); }
   MyClass() // constructor with possibly args
    {
       //sets the return value boolReturnVal
    }

 public static void main(String args[])
 {
     MyClass myClass = new MyClass();

    if (myClass.GetReturnVal())
    {
       //success
    }

 }

}