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

新手上路,请多包涵

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

 public static final String TTT =  (String) getText(R.string.TTT);

这是错误消息:

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

这是怎么引起的,我该如何解决?

原文由 Chen M 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

由于 getText() 是非静态的,因此您不能从静态方法中调用它。

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

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

 SomeClass myObject = new SomeClass();

要调用实例方法,您可以在实例上调用它( myObject ):

 myObject.getText(...)

但是静态方法/字段 只能 直接在类型上调用,这样说: 前面的说法不正确。也可以使用像 myObject.staticMethod() 这样 的对象引用来引用静态字段, 但不鼓励这样做,因为它没有明确表示它们是类变量。

 ... = SomeClass.final

并且两者不能协同工作,因为它们在不同的数据空间(实例数据和类数据)上运行

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

 class Test {
     string somedata = "99";
     string getText() { return somedata; }
     static string TTT = "0";
}

现在我有以下用例:

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

 Test item2 = new Test();

 Test.TTT = "1";

价值观是什么?

出色地

in item1 TTT = 1 and somedata = 200
in item2 TTT = 1 and somedata = 99

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

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

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

删除 static 它应该可以解决这个错误 - 但如果不了解你的类型是做什么的,它只是一块橡皮膏,直到下一个错误。 getText() 要求它是非静态的有什么要求?

原文由 Preet Sangha 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

一个很好的问题是:你为什么要这样做?您正在尝试从您的 strings 资源加载 String 并将其值填充到 public static 字段中我假设这是为了让您的其他一些类可以访问它?如果是这样,则无需执行此操作。而是将 Context 传递到您的其他类中,然后从它们内部调用 context.getText(R.string.TTT)

 public class NonActivity {

    public static void doStuff(Context context) {
        String TTT = context.getText(R.string.TTT);
        ...
    }
}

并从您的 Activity 调用它:

 NonActivity.doStuff(this);

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

原文由 dave.c 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题