为什么Eclipse建议我使我的方法静态

Yve*_*omb 5 java eclipse methods static-methods

我从一个类调用一个方法,它给我一个错误,使方法静态.我很困惑为什么,因为我问这个问题类变量和构造函数中的参数有什么区别?我的理解是类变量是静态的.

患者类:

public  String  setOption(String option) throws IOException
{
        option = stdin.readLine();
        //stuff here
    return option;
}
Run Code Online (Sandbox Code Playgroud)

患者管理系统:

public class PatientManagementSystem
{
    static BufferedReader stdin = new BufferedReader(new InputStreamReader(
            System.in));
    public static void main(String[] args) throws IOException
    {
        Patient.setOption(null);    
    }
}
Run Code Online (Sandbox Code Playgroud)

错误:
在此输入图像描述

我是将方法更改为静态还是创建局部变量?

Mar*_*nik 6

基于你之前的问题,我认为可能没有完全挖掘局部变量的概念.在这个方法中:

public String setOption(String option) throws IOException
{
    option = stdin.readLine();
    return option;
}
Run Code Online (Sandbox Code Playgroud)

option是一个局部变量.您将该变量的初始值作为参数传递给setOption每次调用它时方法(并且您碰巧忽略了该值),但是除了详细信息之外,这与

public String setOption() throws Exception
{
    String option = stdin.readLine();
    return option;
}
Run Code Online (Sandbox Code Playgroud)

现在,局部变量与实例或类变量完全不同:它们仅在方法体内有效,并且仅在方法执行期间存在.考虑到这一点,让我们看看这段代码:

static BufferedReader stdin = new BufferedReader(new InputStreamReader(
        System.in));
public static void main(String[] args) throws IOException
{
    Patient.setOption(null);    
}
Run Code Online (Sandbox Code Playgroud)

在这里,你基本上滥用了一个类变量stdin,它应该是一个本地变量:

public static void main(String[] args) throws IOException
{
    BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
    Patient.setOption(null);    
}
Run Code Online (Sandbox Code Playgroud)

关于你的方法调用的问题... setOption当前是一个实例方法,这意味着它必须在实例的上下文中调用.您按原样调用它,没有Patient涉及的实例.如果你继续走这条路,你将无法代表一个以上的病人,可能不是你的想法.因此,您希望保持方法不变并创建以下实例Patient:

Patient p = new Patient();
p.setOption(...);
Run Code Online (Sandbox Code Playgroud)

在你的整体设计中,不清楚setOption应该扮演什么样的角色 ,但是使用静态stdin变量并不是一个好主意(我已经在上面做了本地化).您希望将读取的任何数据传递stdinsetOption方法中,从而将其与输入读取逻辑分离.


nhg*_*rif 5

您(可能)需要创建Patient该类的对象.

Patient myPatient = new Patient();
myPatient.setOption(null);
Run Code Online (Sandbox Code Playgroud)

很难知道你想用这些有限的信息做什么.我不知道你打算怎么做Patient课,但我最好的猜测?考虑到您尝试使用setter命名约定调用方法,以这种方式执行它是有意义的.

如果你不打算实例化一个对象去制作的路线setOption一个static方法,那么你或许应该改变方法名.


通过更深入地解释你究竟想要完成什么(甚至不谈伪代码,只是一个非常抽象的想法,你想要做什么),这里更容易解释一下static(有你的具体例子)以及你应该做什么等等