Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cannot make a static reference to the non-static method

Building a multi-language application in Java. Getting an error when inserting String value from R.string resource XML file:

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

This is the error message:

Error: Cannot make a static reference to the non-static method getText(int) from the type Context

How is this caused and how can I solve it?

like image 716
Chen M Avatar asked Feb 11 '11 12:02

Chen M


People also ask

How do you solve Cannot make a static reference to the non-static method?

The obvious solution to fix "Cannot make a static reference to the non-static method or a non-static field" error in Java is to create an instance of the class and then access the non-static members. That's all for this topic Fix Cannot make a static Reference to The Non-static Method Error.

Can we make static reference to non-static method?

i.e. referring a variable using static reference implies to referring using the class name. But, to access instance variables it is a must to create an object, these are not available in the memory, before instantiation. Therefore, you cannot make static reference to non-static fields(variables) in Java.

Why is it not possible to reference non-static fields from a static method?

Why does this error occur? For the non-static variable, there is a need for an object instance to call the variables. We can also create multiple objects by assigning different values for that non-static variable. So, different objects may have different values for the same variable.

How do you reference non-static?

You cannot refer non-static members from a static method. Non-Static members (like your fxn(int y)) can be called only from an instance of your class. or you can declare you method as static.


2 Answers

Since getText() is non-static you cannot call it from a static method.

To understand why, you have to understand the difference between the two.

Instance (non-static) methods work on objects that are of a particular type (the class). These are created with the new like this:

SomeClass myObject = new SomeClass(); 

To call an instance method, you call it on the instance (myObject):

myObject.getText(...) 

However a static method/field can be called only on the type directly, say like this: The previous statement is not correct. One can also refer to static fields with an object reference like myObject.staticMethod() but this is discouraged because it does not make it clear that they are class variables.

... = SomeClass.final 

And the two cannot work together as they operate on different data spaces (instance data and class data)

Let me try and explain. Consider this class (psuedocode):

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

Now I have the following use case:

Test item1 = new Test();  item1.somedata = "200";   Test item2 = new Test();   Test.TTT = "1"; 

What are the values?

Well

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

In other words, TTT is a datum that is shared by all the instances of the type. So it make no sense to say

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

So the question is why is TTT static or why is getText() not static?

Remove the static and it should get past this error - but without understanding what your type does it's only a sticking plaster till the next error. What are the requirements of getText() that require it to be non-static?

like image 113
Preet Sangha Avatar answered Nov 15 '22 13:11

Preet Sangha


There are some good answers already with explanations of why the mixture of the non-static Context method getText() can't be used with your static final String.

A good question to ask is: why do you want to do this? You are attempting to load a String from your strings resource, and populate its value into a public static field. I assume that this is so that some of your other classes can access it? If so, there is no need to do this. Instead pass a Context into your other classes and call context.getText(R.string.TTT) from within them.

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

And to call this from your Activity:

NonActivity.doStuff(this); 

This will allow you to access your String resource without needing to use a public static field.

like image 28
dave.c Avatar answered Nov 15 '22 14:11

dave.c