Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.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 - Fatal编程技术网

为什么Java中的本地类不能有静态方法?

为什么Java中的本地类不能有静态方法?,java,Java,在方法main中,类计数器具有返回给定字符串中数字数量的方法数量 public static void main(String... args) { class Counter{ static final String numbers="0123456789"; int quantity(String main){ int i=0; for (char c:main.toCharArray()){

在方法main中,类计数器具有返回给定字符串中数字数量的方法数量

 public static void main(String... args) {

    class Counter{
        static final String numbers="0123456789";
        int quantity(String main){
           int i=0;
            for (char c:main.toCharArray()){
                if (numbers.contains(Character.toString(c)))
                i++;
                }
         return i;
        }
    }

    String str="a0b3s2d6";
    Counter c=new Counter();
    System.out.println(c.quantity(str));
}

我认为创建计数器的实例是uselles,只调用
Counter.quantity(str)
将比创建实例更容易。那么为什么我们不能在本地类中使用静态方法呢?

因为静态方法可以从代码的任何地方调用

由于类
计数器
在其他类的局部作用域中而无法访问,您将如何调用该类的静态方法

你做错了什么

UPD

为什么要尝试实例化静态类

计数器c=新计数器()


您实际想要达到的目标是什么?

Static:Static关键字创建属于类的字段和方法,而不是属于类的实例。我们将成员和方法设置为静态,以便可以在其他地方使用,也可以通过使用类名从任何地方调用

如果我们使内部类的成员仍然是静态的,我们将无法在该类之外访问它


在这种情况下,内部类与其外部类的实例相关联,它本身不能定义任何静态方法。静态嵌套类不能直接引用其封闭类中定义的实例变量或方法,只能通过对象引用使用它们。

只有在初始化父类时才能创建局部类。提到它们是静态的意味着它们应该在类初始化之前创建,这是不可能的


有关更多详细信息,请参见如果要调用类似
Counter.quantity(str)
的方法,可以在main方法外定义类

public static void main(String... args) {
    String str = "a0b3s2d6";
    System.out.println(Counter.quantity(str));
}

static class Counter {
    static final String numbers = "0123456789";

    static int quantity(String main) {
        int i = 0;
        for (char c : main.toCharArray()) {
            if (numbers.contains(Character.toString(c)))
                i++;
        }
        return i;
    }
}

那不是一个静态类。这是一个。当您声明静态成员时,您隐式地声明了静态类。如果您想要重写方法,那么您不能重写静态方法,因此您失去了继承OOPS概念。您可以在
静态void main(…)之外重构
计数器
方法,并将计数器类和方法声明为静态。这应该使您能够调用
System.out.println(Counter.quantity(str))you@AnantLaxmikantBobde实用程序类通常是这样设计的。在utitlity类中添加新方法或在此处创建新的实用程序类通常是解决方案。如果一个实用程序类的设计考虑到灵活性,那么就可以使用策略模式在运行时切换具体的实现——Spring Security
SecurityContextHolder
类建立在该概念的基础上,您可以将其策略定义为
GLOBAL
THREADLOCAL
INHERITEDTHREADLOCAL