对于Java对象的几点疑惑解答
1 直接输出一个类的对象
众所周知,我们创建一个对象后,可以利用print()方法把该对象的属性给输出,但是我们若直接输出对象呢?比如下例:
1 class People { 2 String name; 3 int age; 4 } 5 6 public class Main { 7 public static void main(String[] args) { 8 People a1=new People(); 9 a1.name ="李明"; 10 a1.age=21; 11 System.out.println(a1); 12 } 13 }
不废话,直接看结果吧,结果是下面的东西:
People@15db9742
这是什么呢?Java中直接输出一个类的对象的时候,会调用这个类的toString()方法,自己写的类没有覆盖这个方法的话就是继承Object类的这个方法,Object中toString()方法的实现
是这样的:getClass().getName() + "@" + Integer.toHexString(hashCode())。后面跟的是这个类的哈希码值,如果希望这个类打印出你希望的格式,你就要覆盖toString方法。
2 重写toString方法
接下来覆盖toString方法,看一下会有什么变化:
1 class People { 2 String name; 3 int age; 4 @Override 5 public String toString() {//覆盖toString方法 6 return "People [name=" + name + ", age=" + age + "]"; 7 } 8 } 9 10 public class Main { 11 public static void main(String[] args) { 12 People a1=new People(); 13 a1.name ="李明"; 14 a1.age=21; 15 System.out.println(a1); 16 } 17 }
结果如下:
People [name=李明, age=21]
这就是覆盖了toSting方法,输出当前该对象中所有的属性了。
3 直接比较两个对象
我们要比较两个对象,怎么比较呢?先看下面的例子:
1 class People { 2 String name; 3 int age; 4 } 5 6 public class Main { 7 public static void main(String[] args) { 8 People a1=new People(); 9 a1.name ="李明"; 10 a1.age=21; 11 People a2=new People(); 12 a2.name ="李明"; 13 a2.age=21; 14 System.out.println(a1.equals(a2)); 15 } 16 }
创建两个People对象,对象中的属性都相同,两个对象相等吗?答案是false。很疑惑?因为进行两个对象的比较,要重写equals方法。
4 重写equals方法
不要着急,接着看下面的例子:
1 class People { 2 String name; 3 int age; 4 @Override 5 public boolean equals(Object obj) {//重写equals方法 6 if (this == obj) 7 return true; 8 if (obj == null) 9 return false; 10 if (getClass() != obj.getClass()) 11 return false; 12 People other = (People) obj; 13 if (age != other.age) 14 return false; 15 if (name == null) { 16 if (other.name != null) 17 return false; 18 } else if (!name.equals(other.name)) 19 return false; 20 return true; 21 } 22 } 23 24 public class Main { 25 public static void main(String[] args) { 26 People a1=new People(); 27 a1.name ="李明"; 28 a1.age=21; 29 People a2=new People(); 30 a2.name ="李明"; 31 a2.age=21; 32 System.out.println(a1.equals(a2)); 33 } 34 }
这次输出的结果是true。
【注】两个对象的所有属性必须相同,才会输出true!
【注】不要看到重写方法里面那么长的代码,根本不需要我们去写,Eclipse里面会自动生成,在“源码”菜单栏下。
作者:祁俊辉
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。