Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 构造函数实际上可以返回字符串吗?_Java_String_Constructor_Return - Fatal编程技术网

Java 构造函数实际上可以返回字符串吗?

Java 构造函数实际上可以返回字符串吗?,java,string,constructor,return,Java,String,Constructor,Return,我在一个同名的.java文件中有一个名为ArionFileExtractor的类 public class ArionFileExtractor { public String ArionFileExtractor (String fName, String startText, String endText) { String afExtract = ""; // Extract string from fName into afExtract in code I won't

我在一个同名的.java文件中有一个名为ArionFileExtractor的类

public class ArionFileExtractor {

public String ArionFileExtractor (String fName, String startText, String endText) {
    String afExtract = "";
    // Extract string from fName into afExtract in code I won't show here
    return afExtract;
}
但是,当我尝试在另一个.java文件中调用ArionFileExtractor时,如下所示:

String afe = ArionFileExtractor("gibberish.txt", "foo", "/foo");
NetBeans通知我存在不兼容的类型,并且需要java.lang.String。但是我编写了ArionFileExtractor以返回标准字符串类型,即java.lang.string

我想知道,我的ArionFileExtractor构造函数是否可以合法地返回字符串

我非常感谢任何关于我在这里做错了什么的提示或指点。

不。 构造函数实际上不会返回任何内容。相反,它构建有问题的对象

看起来您需要一个实用方法:

public class Whatever {
   public static String doStuff(String s) {
      return s;
   }
}

构造函数创建对象,但不返回数据。

构造函数不是常规方法。它总是返回它所属的类的实例。在您的示例中,使用ArionFileExtractor。无法返回任何其他实例


请注意,您不能显式指定构造函数的返回类型,也不能使用return关键字(在此上下文中是非法的)。

构造函数只能返回其类的实例。它不能返回字符串。
例如,如果您有类SampleClass,则构造函数只能返回类SampleClass的对象。

构造函数只能返回它构造的对象的实例-否则您就没有可挂起刚创建的对象的引用!如果您想进行“实用”调用,请考虑静态方法:

public class ArionFileExtractor {
    public static String getFileContents(String fName, String startText, String endText) {
        String afExtract = "";
        // Extract string from fName into afExtract in code I won't show here
        return afExtract;
    }
}
可以使用

ArionFileExtractor.getFileContents(...)

您的方法,
ArionFileExtractor()
,不是构造函数。构造函数没有返回类型,如下所示:

public  ArionFileExtractor (String fName, String startText, String endText) {
    //...
}
public class ArionFileExtractor {

private ArionFileExtractor() {}

public static String ExtractFile(String fName, String startText, String endText) {
    String afExtract = "";
    // Extract string from fName into afExtract in code I won't show here
    return afExtract;
}
}

请注意缺少返回类型。

不,它应该不能合法地返回字符串。我不知道为什么Netbeans在你尝试的时候没有对你吐。也许它试图把它编译成某种静态方法。构造函数在代码中通常没有返回类型,因为在编译它们时,它们被指定返回它们所构造的类的实例

调整代码的最简单(但不一定是最好的)方法是使用空构造函数,并将当前构造函数转换为静态方法,如下所示:

public  ArionFileExtractor (String fName, String startText, String endText) {
    //...
}
public class ArionFileExtractor {

private ArionFileExtractor() {}

public static String ExtractFile(String fName, String startText, String endText) {
    String afExtract = "";
    // Extract string from fName into afExtract in code I won't show here
    return afExtract;
}
}
私有构造函数使ArionFileExtractor只能静态使用,不能实例化。然后,当您使用它时,您只需执行以下操作:

String afe = ArionFileExtractor.ExtractFile("gibberish.txt", "foo", "/foo");

请注意,使用静态类有时被认为是不好的形式-这取决于具体情况。因此,尝试提出一种不同的方法可能是值得的。

Java编译器将ArionFileExtractor视为一种实例方法

String afe = new ArionFileExtractor().ArionFileExtractor("gibberish.txt", "foo", "/foo");

令人惊讶的是,您编写的代码有一个默认的无参数构造函数。ArionFileExtractor是一个返回字符串的方法。当我第一次看到这样做的代码时,我非常惊讶,因为这肯定是一个意外(就像您的情况一样)

您可以通过以下方式调用您的方法(只是为了说明情况):

听起来您真正想要的是一个静态方法,而不是一个类

public class ArionFileExtractor() {
       public static String extract(String fName, String startText, String endText) {
             String afExtract = "";
               // Extract string from fName into afExtract in code I won't show here
            return afExtract;
       }
}
您可以通过以下方式调用:

String afe = ArionFileExtractor.extract("gibberish.txt", "foo", "/foo");

是。只有字符串类构造函数才能从中返回字符串对象;)


这基本上意味着构造函数创建您正在调用的类的对象。

您需要首先创建对象(使用构造函数),然后使用它进行操作


Java几乎没有智能捷径。我

我认为你应该多读一点关于面向对象编程的知识。似乎您不理解这个概念,因为您为一个简单的字符串任务编写了一个类。谢谢您的建议。我将回到书中。@stefita,在Java中,因为一切都是一个类,如果你只需要一个静态方法,你仍然需要将它包装在一个类中,即使它不是OO意义上的真正对象。有一点有趣的是:在Python中使用
\uu new\uu
方法实际上可以做这类事情,如果你想耍花招的话。(这是一种很容易被滥用的能力)@David:关于一种无关语言试图执行一项公认荒谬的任务的评论+1将::替换为a。您已经准备好了,因为它是Java。:)实际上,Java中的
ArionFileExtractor.getFileContents(…)
(它什么都不使用::)。但还是+1。@crunchdog,@davidgah!感谢现场,在下午的剩余时间里,我的C++头都被关闭了。构造函数是一种没有返回类型(甚至是无效)的方法,它的标识符与类名相同。如果您返回了任何内容,那么您并不是在编写构造函数。构造函数是用
new
关键字调用的,因此如果您试图在不使用
new
的情况下使用现有构造函数,那么您就错了。这是一个很好的观点,你不能说它实际上返回了一个新创建对象的实例。答案很简单,对您的声誉有好处:-)如果您想学究式地使用它,构造函数不会返回任何内容,但在分配给变量时,它会对引用求值皮认为答案应该很简单。与其说是执行,不如说是理念。我同意帕夫的观点。简单就是好。elwynn需要一个快速简单的“这就是为什么”,而不是深入的学术讨论。构造函数不返回任何东西,返回实例的是新表达式(类实例创建表达式)。((同样在字节码中,构造函数返回void))构造函数不返回任何内容。它初始化数据。