让我进一步解释。我有一个String函数(称为stringReversal),它返回一个反向字符串,它在函数中没有错误。但是,当我尝试使用main函数中的System.out.println()
进行打印时,它会给出错误"无法对StringReverse"类型的非静态方法stringReversal(string s)进行静态引用。
我尝试给我的stringReversal一个static
修饰符,但在这样做之后,它给了我运行时错误。
这是我的代码:
public class StringReverse {
public String stringReversal(String s){
if(s == null){
return null;
}
else if(s.length()% 2 == 0){
int size = s.length();
for(int i =0; i<s.length(); i++){
s.replace(s.charAt(i), s.charAt(size));
size--;
if(i == (s.length()/2) || size==0)
break;
}
}
else{
for(int i =0; i<s.length(); i++){
int size = s.length();
s.replace(s.charAt(i), s.charAt(size));
size--;
if(i == ((s.length()/2) +1) || size==0 )
break;
}
}
return s;
}
public static void main(String[] args) {
String str = "Hello";
String rev = stringReversal(str);
System.out.println();
}
}
答案 0 :(得分:1)
你必须实例化你的类来调用对象成员,或者你需要使你的函数变为静态,表明它不是面向对象范式的一部分
在你的情况下你可以做到
StringReverse sr = new StringReverse();
String rev = sr.stringReversal("hello");
或以不同方式声明您的方法
public static String stringReversal(String s)
实际上类名StringReverse本身听起来不像某种对象,所以第二种方式是首选的impo
你遇到的更深层次的问题是Java如何处理OO和入口函数。 Java主要是一种OO语言,所以大多数时候一切都应该是一个对象或一个对象的成员。但是当你告诉VM运行一些java代码时,必须有一个起点,这是主要的方法。必须有一个主要方法,它必须在某个类下,但它实际上与包含它的类无关。在main方法中,您可以通过实例化对象并调用其成员(方法1)来开始您的OO生活,或者通过将其他静态成员作为过程调用(方法2),在意大利面条世界中停留一段时间。
答案 1 :(得分:1)
您有两种选择:
保持方法非static
,然后创建类的实例以调用方法:
public static void main(String[] args) {
String str = "Hello";
StringReverse sr = new StringReverse(); // instance of class
String rev = sr.stringReversal(str);
System.out.println(); // just prints a blank line lol...
}
制作方法static
(你应该这样做):
public static String stringReversal(String s) {
// ...
}
public static void main(String[] args) {
String str = "Hello";
String rev = stringReversal(str);
System.out.println(); // just prints a blank line lol...
}
无论哪种方式,你都必须修复你的&#34;运行时错误&#34;。你无法解决这个问题。如果您的方法不起作用,请保持static
不会使其无效。
顺便说一句,我认为您打算System.out.println(rev);
代替System.out.println();
对于记录,这里是如何轻松地反转字符串(两种方法都有效):
public static String stringReversal(String s) {
StringBuffer reverseString = new StringBuffer();
// reverse the string
for (int i = s.length() - 1; i > -1; i--) {
reverseString.append(s.charAt(i));
}
return reverseString.toString();
}
/* using the reverse() method in the StringBuffer class
instead of reversing the string through iterations */
public static String stringReversal2(String s) {
return new StringBuffer(s).reverse().toString();
}
答案 2 :(得分:0)
这种情况正在发生,因为您的Main方法是静态的,但它所在的类不是。为了调用非静态方法,您需要创建该类的实例。或者,该方法可以是静态的,但是为了引用它,您需要在调用中包含类名(就像使用类本身一样,包含该方法的对象 - 见下文)。
这个问题有三种解决方案: