无法对非静态方法进行静态引用

Che*_*n M 97 java static-methods compiler-errors

用Java构建多语言应用程序.从R.string资源XML文件插入String值时出错:

public static final String TTT =  (String) getText(R.string.TTT);
Run Code Online (Sandbox Code Playgroud)

这是错误消息:

错误:无法从Context类型对非静态方法getText(int)进行静态引用

这是怎么造成的,我该如何解决?

Pre*_*gha 138

由于getText()是非静态的,因此无法从静态方法调用它.

要了解原因,您必须了解两者之间的区别.

实例(非静态)方法适用于特定类型(类)的对象.这些是用这样的新创建的:

SomeClass myObject = new SomeClass();
Run Code Online (Sandbox Code Playgroud)

要调用实例方法,请在instance(myObject)上调用它:

myObject.getText(...)
Run Code Online (Sandbox Code Playgroud)

但是,静态方法/字段只能直接在类型上调用,如下所示: 前面的语句不正确.也可以使用对象引用来引用静态字段, myObject.staticMethod()但不鼓励这样做,因为它并不清楚它们是类变量.

... = SomeClass.final
Run Code Online (Sandbox Code Playgroud)

这两个不能一起工作,因为它们在不同的数据空间(实例数据和类数据)上运行

让我试着解释一下.考虑这个类(伪代码):

class Test {
     string somedata = "99";
     string getText() { return somedata; } 
     static string TTT = "0";
}
Run Code Online (Sandbox Code Playgroud)

现在我有以下用例:

Test item1 = new Test();
 item1.somedata = "200";

 Test item2 = new Test();

 Test.TTT = "1";
Run Code Online (Sandbox Code Playgroud)

有什么价值?

in item1 TTT = 1 and somedata = 200
in item2 TTT = 1 and somedata = 99
Run Code Online (Sandbox Code Playgroud)

换句话说,TTT是该类型的所有实例共享的数据.所以说没有意义

class Test {
         string somedata = "99";
         string getText() { return somedata; } 
  static string TTT = getText(); // error there is is no somedata at this point 
}
Run Code Online (Sandbox Code Playgroud)

所以问题是为什么TTT是静态的还是为什么getText()不是静态的?

删除它static,它应该通过这个错误 - 但不知道你的类型是什么,它只是一个粘贴膏药,直到下一个错误.有什么要求getText()要求它是非静态的?


dav*_*e.c 11

已经有一些很好的答案,解释了为什么非静态Context方法的混合物getText()不能用于你的static final String.

一个很好的问题是:你为什么要这样做?您正在尝试Stringstrings资源加载a ,并将其值填充到public static字段中.我认为这是为了让你的其他一些类可以访问它?如果是这样,则没有必要这样做.而是将a传递Context到您的其他类并context.getText(R.string.TTT)从其中调用.

public class NonActivity {

    public static void doStuff(Context context) {
        String TTT = context.getText(R.string.TTT);
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

并从你这称呼Activity:

NonActivity.doStuff(this);
Run Code Online (Sandbox Code Playgroud)

这将允许您访问您的String资源,而无需使用public static字段.


Spi*_*ail 8

对于在搜索中找到此内容的其他人:

当我不小心使用类名而不是对象名调用函数时,我经常得到这个.这通常是因为我给他们太相似的名字:P

即:

MyClass myclass = new MyClass();

// then later

MyClass.someFunction();
Run Code Online (Sandbox Code Playgroud)

这显然是一种静态方法.(对某些事情有好处)但我真正想做的事情(在大多数情况下是)

myclass.someFunction();
Run Code Online (Sandbox Code Playgroud)

这是一个如此愚蠢的错误,但每隔几个月,我浪费了大约30分钟搞乱"MyClass"定义中的变量来解决我真正做错的事情,这只是一个错字.

有趣的说明:堆栈溢出突出了语法,使错误在这里显而易见.