Java 在使用非静态方法的静态方法上有困难

Java 在使用非静态方法的静态方法上有困难,java,android,instantiation,static,Java,Android,Instantiation,Static,我学习Java已经6周了,仍然在努力实现静态方法(虽然我真的理解它,但这证明我错了!) 我试图公开本地存储的键值对的值。这是我的初始代码: public class Settings extends Activity implements OnClickListener { public Settings(TextView loginText, TextView passwdText) { super(); this.loginText = loginText;

我学习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;
}
公共类设置扩展活动实现OnClickListener{
公共设置(文本视图登录文本、文本视图密码文本){
超级();
this.loginText=loginText;
this.passwdText=passwdText;
}
公共静态字符串getDriverNum(){

SharedReferences sp=getSharedReferences(DELEX_sp,MODE_PRIVATE);如果您想编写一个使用非静态方法的静态方法,只需向其传递一个实例,如下所示:

public static void invokeMethod(SomeObject foo) {
    foo.bar();
}
所以你所做的是一个很好的模式。我一直使用它作为“助手”,可以跨多个类重用(也称为组合),只是让你的“SomeObject”成为上下文

以下是我在Android中使用的模式,它可以获得一个很好的中心点来定义默认首选项:

import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;

import java.util.HashMap;
/**
 * Provides support functions for getting preferences as well as a
 * central place for storing default preferences.
 */
public final class PreferencesHelper {
    public static class Preferences {
        public static final String SOME_SETTING = "SOME_SETTING";
    }

   /** This allows us to define our default preferences all in one place */
    private static HashMap<String, Object> sDefaultPreferences =
        new HashMap<String, Object>(){{
        put(Preferences.SOME_SETTING, "value");
    }};

    public static SharedPreferences getDefaultPreferences(Context context) {
        return PreferenceManager.getDefaultSharedPreferences(context);
    }

    public static String getString(SharedPreferences prefs, String key) {
        return prefs.getString(key, (String) sDefaultPreferences.get(key));
    }

    /* Convenience method (use when getting only one preference) */
    public static String getString(Context context, String scanner) {
        SharedPreferences prefs = getDefaultPreferences(context);
        return getString(prefs, scanner);
    }
导入android.content.Context;
导入android.content.SharedReferences;
导入android.preference.PreferenceManager;
导入java.util.HashMap;
/**
*提供用于获取首选项的支持功能以及
*用于存储默认首选项的中心位置。
*/
公共期末课程优先{
公共静态类首选项{
公共静态最终字符串SOME\u SETTING=“SOME\u SETTING”;
}
/**这允许我们在一个地方定义默认首选项*/
私有静态HashMap参数设置=
新HashMap(){{
put(Preferences.SOME_设置,“value”);
}};
公共静态SharedReferences getDefaultPreferences(上下文){
返回PreferenceManager.GetDefaultSharedReferences(上下文);
}
公共静态字符串getString(SharedReferences优先级,字符串键){
返回prefs.getString(key,(String)sDefaultPreferences.get(key));
}
/*便利方法(仅获取一个首选项时使用)*/
公共静态字符串getString(上下文,字符串扫描程序){
SharedReferences prefs=getDefaultPreferences(上下文);
返回getString(prefs、scanner);
}


此模式允许在一个位置定义默认值。

如果要编写使用非静态方法的静态方法,只需向其传递一个实例,如下所示:

public static void invokeMethod(SomeObject foo) {
    foo.bar();
}
所以你所做的是一个很好的模式。我一直使用它作为“助手”,可以跨多个类重用(也称为组合),只是让你的“SomeObject”成为上下文

以下是我在Android中使用的模式,它可以获得一个很好的中心点来定义默认首选项:

import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;

import java.util.HashMap;
/**
 * Provides support functions for getting preferences as well as a
 * central place for storing default preferences.
 */
public final class PreferencesHelper {
    public static class Preferences {
        public static final String SOME_SETTING = "SOME_SETTING";
    }

   /** This allows us to define our default preferences all in one place */
    private static HashMap<String, Object> sDefaultPreferences =
        new HashMap<String, Object>(){{
        put(Preferences.SOME_SETTING, "value");
    }};

    public static SharedPreferences getDefaultPreferences(Context context) {
        return PreferenceManager.getDefaultSharedPreferences(context);
    }

    public static String getString(SharedPreferences prefs, String key) {
        return prefs.getString(key, (String) sDefaultPreferences.get(key));
    }

    /* Convenience method (use when getting only one preference) */
    public static String getString(Context context, String scanner) {
        SharedPreferences prefs = getDefaultPreferences(context);
        return getString(prefs, scanner);
    }
导入android.content.Context;
导入android.content.SharedReferences;
导入android.preference.PreferenceManager;
导入java.util.HashMap;
/**
*提供用于获取首选项的支持功能以及
*用于存储默认首选项的中心位置。
*/
公共期末课程优先{
公共静态类首选项{
公共静态最终字符串SOME\u SETTING=“SOME\u SETTING”;
}
/**这允许我们在一个地方定义默认首选项*/
私有静态HashMap参数设置=
新HashMap(){{
put(Preferences.SOME_设置,“value”);
}};
公共静态SharedReferences getDefaultPreferences(上下文){
返回PreferenceManager.GetDefaultSharedReferences(上下文);
}
公共静态字符串getString(SharedReferences优先级,字符串键){
返回prefs.getString(key,(String)sDefaultPreferences.get(key));
}
/*便利方法(仅获取一个首选项时使用)*/
公共静态字符串getString(上下文,字符串扫描程序){
SharedReferences prefs=getDefaultPreferences(上下文);
返回getString(prefs、scanner);
}


此模式允许在一个位置定义默认值。

您不能从静态方法内部访问非
静态方法。您在这里所做的是相同的。您正在访问非
静态方法,即
getSharedRef()
从静态方法的内部
getDriverNum

您不能从静态方法的内部访问非
静态
方法。您在这里做的是相同的事情。您正在访问非
静态
方法,即
getSharedRef()
从静态方法内部
getDriverNum

我认为您可能误解了静态的工作原理

静态方法(或变量)是指对类的所有实例都有一个副本,并且不需要类的任何实例来调用它的方法。例如

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();
静态方法无法引用实例方法(或实例变量),因为静态方法未绑定到类的特定实例

非静态方法可以访问非静态和静态方法

通常,若一个方法依赖于实例的状态,那个么它应该是一个非静态方法。若它不依赖于实例的内部状态,那个么它可以是一个静态方法


在您的情况下,
getSharedRef
不会从
设置的实例访问任何状态,因此可以将其设置为静态方法,然后可以由类中的其他静态方法访问。

我认为您可能误解了静态的工作原理

class MyClass {

    // assume this is initialized somewhere in the constructor
    private final String myName;

    public void sayMyName() {
        System.out.println(myName);
    }
}
静态方法(或变量)对于类的所有实例都有一个副本,并且不需要类的任何实例来调用它。