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)
错误:

我是将方法更改为静态还是创建局部变量?
基于你之前的问题,我认为可能没有完全挖掘局部变量的概念.在这个方法中:
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变量并不是一个好主意(我已经在上面做了本地化).您希望将读取的任何数据传递stdin到setOption方法中,从而将其与输入读取逻辑分离.
您(可能)需要创建Patient该类的对象.
Patient myPatient = new Patient();
myPatient.setOption(null);
Run Code Online (Sandbox Code Playgroud)
很难知道你想用这些有限的信息做什么.我不知道你打算怎么做Patient课,但我最好的猜测?考虑到您尝试使用setter命名约定调用方法,以这种方式执行它是有意义的.
如果你不打算实例化一个对象去制作的路线setOption一个static方法,那么你或许应该改变方法名.
通过更深入地解释你究竟想要完成什么(甚至不谈伪代码,只是一个非常抽象的想法,你想要做什么),这里更容易解释一下static(有你的具体例子)以及你应该做什么等等
| 归档时间: |
|
| 查看次数: |
6028 次 |
| 最近记录: |