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禁止语言设计和内部类(或普通内部类)内的静态字段/方法实施方面,如果有人了解更多.
我有这样的代码:
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)
请告诉我它是什么?我认为这是因为我有嵌套类但不知道如何纠正错误.
我有点困惑,我根据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并且我对本地类(我最终从未使用过)有一些误解,我很清楚静态的概念,但不是本地类的情况.
1.为什么本地类不允许使用静态方法?
2.为什么方法中不允许使用静态本地类?
在这里,我不明白.对我来说,本地类与静态方法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)
这是不可能做到的:它有点含糊不清但我认为这里的静态与非静态具有相同的含义,因为静态类与静态方法相关联.我糊涂了.
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时,它只会引用它.
好吧,我知道这是规则:
根据JLS:8.1.3内部类和封闭实例,内部类可能不会声明静态初始化器或成员接口.内部类可能不会声明静态成员,除非它们是编译时常量字段.
根据8.5.2静态成员类型声明,"成员接口始终是隐式静态的.允许但不需要声明成员接口明确列出静态修饰符".他们总是顶级的,而不是内心的.
我只是想知道为什么.如果我们被允许在内部类中声明接口会发生什么?如果我将内部类放入另一个类文件中,内部类是否会成为顶级类?
可能重复:
为什么我们在内部类中没有静态方法?
我知道创建一个非静态内部类对象需要一个外部类对象,而创建的非静态内部类对象自动拥有一个对外部类对象的隐藏引用.但为什么非静态内部类不能有静态成员呢?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中究竟是什么原因导致我们不能在[public]内部类中声明静态方法,除非那些内部类也被声明为静态?
令人惊讶的是,顶级类可以拥有任意数量的静态方法,而无需任何特殊修饰符
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中的静态工厂方法)在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中的静态工厂方法实现我在这里尝试做的事情?
如果我没有做正确的事情,或者如果我没有看到我应该拥有的东西,我会提前道歉。
我开始使用 Java 进行编程,目前正在使用 Processing,它的核心是更用户友好且更易于理解的 Java 版本。我试图在类上定义一个静态方法(Java 允许),但它给了我错误“该方法不能声明为静态;静态方法只能在静态或顶级类型中声明。”
我的代码,为了演示问题而简化,如下所示:
class Item {
static void test() {
print("Hello");
}
}
Run Code Online (Sandbox Code Playgroud)
它不会运行或编译,据我所知,唯一的解决方法是使其非静态并在特定对象上调用它。
有没有一种方法可以定义它,以便我可以将其保留为静态方法?
在此先感谢您对这个问题的任何帮助。