软件构造实验遇到的问题
在进行学校的软件构造实验时,我遇到了一些问题,故以此方式记录下来,希望以后自己有能力解决。
static变量的使用
在编写老师习题课三上的代码时,我看到了下面这两段代码:
public class OnroadState implements State {
static State instance = new OnroadState();
@Override
public State parking() {
return ParkingState.instance;
}
@Override
public State depart() {
throw new IllegalArgumentException();
}
public static State getInstance() {
return instance;
}
@Override
public String toString() {
return "On road";
}
}
public class ParkingState implements State {
static State instance = new ParkingState();
@Override
public State parking() {
throw new IllegalArgumentException();
}
@Override
public State depart() {
return OnroadState.instance;
}
public static State getInstance() {
return instance;
}
@Override
public String toString() {
return "In parking";
}
}
这两段代码用的是state设计模式,相当于为那些parkable
的对象创造了一个状态量state
,具体的值可以为OnroadState
和ParkingState
。然而我在使用state设计模式设计这一段代码时,将OnroadState
和ParkingState
中的State
创建时的static
改为了private
,当时并没意识到更改之后有什么不对的,然而我在写完代码之后,一运行才发现出现了一大堆报错,如下图所示:
显而易见这是发生了栈溢出,我一检查就觉得应该是这个static
改private
导致的。改回去之后再运行,程序果然不再报错了。但是我又想了一下,为什么private
会导致这个对象被不断创建,从而使得栈溢出,但是static
却不会出现这个问题呢?
我上网找了半天,还是没找到详细的解答,于是便去问室友,最后通过讨论,得出结论:用static
修饰的变量在创建的时候只会创建一份,然后所有由这个类生成的对象都只需要指向这个变量就行了;用private
修饰的变量会在每次创建对象的时候都创建一份,最后便会导致栈溢出。总的来说,前者是与类绑定在一块的,后者是与对象绑定在一块的。
最后我又编写了以下代码,进一步确定了这个结论的正确性。
public class staticTest {
static String s="123";
public String getS(){
return s;
}
public void setS(String s2){
s=s2;
}
}
public static void main(String[] args){
staticTest s1 = new staticTest();
staticTest s2 = new staticTest();
staticTest s3 = new staticTest();
System.out.println(s1.getS());
System.out.println(s2.getS());
System.out.println(s3.getS());
s1.setS("12");
System.out.println(s1.getS());
System.out.println(s2.getS());
System.out.println(s3.getS());
}
运行结果如下:
可以看出,由于使用这个类的某一个对象的mutator方法改变了用static
修饰的rep
,其他所有对象的rep
的值都会因此而发生改变。其实吧,对于static
修饰的rep
,完全不需要用mutator或者observer这些方法就可以实现对这个rep
的修改和观察,甚至根本不需要创建对象,直接使用类名就可以引用这个rep
,以上的代码只是方便与private
进行比较才这样编写的。