14

据我所知,构造函数什么都不返回,甚至不返回 void ,

并且

return ;

在任何方法内部都意味着返回 void 。

所以在我的程序中

public class returnTest {

    public static void main(String[] args) {
        returnTest obj = new returnTest();
        System.out.println("here1");

    }

    public returnTest () 
    {
        System.out.println("here2");
        return ;
    }
    }

我在打电话

return;

这将返回 VOID,但构造函数不应该返回任何东西,程序编译得很好。

请解释 。

4

6 回答 6

27

return在构造函数中只是在指定点跳出构造函数。如果在某些情况下不需要完全初始化类,则可以使用它。

例如

// A real life example
class MyDate
{
    // Create a date structure from a day of the year (1..366)
    MyDate(int dayOfTheYear, int year)
    {
        if (dayOfTheYear < 1 || dayOfTheYear > 366)
        {
            mDateValid = false;
            return;
        }
        if (dayOfTheYear == 366 && !isLeapYear(year))
        {
            mDateValid = false;
            return;
        }
        // Continue converting dayOfTheYear to a dd/mm.
        // ...
于 2013-03-04T06:12:16.907 回答
4

return可用于立即离开构造函数。一个用例似乎是创建半初始化对象。

人们可以争论这是否是一个好主意。恕我直言,问题在于生成的对象很难使用,因为它们没有任何可以依赖的不变量。

到目前为止,在我看到的所有return在构造函数中使用的示例中,代码都是有问题的。通常构造函数太大,包含太多业务逻辑,难以测试。

我见过的另一种模式在构造函数中实现了控制器逻辑。如果需要重定向,则构造函数存储重定向并调用返回。除了这些构造函数也难以测试之外,主要问题是每当必须使用这样的对象时,您必须悲观地假设它没有完全初始化。

最好将所有逻辑排除在构造函数之外,并针对完全初始化的小对象。然后你很少(如果有的话)需要调用return构造函数。

于 2013-11-25T16:36:16.837 回答
3

return语句之后的语句将无法访问。如果 return 语句是最后一个,那么在构造函数中定义是没有用的,但编译器仍然不会抱怨。它编译得很好。

如果您基于if条件 ex. 在构造函数中进行一些初始化,您可能希望初始化数据库连接(如果可用)并返回其他您想从本地磁盘读取数据以用于临时目的。

public class CheckDataAvailability 
{
    Connection con =SomeDeligatorClass.getConnection();
    
    public CheckDataAvailability() //this is constructor
    {
        if(conn!=null)
        {
            //do some database connection stuff and retrieve values;
            return; // after this following code will not be executed.
        }

        FileReader fr;  // code further from here will not be executed if above 'if' condition is true, because there is return statement at the end of above 'if' block.
        
    }
}
于 2013-03-04T13:03:58.847 回答
1

用返回类型声明的方法void以及构造函数什么都不返回。这就是为什么您可以完全省略return其中的语句。构造函数没有指定返回类型的原因void是为了区分构造函数和同名方法:

public class A
{
    public A () // This is constructor
    {
    }

    public void A () // This is method
    {
    }
}
于 2013-03-04T06:13:22.447 回答
1

在这种情况下return,行为类似于break。它结束初始化。想象一下有int var. 您通过int[] values并希望初始化存储在(或以其他方式)中var的任何正数。然后你可以使用.intvaluesvar = 0return

public class MyClass{

int var;

public MyClass(int[] values){
    for(int i : values){
        if(i > 0){
            var = i; 
            return;
        }
    }
}
//other methods
}
于 2017-04-20T20:21:05.960 回答
0
public class Demo{

 Demo(){
System.out.println("hello");
return;
 }

}
class Student{

public static void main(String args[]){

Demo d=new Demo();

}
}
//output will be -----------"hello"


public class Demo{

 Demo(){
return;
System.out.println("hello");

 }

}
class Student{

public static void main(String args[]){

Demo d=new Demo();

}
}
//it will throw Error
于 2018-05-09T19:08:02.913 回答