静态方法和非静态方法Java

  • 本文关键字:静态方法 Java java
  • 更新时间 :
  • 英文 :


我知道我在做一些愚蠢的事情,但我不知道如何解决它。

问题出在private方法内部,removeVowels使用vowels方法时。

编译器给出

non-static variable vowels cannot be referenced from a static context

这是我的代码:

   public class RecursionHW2 {
            String vowels;
            // Part (A) First way
            public static int upperCase(String myString){
                return upperCaseChecker(myString , 0 );
            }
            public static int upperCaseChecker(String myString, int index){
                int inc;
                //My Base Code
                if(myString.length() <= index) return 0;
                if(Character.isUpperCase(myString.charAt(index)) == true) inc= 1;
                    else inc= 0;
                return inc+upperCaseChecker(myString,index+1);
            }

            // First way of Solving part (B)
            public static int count(String str, char a)
            {
                if (str.length() == 0)
                    return 0;
                else if (str.charAt(0) == a)
                    return 1 + count(str.substring(1, str.length()), a);
                else
                    return count(str.substring(1, str.length()), a);
            }

            //Second way of solving part (B)
            public static int anotherCount(String myString, char myWord)
            {
                return anotherCount(myString, myWord, 0);
            }
            public static int anotherCount(String myString, char myWord, int index)
            {
                int inc;
                if (index >= myString.length())
                {
                    return 0;
                }
                if (myString.charAt(index) == myWord)  inc =1;
                    else
                        inc = 0;
                return inc + anotherCount(myString, myWord, index+1);
            }

            // part (C) solving
            public Boolean isSorted(int[] a, int n)
            {
            if(n == 0 || n == 1) return true;
            else
            return isSorted(a, n, 1);
            }
            private Boolean isSorted(int[] a, int n, int cur)
            {
                if(cur == n) return true;
                if(a[cur - 1] <= a[cur])
                    return isSorted(a, n, cur+1);
                else
                    return false;
            }

            //part (D) Solving
            public static String removeVowels(String myString)
            {
                return removeVowels(myString, "");
            }
            private static String removeVowels(String myString, String t)
            {
                if(myString.length() == 0) return t;
                if(vowels.contains(myString.charAt(0) + ""))
                    return removeVowels(myString.substring(1), t);
                else
                    return removeVowels(myString.substring(1), t + myString.charAt(0));
            }

        public static void main(String[] args){

            //I've wrote 2 ways to solve the Second Recursive Q2
            System.out.println("Method 1: Number of Occurence " + count("Hello  This is Mohammad Fadin",'o'));
        //  System.out.println("Method 2: Number of Occurence "+ anotherCount("Hello This is Mohammad Fadin",'o'));
            String s1 = "Hello WorlDD";
            System.out.println("Number of Upper Cases " + upperCase(s1));
            String s2 = "Hello";
            System.out.println("After Vowels Removed " + removeVowels(s2));
        }

    }

你已经用main方法的static"感染"了你的代码。 在你的main方法中,你应该做这样的事情,所以你不必让一切都static

public class RecursionHW2
{
  public static void main(String[] args)
  {
    RecursionHW2 rhw2 = new RecursionHW2();
    int count = rhw2.count("Hello world");
    // and so on
  }
}

不能从静态上下文引用实例变量。您必须先创建一个RecursionHW2实例,或者使变量vowels静态的,这更有意义。或者,您可以考虑从方法中删除静态修饰符removeVowels

更新:
但是,您的类看起来像一堆实用方法,因此您可能希望使其不可实例化(通过添加私有构造函数(,使所有方法都是静态的(因为它们显然不对对象的状态进行操作(,并将vowels作为附加参数传递给removeVowels方法。

问题正是编译器告诉您的:您正在从静态上下文中引用非静态(实例(变量vowels。实际上,几乎所有的方法都是静态的,这是一个非常糟糕的设计。

使所有需要访问实例数据的方法(此处:vowels实例变量(非静态,并在 main() 中实例化您的类。

更改:

String vowels;

自:

static String vowels;

不能在静态方法中使用字符串元音,因为元音是非静态的。您需要在字符串中添加 static 关键字,然后您的代码就可以工作了。

你可以使变量成为静态的,或者只是保持所有内容都是非静态的,这将得到解决。你需要问自己的更大的问题是,我什么时候应该使用静态,什么时候不应该?

更改

String vowels;

static String vowels;

所有的方法都是静态的,因此不需要存在对象的实例 - 即您不必说

x = new RecursionHW2(); 
x.upperCase(..);

但是,如果不使元音成为静态元音,则除非实例化对象,否则元音不存在。

静态变量属于类,不属于类实例(对象(的静态变量。

测试

class Foo {
    private static String vowers;
    private String bar;
}

Foo a = new Foo ()

正在创建类 Foo 的新实例,每个实例都有自己的变量栏,但所有共享 vowers 变量,因为这属于该类。 静态方法也是如此。

在静态方法

(类方法(中,不能引用非静态变量。为什么会这样?

假设您从静态方法引用了一个非静态变量

class Foo {
    private static String vowers;
    private String bar;
    public static void exampleMethod () {
       bar = "home";
    }
}

如果这样做:

Foo a = new Foo () / / has a new bar
Foo b = new Foo () / / has a new bar

元音是单个变量,属于类而不是实例

当你

Foo.exampleMethod()

该方法不知道该变量使用的实例a或变量实例b。因此,您只能从静态方法访问类的静态变量

最新更新