public class A {
private b a;
public A(b a){
this.a=a;
} public static void main(String[] args) {
b s=new b(3);
A ss=new A(s);
A sss=new A(s);
System.out.println(sss.a.i);
System.out.println(ss.i==sss.i);
ss.a.i++;
System.out.println(ss.i==sss.i);
System.out.println(sss.a.i);
}}
class b{
int i;
public b(int i){
this.i=i;
}
}
**********************************************public class A {
private Integer i;
public A(int i){
this.i=i;
} public static void main(String[] args) {
//Integer s=new Integer(3);
Integer s=new Integer(12222);
A ss=new A(s);
A sss=new A(s);
System.out.println(sss.i);
System.out.println(ss.i==sss.i);
ss.i++;
System.out.println(ss.i==sss.i);
System.out.println(sss.i);
System.out.println(ss.i);
}
}
private b a;
public A(b a){
this.a=a;
} public static void main(String[] args) {
b s=new b(3);
A ss=new A(s);
A sss=new A(s);
System.out.println(sss.a.i);
System.out.println(ss.i==sss.i);
ss.a.i++;
System.out.println(ss.i==sss.i);
System.out.println(sss.a.i);
}}
class b{
int i;
public b(int i){
this.i=i;
}
}
**********************************************public class A {
private Integer i;
public A(int i){
this.i=i;
} public static void main(String[] args) {
//Integer s=new Integer(3);
Integer s=new Integer(12222);
A ss=new A(s);
A sss=new A(s);
System.out.println(sss.i);
System.out.println(ss.i==sss.i);
ss.i++;
System.out.println(ss.i==sss.i);
System.out.println(sss.i);
System.out.println(ss.i);
}
}
解决方案 »
- 问一个很菜很急的问题
- 100分球:如何通过JAVA程序的Runtime.getRuntime().exec运行netstat命令,得到6060这个端口所在的进程ID?
- 如何控制字符终端输入回显与不回显。
- java备份mysql
- 关于finalize()
- 大家有没有这样的js树:可以动态添加节点的,但不用刷新整颗树,就像CSDN左侧那样
- java 皮肤类skinlf怎么使用呀?有没有会用?
- 初学者的问题!我应该这样学java
- Driver,DriverManager生成connection的区别?throw,throws的区别?
- java中如何显示货币型数字?
- 求解,求解 关于 multithreat
- 关于ServerSocket的一些疑问
public class A {
private int i;
public A(int i){
this.i=i;
} public static void main(String[] args) {
int s=12222;
//Integer s=new Integer(12222);
A ss=new A(s);
A sss=new A(s);
System.out.println(sss.i);
System.out.println(ss.i==sss.i);//为什么这里是true,而上面new出来的s这里却是false,我理解这个s都是分配在栈上的引用,指向堆上的对象,为什么上面new出来的s这里是false.
ss.i++;
System.out.println(ss.i==sss.i);
System.out.println(sss.i);
System.out.println(ss.i);
}
}
ss.i==sss.i是不同的对象ss和sss各自内部的属性了。
Integer是int的封装类,很明显==是比较这两个Integer的内存地址是否相等。由于
构造函数是public A(int i)的,而传入的参数是Integer的,所以会自动拆箱把Integer变成int型的,再是把int赋给Integer类型的变量,所有又需要自动装箱,那很明显A对象中的这个i就不是原来传进来的那个对象了。所以ss.i==sss.i会是false,(但是由于Integer内部是缓存了-128~127的数的,所有如果你new Integer(-128~127)也会返回true)。public class A {
private Integer i;
public A(Integer i){//你可以这样修改
this.i=i;
} public static void main(String[] args) {
//Integer s=new Integer(3);
Integer s=new Integer(12222);
A ss=new A(s);
A sss=new A(s);
System.out.println(sss.i);
System.out.println(ss.i==sss.i);
ss.i++;
System.out.println(ss.i==sss.i);
System.out.println(sss.i);
System.out.println(ss.i);
}
}