一,java.Lang.Object 类:是所有类的父类。若一个类没有显示的继承任何类时,默认extends java.Lang.Object
①既然Object类是所有类的父类,因此Object类中的内容是最具共性的
②既然Object类是所有类的父类,因此子类可以继承Object类中所有的方法(Object中没有属性)
③既然Object类是所有类的父类,因此若Object类中的方法对于子类来说不适用,子类可以对其进行重写
public class ObjectTest {
public static void main(String[] args) {
Person person=new Person();
}
}
class Person/*extends java.Lang.Object */{
}
equals()方法:
1.“==”运算符
①基本数据类型:比较两个基本数据类型的 值 是否相等。
②引用数据类型:比较两个引用数据类型的 地址值 是否相等。2.public boolean equals(Object obj):用于比较二个对象是否相等
①equals方法在java.lang.Object类中 (所有的类都继承了Object类中的equals方法)
②只能比较两个引用数据类型是否相等
③Object类中的 equals() 方法比较两个对象的 地址值 是否相等。(查看源码发现,实际就是“==”完成的)
④若Object类中的 equals() 方法对于我们不适用,我们可以对其进行重写【面试题】“==”和equals()的区别?-------上述所述
2.public boolean equals(Object obj):用于比较二个对象是否相等
①equals方法在java.lang.Object类中 (所有的类都继承了Object类中的equals方法)
②只能比较两个引用数据类型是否相等
③Object类中的 equals() 方法比较两个对象的 地址值 是否相等。(查看源码发现,实际就是“==”完成的)
查看源码,底层原理:“==”比较两个对象的地址值是否相等
注意:String的equals()方法与Object的equals()方法不同
原因:
String重写了Object类的equals()方法,比较的是两个字符串的内容
NOW:
若Object类中的 equals() 方法对于我们不适用,我们可以对其进行重写
public class ObjectTest {
public static void main(String[] args) {
/* int num=65;
char ch='A';
double d1=65.0;
System.out.println(num==ch);
System.out.println(num==d1);
System.out.println(ch==d1);
Person p1=new Person("张三",18);
Person p2=new Person("张三",18);
Person p3=p1;
System.out.println(p1==p2);
System.out.println(p2==p1);
System.out.println(p3==p1);*/
Person p1=new Person("张三",18);
Person p2=new Person("张三",18);
boolean boo1= p1.equals(p2);
System.out.println(boo1);//false---重写后变为:true
String str1=new String("AA");
String str2=new String("AA");
System.out.println(str1.equals(str2));//true
//需求:若两个人的姓名和年龄一样,视为同一个人 (equals()方法返回true )
}
}
class Person/*extends java.Lang.Object */{
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
//重写Object类的equals()方法
public boolean equals(Object obj){
if (obj instanceof Person){
Person p=(Person) obj;
if (this.name.equals(p.name)&&this.age==p.age){
return true;
}
}
return false;
}
}
Exer:
package Object类;
/*
1.编与Order类,有int型的orderId, String 型的orderName,相应的getter()和setter()方法,
两个参数的构造器,重写父类的equals()方法:public boolean equals (Object obj),
并判断测试类中创建的两个对象是否相等。
*/
public class OrderTest {
public static void main(String[] args) {
Order o1=new Order(101,"订单1");
Order o2=new Order(101,"订单1");
System.out.println(o1.equals(o2));//false---true
}
}
class Order{
private int orderId;
private String orderName;
public Order() {
}
public Order(int orderId, String orderName) {
this.orderId = orderId;
this.orderName = orderName;
}
public void setOrderId(int orderId) {
this.orderId = orderId;
}
public void setOrderName(String orderName) {
this.orderName = orderName;
}
public int getOrderId() {
return orderId;
}
public String getOrderName() {
return orderName;
}
//重写Object类的equals()方法
public boolean equals (Object obj){
if (this==obj){//如果两个地址值一样
return true;
}
if (obj instanceof Order){
Order o=(Order) obj;
if (this.orderId==o.orderId&&this.orderName.equals(o.orderName)){
return true;
}
}
return false;
}
}
toString()方法:
一.public String toString():返回当前对象的的字符串表现形式
①在java.lang.Object类中
②当直接输出对象的引用,默认调用toString()方法
③Object类中的 toString()方法返回值的格式为:
getClass().getName()+'@'+Integer.toHexString(hashCode());
④因此,Object类中的 toString() 对于我们来说不适用,我们可以对其重写。
package Object类;
/*
一.public String toString():返回当前对象的的字符串表现形式
①在java.lang.Object类中
②当直接输出对象的引用,默认调用toString()方法
③Object类中的 toString()方法返回值的格式为:
getClass().getName()+'@'+Integer.toHexString(hashCode());
④因此,Object类中的 toString() 对于我们来说不适用,我们可以对其重写。
*/
public class ToStringTest {
public static void main(String[] args) {
Person p1=new Person("张三",18);
/*String str=p1.toString();
System.out.println(str);*/
System.out.println(p1.toString());
System.out.println(p1);
}
class Person/*extends java.Lang.Object */{
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
//重写Object类的equals()方法
public boolean equals(Object obj){
if (obj instanceof Person){
Person p=(Person) obj;
if (this.name.equals(p.name)&&this.age==p.age){
return true;
}
}
return false;
}
//重写Object类的toString()方法
public String toString(){
return "姓名:"+name+" 年龄:"+age;
}
}
重写前:
重写后:
Exer:
package Object类.Exer;
public class GeometricObject {
protected String color;
protected double weight;
public GeometricObject() {
this.color="white";
this.weight=1.0;
}
public GeometricObject(String color, double weight) {
this.color = color;
this.weight = weight;
}
public void setColor(String color) {
this.color = color;
}
public void setWeight(double weight) {
this.weight = weight;
}
public String getColor() {
return color;
}
public double getWeight() {
return weight;
}
}
package Object类.Exer;
import java.awt.*;
public class Circle extends GeometricObject{
private double radius;
public Circle() {
/* this.color="white";
this.weight=1.0;*/
/*super("white",1.0);*/
//super();---隐式
this.radius=1.0;
}
public Circle(double radius) {
this.radius = radius;
}
public Circle(String color, double weight, double radius) {
super(color, weight);
this.radius = radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
public double getRadius() {
return radius;
}
public double findArea(){
return Math.PI*radius*radius;
}
/*
public boolean equals(Object obj){
return (this==obj)
}
*/
//重载
public boolean equals(Circle c){
return this.radius==c.radius;
}
public String toString(){
return "圆的半径为:"+radius+" 圆的面积为:"+findArea();
}
}
package Object类.Exer;
public class Test {
public static void main(String[] args) {
/*Circle c1=new Circle();//本态
Circle c2=new Circle();*/
//多态形式创建对象
GeometricObject c1=new Circle();
GeometricObject c2=new Circle();
System.out.println(c1.equals(c2));
System.out.println(c1);
System.out.println(c2);
}
}
Exer:
package Object类.Exer1;
import com.sun.org.apache.bcel.internal.generic.RET;
public class MyDateTest {
public static void main(String[] args) {
MyDate md1=new MyDate(2021,12,5);
MyDate md2=new MyDate(2021,12,5);
System.out.println(md1.equals(md2));
System.out.println(md1);
System.out.println(md2);
}
}
class MyDate{
private int year;
private int month;
private int day;
public MyDate() {
}
public MyDate(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
public void setYear(int year) {
this.year = year;
}
public void setMonth(int month) {
this.month = month;
}
public void setDay(int day) {
this.day = day;
}
public int getYear() {
return year;
}
public int getMonth() {
return month;
}
public int getDay() {
return day;
}
public boolean equals(Object obj){
if (this==obj){
return true;
}
if (obj instanceof MyDate){//instanceof一般用于对象类型强制转换
MyDate md=(MyDate) obj;
if (this.year==md.year&&this.month==md.month&&this.day==md.day) {
return true;
}
}
return false;
}
public String toString(){
return year+"年"+month+"月"+day+"日";
}
}