1. Object详解
1.1 == 比较细节 318
1.1.1 例 == 判断引用类型,判断地址是否相等 318
代码在com.stulzl.object_.包中
Object_equals
package com.stulzl.object_;
//判断引用类型,判断地址是否相等 318
public class Object_equals {
public static void main(String[] args) {
A a = new A();
A b = a;
A c = a;
System.out.println(a==c);//true//因为a b c都指向同一块对象对应的地址空间
System.out.println(b==c);//true
B bObj = a;
System.out.println(bObj==c);//true//同理
}
}
class B {
}
class A extends B{
}
1.2 equals相关及查看原码
1.2.1 查看原码 319
1.2.2 equals方法和==的对比 320
代码在com.stulzl.object_equals.包中
Equals
package com.stulzl.object_equals;
public class Equals {
public static void main(String[] args) {
//equals 方法,源码怎么查看. //把光标放在 equals 方法,直接输入 ctrl+b
//如果你使用不了. 自己配置. 即可使用.
"hello".equals("abc");
//引用类型
Integer integer1 = new Integer(1000);
Integer integer2 = new Integer(1000);
System.out.println(integer1==integer2);//fasle //判断地址
System.out.println(integer1.equals(integer2));//true//判断内容,因为Integer重写了equals
String str1 = new String("lzl");
String str2 = new String("lzl");
System.out.println(str1==str2);//false 判断地址
System.out.println(str1.equals(str2));//true判断内容 因为String重写了equals
}
}
2.小练习
2.1 自己重写Object的equals方法练习 321
应用实例: 判断两个 Person 对象的内容是否相等,如果两个 Person 对象的各个属性值都一样,则返回 true,反之 false。
代码在com.stulzl.object_equalsexercise01.包中
EqualsExercise
package com.stulzl.object_equalsexercise01;
//自己重写Object的equals方法练习
//应用实例: 判断两个 Person 对象的内容是否相等,如果两个 Person 对象的各个属性值都一样,
// 则返回 true,反之 false。
public class EqualsExercise {
public static void main(String[] args) {
Person person1 = new Person("jack", 18, '男');
Person person2 = new Person("jack", 18, '男');
System.out.println(person1.equals(person2));//true
}
}
class Person{
private String name;
private int age;
private char gender;
//重写Object中的equals方法
public boolean equals(Object obj){//obj编译类型Object,运行类型是Person
//判断对象是否是一个对象,如果是直接返回true
if(this==obj){//这里this指的对象,是谁调用equals方法就是谁
return true;
}
//判断是否为同Person类,是同Person类才进入比较 各个属性
if(obj instanceof Person){//注:instanceof,是比较运行对象是否为某某的类型或者子类
Person p = (Person)obj;//向下转型,这里把原本是Object类型的obj转成了Person类
return this.name.equals(p.name) && this.age==p.age && this.gender==p.gender;
}
//如果不是通Person类,直接返回false
return false;
}
public Person(String name, int age, char gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
}
2.2 练习2 判断输出 322
代码在com.stulzl.object_equalsexercise02.包中
EqualsExercise02
package com.stulzl.object_equalsexercise02;
public class EqualsExercise02 {
public static void main(String[] args) {
Person p1 = new Person();
p1.name="lzl";
Person p2 = new Person();
p2.name ="lzl";
System.out.println(p1==p2);//false//判断的是引用类型,判断地址
System.out.println(p1.name.equals(p1.name));//true,p1.name和p1.name是字符串,
// 而字符串已经重写了equals
System.out.println(p1.equals(p2));//false//p1,p2是Person类这个equals来自于父类Object
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1.equals(s2));//true//字符串类String已经重写了equals
System.out.println(s1==s2);//false//引用类型,s1和s2指的不是同一对象即地址不同
}
}
class Person{
public String name;
}
2.3 练习3 判断输出 323
代码在com.stulzl.object_equalsexercise03.包中
EqualsExercise03
package com.stulzl.object_equalsexercise03;
//判断输出323
public class EqualsExercise03 {
public static void main(String[] args) {
int it = 65;
float fl = 65.0f;
System.out.println("65 和 65.0f 是否相等?" + (it == fl));//T
char ch1 = 'A'; char ch2 = 12;
System.out.println("65 和‘A’是否相等?" + (it == ch1));//T 字符的本质就是一个数
System.out.println("12 和 ch2 是否相等?"+ (12 == ch2));//T
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println("str1 和 str2 是否相等?"+ (str1 == str2)); //F
System.out.println("str1 是否 equals str2?"+(str1.equals(str2)));//T
//System.out.println("hello" == new java.sql.Date()); //编译错误
}
}