Java 构造函数实际上可以返回字符串吗?
我在一个同名的.java文件中有一个名为ArionFileExtractor的类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
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))构造函数不返回任何内容。它初始化数据。