ztt一方 发表于 2020-12-17 20:00:36

请求大佬仔细讲解一下如下代码

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 20:50:06

本帖最后由 倒戈卸甲 于 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 20:57:00

本帖最后由 倒戈卸甲 于 2020-12-17 21:00 编辑

核心其实只有一句话。静态变量是全局唯一的,它属于整个类,并不属于某个特定的实例化对象,在一个对象内修改,那么所有的对象里都会访问到这个修改。

ztt一方 发表于 2020-12-17 22:14:59

倒戈卸甲 发表于 2020-12-17 20:50
都学习到静态变量了,可以学习完静态方法再回来看这个问题。如果你学习了静态方法还不理解,你可以添加一个 ...

懂了懂了,谢谢谢谢谢谢

bhcqzf 发表于 2020-12-21 09:33:31

好复杂的样子{:10_266:}

hornwong 发表于 2020-12-21 10:35:59

感谢分享!
页: [1]
查看完整版本: 请求大佬仔细讲解一下如下代码