�����删��2

�����删��2

2020-06-08 20:30:05发布 浏览数:786
概述:�����删��2

       我们一起学java!       我们先来看两段代码,你们可以看看有什么不同。

       第一段代码,姑且叫做代码A吧。

package name;
class T{
	int level;
}
public class Tank {
	public static void main(String[] args) {
		T T1=new T();
		T T2=new T();
		T1.level=9;
		T2.level=47;
		T1.level =T2.level ;
		T1.level=27;
		System.out.println(T1.level+"——"+T2.level);
	}
}

12345678910111213141516

       代码B:

package name;
class T{
	int level;
}
public class Tank {
	public static void main(String[] args) {
		T T1=new T();
		T T2=new T();
		T1.level=9;
		T2.level=47;
		T1 =T2 ;
		T1.level=27;
		System.out.println(T1.level+"——"+T2.level);
	}
}

12345678910111213141516

       从代码AB中可以看出,这两段代码极其相似,不同之处在倒数第五行的赋值语句。

       如果是不细心的朋友,很有可能没有发现这两处不同,甚至是在打完自己代码的时候,会发现结果与预期不一样,然后检查又检查不出问题。

       下面来放放这两组代码的运行结果,看看有没有猜错的。

       代码A结果:


       代码B结果:


       其实这两段代码很简单,它的两个实例T1,T2是在main()建立的,进行的操作,将T2赋值给T1,接着修改T1。

       原文的解释是原本T1包含的对对象的引用,是指向一个值9的对象。在对T1赋值的时候,这个引用被覆盖了。

       这样是不是听着很拗口,我们再来运行一段代码C,具体看看怎么回事!

package test;


public class Demo {
    static class T{
        int level;
    }

    public static void main(String[] args) {
        T t1 = new T();
        T t2 = new T();
        t1.level = 9;
        t2.level = 47;

        System.out.println("普通赋值后的t1" + t1);
        System.out.println("普通赋值后的t2" + t2);
//        t1.level = t2.level;
        t1 = t2;
        System.out.println("对象赋值后的t1" + t1);
        System.out.println("对象赋值后的t2" + t2);
        System.out.println("仅仅对象赋值后输出结果" + t1.level + "---" + t2.level);

        t1.level = 27;

        System.out.println("t1对象修改后的t1" + t1);
        System.out.println("t1对象修改后的t2" + t2);
        System.out.println("最后输出结果" + t1.level + "---" + t2.level);
    }
}
1234567891011121314151617181920212223242526272829303132333435

       代码C运行结果:


       @后面为地址。

       我们可以看下,赋值后,t1,t2的地址是不一样的,当我们进行t1 = t2;操作时,我们会发现,是把t2的地址给了t1,有没有一种C++语言中指针的意思了,最后我们输出的结果两个都是47。

       这就是为什么当我们执行t1.level = 27;操作时,明明只修改了t1的值,t2也跟着变化了。


       我们再来看看代码D

package test;


public class Demo {
    static class T{
        int level;
    }

    public static void main(String[] args) {
        T t1 = new T();
        T t2 = new T();
        t1.level = 9;
        t2.level = 47;

        System.out.println("普通赋值后的t1" + t1);
        System.out.println("普通赋值后的t2" + t2);
        t1.level = t2.level;
//        t1 = t2;
        System.out.println("对象赋值后的t1" + t1);
        System.out.println("对象赋值后的t2" + t2);
        System.out.println("仅仅对象赋值后输出结果" + t1.level + "---" + t2.level);

        t1.level = 27;

        System.out.println("t1对象修改后的t1" + t1);
        System.out.println("t1对象修改后的t2" + t2);
        System.out.println("最后输出结果" + t1.level + "---" + t2.level);
    }
}
1234567891011121314151617181920212223242526272829303132333435

       我们只做了一个修改:t1.level = t2.level;

       代码D运行结果:


       我们可以看到t1,t2的地址是不一样的,然后我们执行t1.level = t2.level;操作,我们会发现虽然结果和代码C一样,可是地址却没有发生变化,换言之,他还是两个地址。

       然后我们执行同样的 t1.level = 27;操作,不出所料,t2没有变化。

请先
登录
后评论
0 条评论
暂时没有评论
最新文章
更多