软件构造(四)

软件构造实验遇到的问题

在进行学校的软件构造实验时,我遇到了一些问题,故以此方式记录下来,希望以后自己有能力解决。

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,具体的值可以为OnroadStateParkingState。然而我在使用state设计模式设计这一段代码时,将OnroadStateParkingState中的State创建时的static改为了private,当时并没意识到更改之后有什么不对的,然而我在写完代码之后,一运行才发现出现了一大堆报错,如下图所示:
在这里插入图片描述
显而易见这是发生了栈溢出,我一检查就觉得应该是这个staticprivate导致的。改回去之后再运行,程序果然不再报错了。但是我又想了一下,为什么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进行比较才这样编写的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值