当前位置: 技术问答>java相关
一个非常基础的问题
来源: 互联网 发布时间:2015-11-14
本文导语: 1.public class Test extends Object { public static void main(String [] args) { Test t2=new Test(); Test t1=new Test(); } System.out.println(t1.equals(t2)); } 2.Test t2=new Test(); Test t1=new Test(); 改为: Integer t1=new Integer(100); Intege...
1.public class Test extends Object
{
public static void main(String [] args)
{
Test t2=new Test();
Test t1=new Test();
}
System.out.println(t1.equals(t2));
}
2.Test t2=new Test();
Test t1=new Test();
改为:
Integer t1=new Integer(100);
Integer t2=new Integer(100);
3.class Value{int i;}
上面的 Test t2=new Test();
Test t1=new Test();
改为:Value t1=new Value();
Value t2=new Value();
t1.i=t2.i=100;
1.为false 2为true 3。为false为什么?
{
public static void main(String [] args)
{
Test t2=new Test();
Test t1=new Test();
}
System.out.println(t1.equals(t2));
}
2.Test t2=new Test();
Test t1=new Test();
改为:
Integer t1=new Integer(100);
Integer t2=new Integer(100);
3.class Value{int i;}
上面的 Test t2=new Test();
Test t1=new Test();
改为:Value t1=new Value();
Value t2=new Value();
t1.i=t2.i=100;
1.为false 2为true 3。为false为什么?
|
equals()是Object的方法,可以理解为"相等"。显然两个object相等并不意味着相同;但是需要注意的是,也并不意味着他们对应内存区域的所有字节都相等,比如(但不限于这个原因)他们内部可能还有自己的引用。所以,两个对象是否相等,只有这个对象自己才知道如何判断,java并不知道。所以就需要该类自己提供一个equals方法
注意equals的参数是Object因此有可能传入的对象与你的类不同,因此在重载equals()方法是要检查类型,并作动态的“下溯造型”
如果你比较自己定义的类型,在比较之前一定要重载equals()方法,否则你用equals比较就会是==的效果
注意equals的参数是Object因此有可能传入的对象与你的类不同,因此在重载equals()方法是要检查类型,并作动态的“下溯造型”
如果你比较自己定义的类型,在比较之前一定要重载equals()方法,否则你用equals比较就会是==的效果
|
因为默认的equals是调用Object的equals方法而该方法是比较两个对象的内存地址是否相同,也就是是否是一个对象,所以1 3 为false
而2是因为对于Interger类型默认是比较数值是否相同,也就是在Integer中,重载了equals方法
而2是因为对于Interger类型默认是比较数值是否相同,也就是在Integer中,重载了equals方法
|
这个问题有点伤脑筋,我也想知道,那位高手来解释一下啊!!!
|
总结如下:
在JAVA中,作为参数传递如果是基本类型,则是值传递;
如果是复合数据类型(即对象或数组),则是引用,传递句柄;传递后两个引用都应用同一个对象,这时候如果只是将其中一个引用指向另一个对象,则
对另一个引用不产生影响;而如果对其中一个引用做改变,则
两个引用都将改变
在下边的例子中正是将引用指向了另一个对象(NULL),所以
另一个引用不受影响,所以最后的输出结果是a a
总结:一般情况下,参数类型为符合数据类型(如数组或类对象)时,自动采用引用的形式,
即传递给方法的是数据在内存中的地址。这时,如果在方法中不去修改形式参数所引用的
句柄,且该对象所属的类定义了设置或修改数据成员的方法,就可以通过对象去调用方法
修改数据成员来达到修改对象的目的,当然,如果该对象所属的类没有定义设置或修改数据成员的方法,
就不能通过引用 改变对象的状态,比如String 类对象
问题的提出:
public class test {
String s = "a";
private void change (test ss) {
ss = null;
}
public static void main(String args[]) {
test t = new test();
System.out.println(t.s);
t.change(t);
System.out.println(t.s);
}
}
输出结果是什么?为什么?
答案:a a
在JAVA中,作为参数传递如果是基本类型,则是值传递;
如果是复合数据类型(即对象或数组),则是引用,传递句柄;传递后两个引用都应用同一个对象,这时候如果只是将其中一个引用指向另一个对象,则
对另一个引用不产生影响;而如果对其中一个引用做改变,则
两个引用都将改变
在下边的例子中正是将引用指向了另一个对象(NULL),所以
另一个引用不受影响,所以最后的输出结果是a a
总结:一般情况下,参数类型为符合数据类型(如数组或类对象)时,自动采用引用的形式,
即传递给方法的是数据在内存中的地址。这时,如果在方法中不去修改形式参数所引用的
句柄,且该对象所属的类定义了设置或修改数据成员的方法,就可以通过对象去调用方法
修改数据成员来达到修改对象的目的,当然,如果该对象所属的类没有定义设置或修改数据成员的方法,
就不能通过引用 改变对象的状态,比如String 类对象
问题的提出:
public class test {
String s = "a";
private void change (test ss) {
ss = null;
}
public static void main(String args[]) {
test t = new test();
System.out.println(t.s);
t.change(t);
System.out.println(t.s);
}
}
输出结果是什么?为什么?
答案:a a
|
Integer类跟String类都没有定义修改数据成员的方法,
所以比较时相当于是否equals
所以比较时相当于是否equals
|
因为Integer重载了equals()方法