相关疑难解决方法(0)

为什么Java禁止内部类中的静态字段?

class OuterClass {
 class InnerClass {
  static int i = 100; // compile error
  static void f() { } // compile error
 }
} 
Run Code Online (Sandbox Code Playgroud)

虽然无法访问静态字段OuterClass.InnerClass.i,但如果我想记录一些应该是静态的东西,例如创建的InnerClass对象的数量,那么将该字段设置为静态会很有帮助.那么为什么 Java禁止内部类中的静态字段/方法呢?

编辑:我知道如何使编译器满意静态嵌套类(或静态内部类),但我想知道的是为什么java禁止语言设计和内部类(或普通内部类)内的静态字段/方法实施方面,如果有人了解更多.

java static-members inner-classes

79
推荐指数
7
解决办法
3万
查看次数

公共嵌套类中的静态final字段

我有这样的代码:

public class Foo {
    public class Bar implements Parcelable {
        public static final Parcelable.Creator<Type> CREATOR =
                   new Parcelable.Creator<Type>() {
                   @Override
                   ....
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Eclipse说:

The field CREATOR cannot be declared static in a non-static inner type, unless 
initialized with a constant expression
Run Code Online (Sandbox Code Playgroud)

请告诉我它是什么?我认为这是因为我有嵌套类但不知道如何纠正错误.

java eclipse

18
推荐指数
2
解决办法
6417
查看次数

RecyclerView:内部类不能有静态声明

我有点困惑,我根据google/android网站上的教程设置了recyclerview,我收到以下错误

 Inner classes cannot have static declaration
Run Code Online (Sandbox Code Playgroud)

当然我有一个嵌套的静态类,但这是android/google定义它的方式.

  public class ItemsViewAdapter extends RecyclerView.Adapter<ItemsViewAdapter.ViewHolder> {
        ... 
        ...
       public static class ViewHolder extends RecyclerView.ViewHolder {
           ...
       }
Run Code Online (Sandbox Code Playgroud)

为什么我要解决这个错误,我听说最好使用嵌套类作为静态,这样你就不会浪费一个引用但是当前版本的android studio正在抱怨

有任何想法吗 ?

谢谢

java android android-recyclerview

11
推荐指数
1
解决办法
1万
查看次数

为什么方法中不允许使用静态本地类?

我一直在刷掉我的java并且我对本地类(我最终从未使用过)有一些误解,我很清楚静态的概念,但不是本地类的情况.

1.为什么本地类不允许使用静态方法?

2.为什么方法中不允许使用静态本地类?

  1. 本地类中不允许使用静态方法:

在这里,我不明白.对我来说,本地类与静态方法main相关联.我只是不明白为什么不能这样做.方法main通过Sequence类访问,然后因为sayGoodbye是静态的,所以应该通过它的类访问它.但不是.

public class Sequence {

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

        class EnglishGoodbye {
            public static void sayGoodbye() { // this cannot be done
                System.out.println("Bye bye");
            }
        }
        EnglishGoodbye.sayGoodbye();
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 方法中不允许使用静态本地类:

这是不可能做到的:它有点含糊不清但我认为这里的静态与非静态具有相同的含义,因为静态类与静态方法相关联.我糊涂了.

public class Sequence {

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

        static class EnglishGoodbye { //static local classes not allowed
            public static void sayGoodbye() {
                System.out.println("Bye bye");
            }
        }
        EnglishGoodbye.sayGoodbye();
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑: 我得到的第一个答案是来自oracle的引用:

本地类是非静态的,因为它们可以访问封闭块的实例成员.因此,它们不能包含大多数类型的静态声明.

和我的回复:

但这并没有真正解释一切.如果您有内部类,则无法访问非静态字段,但可以访问静态字段.同样应该适用于本地类,因为没有静态变量,所以它是无用的.但是在我的例子中,方法呢.

好吧,我制作了一个模式来更好地解释我如何看待事物.虽然这可能完全是错误的,但我有点羞于表现出来.在这种模式中,并在场景中静态局部类可以访问我不得不在顶部内存块的局部类.每当调用静态方法2时,它只会引用它.

在此输入图像描述

java oop class

11
推荐指数
1
解决办法
2163
查看次数

为什么界面只能在顶级类中声明?

好吧,我知道这是规则:

根据JLS:8.1.3内部类和封闭实例,内部类可能不会声明静态初始化器或成员接口.内部类可能不会声明静态成员,除非它们是编译时常量字段.

根据8.5.2静态成员类型声明,"成员接口始终是隐式静态的.允许但不需要声明成员接口明确列出静态修饰符".他们总是顶级的,而不是内心的.

我只是想知道为什么.如果我们被允许在内部类中声明接口会发生什么?如果我将内部类放入另一个类文件中,内部类是否会成为顶级类?

java oop interface class inner-classes

10
推荐指数
1
解决办法
4238
查看次数

为什么非静态内部类不能有静态成员(字段和方法)?

可能重复:
为什么我们在内部类中没有静态方法?

我知道创建一个非静态内部类对象需要一个外部类对象,而创建的非静态内部类对象自动拥有一个对外部类对象的隐藏引用.但为什么非静态内部类不能有静态成员呢?Java设计者只需要禁止在内部类的静态方法内访问非静态外部类字段,它会更有意义,非?

如果在内部类中使用静态成员没有意义,为什么内部类可以通过继承具有静态成员的类来继承静态成员?

我也读了这篇文章.如上所述:

内部类可以继承非编译时常量的静态成员,即使它们可能不会声明它们.不是内部类的嵌套类可以根据Java编程语言的通常规则自由地声明静态成员.

这是一个惯例吗?

这是我的代码:

public class OuterClass {

    private int outerClassField;

    public void doSomethingOuterClass() {
        outerClassField = 1;
    }

    public static void doSomethingStaticOuterClass() {
        // outerClassField = 2; // Error: Because static method cannot access an specific object's field
    }

    public class InnerClass extends ClassWithStaticField {

        // Error: Why a non-static inner class cannot have static fields ?
        // public static int innerClassStaticField = 1;

        public void doSomethingInnerClass() {
            outerClassField = 3;
            staticField = …
Run Code Online (Sandbox Code Playgroud)

java static static-members inner-classes non-static

10
推荐指数
2
解决办法
8872
查看次数

究竟是什么原因导致我们无法在[public]内部类中声明静态方法,除非那些内部类也被声明为static?azi

可能重复:
为什么我们在内部类中没有静态方法?

大家好,在java中究竟是什么原因导致我们不能在[public]内部类中声明静态方法,除非那些内部类也被声明为静态?

令人惊讶的是,顶级类可以拥有任意数量的静态方法,而无需任何特殊修饰符

java syntax static class

7
推荐指数
1
解决办法
4144
查看次数

除非使用常量表达式初始化,否则不能在非静态内部类型中声明static

public class Test {

public enum Directions {
        NORTH, WEST, SOUTH, EAST
    }

    static final Directions D1 = Directions.NORTH;

    static class Inner {
        static final Directions D2 = Directions.NORTH;
    }

    class Inner2 {
        static final Directions D3 = Directions.NORTH;
    }

}
Run Code Online (Sandbox Code Playgroud)

我正在获取标题中的IDE-Error,指的是变量D3.有人可以向我解释一下吗?为什么我不能在非静态的内部类中声明静态变量,为什么枚举值不是常量?

java

6
推荐指数
1
解决办法
4509
查看次数

内部嵌套类的Kotlin工厂

我正在尝试使用伴随对象工厂方法(相当于Java中的静态工厂方法)在Kotlin中创建嵌套的内部类.这是我的代码的简化版本.

class OuterClass {

    var myData:List<MyData> = List<>() //gets populated elsewhere

    fun getItemFragment(position:Int) : Fragment() {
        return InnerClass.Factory.newInstance(position)
    }

    inner class InnerClass : Fragment() {

        companion object Factory {

            fun newInstance(position:Int) : InnerClass {
                var ic : InnerClass = InnerClass()
                var bundle:Bundle = Bundle()
                bundle.putInt("index", position)
                ic.arguments = bundle
                return ic
            }

        }

        override fun onCreateView(inflater:LayoutInflater, container: ViewGroup, savedInstanceState:Bundle): View? {
            //create and return view, omitted. Need access to myData
    }
}
Run Code Online (Sandbox Code Playgroud)

编译器突出显示"伴侣",说"Modifier伴侣不适用于内部类",它还突出显示了InnerClass()调用,说"表达式是从嵌套类Factory无法访问",使用"inner"关键字使类内部.

如何使用Java中的静态工厂方法实现我在这里尝试做的事情?

kotlin

3
推荐指数
1
解决办法
5877
查看次数

处理中不允许使用静态方法?

如果我没有做正确的事情,或者如果我没有看到我应该拥有的东西,我会提前道歉。

我开始使用 Java 进行编程,目前正在使用 Processing,它的核心是更用户友好且更易于理解的 Java 版本。我试图在类上定义一个静态方法(Java 允许),但它给了我错误“该方法不能声明为静态;静态方法只能在静态或顶级类型中声明。”

我的代码,为了演示问题而简化,如下所示:

class Item {
  static void test() {
    print("Hello");
  }
}
Run Code Online (Sandbox Code Playgroud)

它不会运行或编译,据我所知,唯一的解决方法是使其非静态并在特定对象上调用它。

有没有一种方法可以定义它,以便我可以将其保留为静态方法?

在此先感谢您对这个问题的任何帮助。

processing static

2
推荐指数
1
解决办法
1701
查看次数