我学习 Java 已经大约 6 周了,但仍在努力实现静态方法(以为我真的理解它,但这证明我错了!)。
我正在尝试公开本地存储的键值对的值。这是我的初始代码:
public class Settings extends Activity implements OnClickListener {
public Settings(TextView loginText, TextView passwdText) {
super();
this.loginText = loginText;
this.passwdText = passwdText;
}
public static String getDriverNum() {
SharedPreferences sp = getSharedPreferences(DELEX_SP, MODE_PRIVATE); <---ERROR
String Login = sp.getString("KeyLgn", "No Login Found");
return Login;
}
当然,我得到一个错误“Cannot make a static reference to the non-static method getSharedPreferences(String, int) from the type ContextWrapper”,所以我尝试将非静态方法包装在我自己的公共(public)方法中,作为类似的 StackOverflow answer表示:
public class Settings extends Activity implements OnClickListener {
public Settings(TextView loginText, TextView passwdText) {
super();
this.loginText = loginText;
this.passwdText = passwdText;
}
public static String getDriverNum() {
String Login = getSharedPref().getString("KeyLgn", "No Login Found"); <-- SAME ERROR
return Login;
}
public SharedPreferences getSharedPref() {
SharedPreferences sp = getSharedPreferences(DELEX_SP, MODE_PRIVATE);
return sp;
}
但这只是导致了同样的错误,因为我尚未解决对非静态 getSharedPreferences 方法的调用。解决这个问题的最佳方法是什么?是创建一个包装 getSharedPreferences 的类吗?
感谢您在我与静态命名法斗争时的耐心等待。
最佳答案
我认为您可能误解了静态的工作原理。
静态方法(或变量)是类的所有实例都有一个副本的方法(或变量),并且不需要类的实例来调用它。例如,
class MyClass {
public static void sayHello() {
System.out.println("hello");
}
}
可以调用为
MyClass.sayHello();
请注意,没有创建 MyClass 的新实例。
实例方法是需要类的特定实例并且通常依赖于类的某些内部状态的方法。
class MyClass {
// assume this is initialized somewhere in the constructor
private final String myName;
public void sayMyName() {
System.out.println(myName);
}
}
现在您需要该类的特定实例
MyClass m = new MyClass("Bill");
m.sayMyName();
静态方法不能引用实例方法(或实例变量),因为静态方法不绑定(bind)到类的特定实例。
非静态方法可以访问非静态和静态方法。
一般来说,如果一个方法依赖于实例的状态,它应该是一个非静态方法。如果它不依赖于实例的内部状态,那么它可以是静态方法。
在您的情况下,getSharedPref
不会从Settings
实例访问任何状态,因此可以将其制成静态方法,然后可以由其他静态方法访问类中的方法。
关于java - 很难制作利用非静态方法的静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11321853/