1.当一个程序创建了一个类的对象(p)时,运用System.out.println()方法输出该类的对象(p)的时候,控制台会输出 class(该对象的类名)+@+hashCode
注:hashCode是用来在散列存储结构中确定对象的存储地址的。两个对象的hashCode相同,并不一定表示两个对象就相同,也就是不一定适用于equals(java.lang.Object) 方法,只能够说明这两个对象在散列存储结构中,如Hashtable,通俗解释为:他们“存放在同一个篮子里”。
当使用print方法输出p的时候,实际上是输出p的toString方法的返回值,也就是说System.out.println(p);可以看成System.out.println(p.toString());所以,为了准确打印出该类的信息,必须重写toString()方法。
public class test4{
public int age;
public String name;
public String toString(){ //不需要形参值 返回值为String
return "岁数是"+age+",名字是"+name;
}
public static void main(String[] args){
test4 one = new test4();
one.age = 13;
one.name="leo";
System.out.println(one);
}
}
2.测试两个变量是否相等,java有2个方式,一个是“==”,一个是equals()方法,但是,对于两个引用变量,只有当他们指向同一个对象时,==才会返回true
注:基本数据类型的==,是比较他们的值,String的==,是比较它们常量池中的值
public class eq{
public String name;
public int age;
public static void main(String[] args){
eq one = new eq();
eq two = new eq();
one.name ="leo";
one.age = 3;
two.name ="leo";
two.age = 3;
System.out.println(one.age ==two.age); //对于基本数据类型,是相等的。
System.out.println(one.name==two.name); //String的==,比较常量池中的值
System.out.println(one.equals(two)); //这里的equals方法,是比较它们的引用是否指向同一个对象。one是一个引用变量
}
}
class cat{
public int age;
public cat(int age){
this.age = age;
}
}
public class test5{
public static void main(String[] args){
cat miao1 = new cat(5);
cat miao2 = new cat(5);
System.out.println(miao1.age);
System.out.println(miao2.age);
System.out.println(miao1.equals(miao2));
}//equals的S不要忘了
}
为什么miao.equals(miao2)会输出false呢?因为定义一个类,当没有重写equals方法时,函数默认使用Object提供的equals()方法,而这个equals()方法是比较当前对象的引用和你要比较的那个引用它们指向的是否是同一个对象,也就是说,默认的equals()方法和“==”是一样的。因此,可以在System.out.println(miao1.equals(miao2)之间加 miao1 = miao2,让他们指向同一个对象,或者重写equals()方法。
class cat{
public int age;
public cat(int age){
this.age = age;
}
public boolean equals(Object obj){
if(obj==null){
return false;
}
else{
if(obj instanceof cat) //判断obj对象能否转换成cat类,如果能,则实行下面转换。
cat c = (cat)obj;
if(c.age==this.age){ //如果两者成员变量相等,则输出true。
return true;
}
}
}
return false;
}
}
public class test5{
public static void main(String[] args){
cat miao1 = new cat(5);
cat miao2 = new cat(5);
System.out.println(miao1.age);
System.out.println(miao2.age);
System.out.println(miao1.equals(miao2));
}
}
对于String类,默认重写了equals()方法,所以会有
public class test6{
public static void main(String[] args){
String st1 = new String("leo");
String st2 = new String("leo");
System.out.println(st1==st2);
System.out.println(st1.equals(st2));
}
}
String重写的equals方法是这样说明的:用当前的这个字符串对象和指定的字符串对象比较,如果这两个对象的字符序列相等,就输出true。
4.String str1 = "hello"和String str2 = new String("hello")的区别:"hello"直接赋值给str1时,JVM会使用常量池来管理这些字符串;当使用new String("hello")时,JVM会先使用
常量池来管理这些字符串,然后再调用String类的构造器创建str2对象,也就是说,new String("hello")一共产生了2个对象。