java编程思想,操作符

  • 在对对象赋值的时候,当对一个对象进行操作的时候,真正操作的是对对象的引用。当把一个对象赋值给另外一个对象的时候,实际上是将引用从一个地方复制到另外一个地方。
package com.martind;


class Tank{
	int level;
}
public class CreateFile {
	
	public static void main(String[] args) {
		Tank t1 = new Tank();
		Tank t2 = new Tank();
		t1.level = 12;
		t2.level = 45;
		System.out.println(t1.level + " " + t2.level);
		t1 = t2;
		System.out.println(t1.level + " " + t2.level);
		t1.level = 234;
		System.out.println(t1.level + " " + t2.level);
	}

}

这个称为别名现象,当对t1进行赋值的时候,t1原来的包含对对象的引用的对象,将会指向t2对象,t1的原来的引用会丢失,然后这个不再被引用的对象会被“垃圾回收器”自动清理。
为了避免这个现象可以t1.level = t2.level ,这样可以保持两个对象的彼此独立。
可以使用equals() 方法来比较两个对象的实际内容,但是这个方法并不适合基本类型的比较,基本类型直接使用==!=比较即可

package com.martind;


class Value{
	int i;
}
public class learnJava {
	public static void main(String[] args) {
		
		Value v1 = new Value();
		Value v2 = new Value();
		v1.i = v2.i = 100;
		System.out.println(v1.equals(v2)); //false
	}
		
}

遇到一个问题:java在创建对象的时候会把对象放到堆中,把变量的引用放到栈区,把一些程序中的常量放到常量池,当new 一个对象的时候会把这个对象放到堆中,然后可以调用intern() 方法,如果常量池中有这个值,会返回指向这个常量的引用,如果常量区没有这个值,就会直接把这个值的指向堆区的引用引用放到常量池(这里要注意jdk1.6和jdk1.7以后的方法是不同的,1.6中常量池是独立于堆之外的,调用intern() 方法是直接把这个值的副本拷贝过去,返回的是这个值而不是值的引用;而1.7之后的常量池是放在堆之中的),然后下面这个代码的两个返回值却是不同的,解释通一个另外一个却又相矛盾了……

package com.martind;

public class learnJava {
	public static void main(String[] args) {
		
		String s = new String("1");
		s.intern();
		String s2 = "1";
		System.out.println(s==s2);//false
		
		String s3 = new String("1") + new String("1");
		s3.intern();
		String s4 = "11";
		System.out.println(s3 == s4);//true

	}
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值