object类
所以:Object类中的功能(属性、方法)就具有通用性。
== 运算符与equals()方法的区别:
① 回顾==运算符
"=="比较的是基本数据类型时,比较两变量保存的数据是否相等。(类型未必要相等);比较引用数据类型时,比较地址值是否相同。
代码理解:
package com.atguigu.java;
//==
public class EqualsTest {
public static void main(String[] args) {
int i=10;
int j=10;
double d =10.0;
System.out.println(i==j); //true
//"=="比较的是基本数据类型时,比较两变量保存的数据是否相等。(类型未必要相等);比较引用数据类型时,比较地址值是否相同
System.out.println(i==d); //true。
char c=10; //不会报错,c字符对应的数是10。如A对应65,a对应97。
System.out.println(i==c); //true。
char c1='A';
char c2=65;
System.out.println(c1==c2); //true
}
②equals()方法:
Customer类:
package com.atguigu.java;
public class Customer {
private String name;
private int age;
public Customer() {
super();
}
public Customer(String name, int age) {
super();
this.name = name;
this.age = age;
}
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;
}
}
EqualsTest类:
package com.atguigu.java;
import java.util.Date;
/*
* equals()方法的使用:
* ①equals是一个方法,而非运算符
* ②只能适用于引用数据类型
* ③ Object类中equals()的定义:(Object类中equals()的定义和“==”功能相同,即比较两对象地址是否相同)
* public boolean equals(Object obj) {
return (this == obj);
}
* ④像String、Date、File、包装类等都重写了Object类中的equals()方法,不比较两个引用地址是否相同,而是为比较两个对象“实体内容”是否相同
*/
public class EqualsTest {
public static void main(String[] args) {
Customer cust1=new Customer("Tom", 21);
Customer cust2=new Customer("Tom",21);
//多态。equals()方法形参为Object类型,放入其子类对象(Customer型)
System.out.println(cust1.equals(cust2)); //false。Object类中equals()的定义和“==”功能相同
System.out.println("*********");
String str1=new String("atguigu");
String str2=new String("atguigu");
System.out.println(str1.equals(str2)); //true
Date date1=new Date(32432525324L);
Date date2=new Date(32432525324L);
System.out.println(date1.equals(date2)); //true
}
}
String、Date、File、包装类等都重写了Object类中的equals()方法,不比较两个引用地址是否相同,而是为比较两个对象“实体内容”是否相同
上述代码中Object类中equals()的定义和“==”功能相同,为比较两对象地址是否相同。但通常情况下,我们自定义的类如果使用equals()的话,通常是比较两个对象的内容是否相同所以如果我们想像String、Date一样,比较两个对象实体内容是否相同,则需要对Object类中的equals()方法进行重写。
在Customer类中重写equals()方法:
①手动生成方式
package com.atguigu.java;
public class Customer {
private String name;
private int age;
public Customer() {
super();
}
public Customer(String name, int age) {
super();
this.name = name;
this.age = age;
}
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;
}
//重写的原则:比较两个对象的实体内容(即name和age)是否相同
@Override
public boolean equals(Object obj) {
if(this==obj){ //如果二者连地址都一样,那内容一定一样
return true;
}
if(obj instanceof Customer){ //传入的obj如果是Customer型才有可比性
Customer cust=(Customer)obj; //强转
//比较两个对象的每个属性内容是否都相同
if(this.age==cust.age&&this.name.equals(cust.name)){ //注意此处比较name时使用this.name.equals(cust.name)
return true;
}else{
return false;
}
}
return false;
}
}
②开发常用自动生成方式(eclipse使用alt+shift+s):
属性全部勾选后自动生成重写的equals()方法,两种方式结果相同。
再次运行
package com.atguigu.java;
import java.util.Date;
public class EqualsTest {
public static void main(String[] args) {
Customer cust1=new Customer("Tom", 21);
Customer cust2=new Customer("Tom",21);
//多态。equals()方法形参为Object类型,放入其子类对象(Customer型)
System.out.println(cust1.equals(cust2)); //重写equals()方法后此处变为true
System.out.println("*********");
String str1=new String("atguigu");
String str2=new String("atguigu");
System.out.println(str1.equals(str2)); //true
Date date1=new Date(32432525324L);
Date date2=new Date(32432525324L);
System.out.println(date1.equals(date2)); //true
}
}
注意:
总结:==与equals()的区别(面试题)
Object类练习:
package com.atguigu.exer;
/*
1.编写Order类,有int型的orderId,String型的orderName,相应的
getter()和setter()方法,两个参数的构造器,重写父类的equals()方法:
public boolean equals(Object obj),并判断测试类中创建的两个对象是否
相等。
*/
public class OrderTest {
public static void main(String[] args) {
Order order1=new Order(1001, "aA");
Order order2=new Order(1001, "bB");
Order order3=new Order(1001, "bB");
System.out.println(order1.equals(order2)); //false
System.out.println(order2.equals(order3)); //true
}
}
class Order{
private int orderId;
private String orderName;
public Order(int orderId, String orderName) {
super();
this.orderId = orderId;
this.orderName = orderName;
}
public int getOrderId() {
return orderId;
}
public void setOrderId(int orderId) {
this.orderId = orderId;
}
public String getOrderName() {
return orderName;
}
public void setOrderName(String orderName) {
this.orderName = orderName;
}
//自己手写重写父类equals方法
@Override
public boolean equals(Object obj) {
if(this==obj){
return true;
}
if(obj instanceof Order){
Order order=(Order)obj; //不强转的话,通过obj.无法调用Order里的属性
return this.orderId==order.orderId && this.orderName.equals(order.orderName); //String可以调用equals()方法,因为它已经重写过了
}
return false;
}
}
package com.atguigu.exer;
public class MyDateTest {
public static void main(String[] args) {
MyDate m1 = new MyDate(14, 3, 1976);
MyDate m2 = new MyDate(14, 3, 1976);
if (m1 == m2) {
System.out.println("m1==m2");
} else {
System.out.println("m1!=m2"); // m1 != m2
}
if (m1.equals(m2)) { //没有重写,相当于==
System.out.println("m1 is equal to m2"); //在后面重写equals()之后结果为 : m1 is equal to m2
} else {
System.out.println("m1 is not equal to m2");
}
}
}
class MyDate{
private int day;
private int month;
private int year;
public MyDate(int day, int month, int year) {
super();
this.day = day;
this.month = month;
this.year = year;
}
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
//重写equals()方法
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
MyDate other = (MyDate) obj;
if (day != other.day)
return false;
if (month != other.month)
return false;
if (year != other.year)
return false;
return true;
}
}
toString()方法
问题引入:
package com.atguigu.java;
import java.util.Date;
/*Object类中定义的toString():
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
*/
public class ToStringTest {
public static void main(String[] args) {
Customer cust1=new Customer("Tom", 21);
System.out.println(cust1.toString()); //com.atguigu.java.Customer@15db9742
System.out.println(cust1); //当我们输出一个对象的引用时,实际上就是调用当前对象的toString()方法,所以此处与上一句输出结果相同
//String、Date、File、包装类等都重写了Object类中的toString()方法,使得调用对象的toString()方法时,返回“实体内容”信息
String str=new String("MM");
System.out.println(str); //结果为:MM。因为String都重写了Object类中的toString()方法
Date date= new Date(453453453543L);
System.out.println(date.toString()); //Tue May 15 15:17:33 CST 1984,说明也重写过
}
}
String、Date、File、包装类等都重写了Object类中的toString()方法,使得调用对象的toString()方法时,返回“实体内容”信息
自定义类也可以重写toSring()方法,当调用此方法时,返回对象的实体内容。
此处我们在Customer中重写toString()方法:
自动生成toString()重写:
Alt+shift+s–>Generate toString()–>勾选后finish即可自动生成。
package com.atguigu.java;
public class Customer {
private String name;
private int age;
public Customer() {
super();
}
public Customer(String name, int age) {
super();
this.name = name;
this.age = age;
}
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;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Customer other = (Customer) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
//重写toString方法;
@Override
public String toString() {
return "Customer [name=" + name + ", age=" + age + "]";
}
}
运行CustomerTest():
package com.atguigu.java;
import java.util.Date;
/*Object类中定义的toString():
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
*/
public class ToStringTest {
public static void main(String[] args) {
Customer cust1=new Customer("Tom", 21);
System.out.println(cust1.toString()); //成功显示内容
System.out.println(cust1); //成功显示内容
//String、Date、File、包装类等都重写了Object类中的toString()方法,使得调用对象的toString()方法时,返回“实体内容”信息
String str=new String("MM");
System.out.println(str); //结果为:MM。因为String都重写了Object类中的toString()方法
Date date= new Date(453453453543L);
System.out.println(date.toString()); //Tue May 15 15:17:33 CST 1984,说明也重写过
}
}
练习:
package com.atguigu.exer;
public class GeometricObject { //几何图形
protected String color;
protected double weight;
public GeometricObject() {
super();
this.color="white";
this.weight=1.0;
}
public GeometricObject(String color, double weight) {
super();
this.color = color;
this.weight = weight;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
}
package com.atguigu.exer;
public class Circle extends GeometricObject {
private double radius;
public Circle() {
super();
radius=1.0;
// color="white"; 实际上此二行不用写,因为父类中已经进行初始化
// weight=1.0;
}
public Circle(double radius) {
super();
this.radius=radius;
}
public Circle(double radius,String color, double weight) {
super(color,weight);
this.radius=radius;
}
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
//求圆面积
public double findArea(){
return 3.14*radius*radius;
}
//重写equals()方法
@Override
public boolean equals(Object obj) {
if(this==obj){
return true;
}
if(obj instanceof Circle){
Circle c=(Circle)obj; //强转
return c.radius==this.radius;
}
return false;
}
//重写toString(输出圆的半径)
@Override
public String toString() {
return "Circle [radius=" + radius + "]";
}
}
package com.atguigu.exer;
public class CircleTest {
public static void main(String[] args) {
Circle circle1=new Circle(2.3);
Circle circle2=new Circle(3.3,"white",2.0);
//颜色是否相等
System.out.println("颜色是否相等:"+circle1.color.equals(circle2.color)); //一定要用equals()(此equals()是String里的)比较,不可以用“==”(比地址)
// circle1.equals(obj);
System.out.println("半径是否相等:"+circle1.equals(circle2)); //false
//调用toString输出半径值
System.out.println(circle1.toString()); //Circle [radius=2.3]
System.out.println(circle2); //默认也是调用toString,输出:Circle [radius=3.3]
}
}