无法调用Java String函数,因为它不是静态的

时间:2014-03-22 23:05:49

标签: java string methods static-methods

让我进一步解释。我有一个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();
    }

}

3 个答案:

答案 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)

您有两种选择:

  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...
    }
    
  2. 制作方法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...
    }
    
  3. 无论哪种方式,你都必须修复你的&#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方法是静态的,但它所在的类不是。为了调用非静态方法,您需要创建该类的实例。或者,该方法可以是静态的,但是为了引用它,您需要在调用中包含类名(就像使用类本身一样,包含该方法的对象 - 见下文)。

这个问题有三种解决方案:

  • 创建类的实例并从对象(推荐)调用方法。
  • 使方法成为静态并使用StringReverse.stringReversal()。
  • 使类和方法保持静态。