请求大佬仔细讲解一下如下代码
class StaticVar{static private int no = 0;
private String name;
private int id;
public StaticVar(){
id = ++no;
name = "";
}
public void setName(String args){
name = args;
}
public void setNo(int args){
no = args;
}
public int getNo(){
return no;
}
public int getId(){
return id;
}
public String getName(){
return name;
}
}
public class TestSV {
public static void main(String[] args) {
StaticVar sv1 = new StaticVar() ;
StaticVar sv2 = new StaticVar() ;
sv1.setName("Object1");
sv2.setName("Object2");
System.out.println(sv1.getName() +":"+
sv1.getId() +" "+ sv1.getNo() );
System.out.println(sv2.getName() +":"+
sv2.getId() +" "+ sv2.getNo() );
sv1.setNo(50);
System.out.println(sv1.getName() +":"+
sv1.getId() +" "+ sv1.getNo() );
System.out.println(sv2.getName() +":"+
sv2.getId() +" "+ sv2.getNo() );
}
}
运行结果
Object1:1 2
Object2:2 2
Object1:1 50
Object2:2 50
本帖最后由 倒戈卸甲 于 2020-12-17 21:01 编辑
都学习到静态变量了,可以学习完静态方法再回来看这个问题。如果你学习了静态方法还不理解,你可以添加一个静态方法static getnNoS(),在每个操作后都通过类名去获取no的值并打印,很容易理解这里的所有问题。这里我先解释这段代码,先说前两次打印结果。这里no是静态变量,全局只有唯一一个,也一直不会被释放。第一次创建对象后no的值变成1,两次创建对象后no的值变成2。而id是个成员变量,通过no赋值,所以会记录下创建对象时no的值。getId方法是返回id,所以可以先后打印第一次创建对象时的no值1和最后的no值2。但getNo则不一样,此时此刻,这里只有一个no就是2,所以二者只能打印2。哦,对了,其实也可以在创建第一个对象后就立即打印no值,作为对比。再说后两行代码,id没有进行过修改,而no这里用setNo函数传入了新的no值50。id的值是在构造的时候确定好的,现在setNo函数里也没有修改到它。所以id值不变化,但getNo返回此时此刻的no值,就会打印50 本帖最后由 倒戈卸甲 于 2020-12-17 21:00 编辑
核心其实只有一句话。静态变量是全局唯一的,它属于整个类,并不属于某个特定的实例化对象,在一个对象内修改,那么所有的对象里都会访问到这个修改。 倒戈卸甲 发表于 2020-12-17 20:50
都学习到静态变量了,可以学习完静态方法再回来看这个问题。如果你学习了静态方法还不理解,你可以添加一个 ...
懂了懂了,谢谢谢谢谢谢 好复杂的样子{:10_266:} 感谢分享!
页:
[1]