鱼C论坛

 找回密码
 立即注册
查看: 3899|回复: 5

[已解决]请求大佬仔细讲解一下如下代码

[复制链接]
发表于 2020-12-17 20:00:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-17 20:50:06 From FishC Mobile | 显示全部楼层    本楼为最佳答案   

回帖奖励 +1 鱼币

本帖最后由 倒戈卸甲 于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-17 20:57:00 From FishC Mobile | 显示全部楼层
本帖最后由 倒戈卸甲 于 2020-12-17 21:00 编辑

核心其实只有一句话。静态变量是全局唯一的,它属于整个类,并不属于某个特定的实例化对象,在一个对象内修改,那么所有的对象里都会访问到这个修改。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

懂了懂了,谢谢谢谢谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-21 09:33:31 | 显示全部楼层

回帖奖励 +1 鱼币

好复杂的样子
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-21 10:35:59 | 显示全部楼层

回帖奖励 +1 鱼币

感谢分享!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-7-1 12:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表