Java中Object类

Object类

Object类是所有类的直接或者间接的父类。
当一个类没有使用extends关键字指明其父类的情况下,该类的默认父类就是java.lang.Object类。
Object类是Java语言中所有类的根,所有的类都直接或间接的继承了Object类,数组也继承了Object类,因为Object类是所有类的直接或者间接父类,所以Object类中的功能就是通用功能。

Object类中的方法

1.clone()
protected Object clone():克隆,复制的意思,
创建一个对象,返回当前对象的复制品。返回值是一个Object类型的对象,如需其他引用,注意向下转型。该方法是被protected修饰的,是受保护的。调用该方法需要在类中重写。

package com.zretc.java;
/**
 * 克隆实现的过程
 * 1.要将被实现对象的类:必须实现Cloneable接口
 * 2.要在该类中重写Object.clone()
 * 3.调用clone方法之后,需要对该方法进行异常处理
 * 4.将返回值Object对象向下转型,之后就可以将该返回对象给到被实现
类的引用。
 *  * 注意:两个对象的地址值不同,但内容相同
 * @author 马富贵
 * */
public class CloneDemo {
 public static void main(String[] args) throws
CloneNotSupportedException {
 Animal animal = new Animal("巴菲兔",12);
 Animal animal2 = (Animal) animal.clone();
 //输出两个克隆对象的地址值,是完全不一致的。
System.out.println(animal);//com.zretc.java.Animal@2a139a55
 
System.out.println(animal2);//com.zretc.java.Animal@15db9742
 //但是他们的内容相同。
 System.out.println(animal.info());//[姓名:巴菲兔 年
龄:12]
 System.out.println(animal2.info());//[姓名:巴菲兔 年
龄:12]
 //比较两个对象的地址
 System.out.println(animal == animal2);//false
 }
}
package com.zretc.java;
public class Animal implements Cloneable {
 private String name;
 private int age;
 
 public Animal() {
 }
 public Animal(String name , int age) {
 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
 protected Object clone() throws CloneNotSupportedException {
 // TODO Auto-generated method stub
 return super.clone();
 }
 public String info() {
 return "[姓名:" + this.name + "\t年龄:" + this.age + 
"]";
 }

2.fianllize
当堆空间的某个对象在栈空间没有任何引用指向它的时候,那么java的GC机制就会自动调用这个对象的finallize()方法,表示堆空间的这个实体被回收。
测试:Animal 对象引用为null,强制调用gc机制,在对象被释放之前,调用重写的finallize()方法

package com.zretc.java;
public class FinallizeDemo {
 public static void main(String[] args) {
 Animal animal = new Animal("布朗熊",2);
 System.out.println(animal);//Animal [name=布朗熊, age=2]
 animal = null;
// 强制调用:gc机制,gc调用之前会调用finallize
 System.gc();//对象被释放--->Animal [name=布朗熊, age=2]
 }
}

**注:**final,finally,finallize三者之间的区别?

  • final:是一个关键字,最终的、不可变的意思。
    被它修饰的属性,值不可以被更改;
    被它修饰的方法,不可以被重写;
    被它修饰的类,不可以被继承。

  • finally:是一个关键字,常与try-catch连用,作用是无论是否发生异常都必须执行的代码块。

  • finallize:是Object类的一个方法,作用是java中的gc()垃圾回收机制在释放对象之前必须要调用的一个方法。

3.getClass()
获取当前对象的所属类,在直接写入getClass的时候,不能放到静态方法中,因为此时对象还没有出现。

package com.zretc.java;
import java.util.Date;
public class GetClassDemo {
 //1.直接写入:但是注意不能在静态方法中直接写入
 public void method() {
 System.out.println(getClass());
 }
 public static void main(String[] args) {
 GetClassDemo g = new GetClassDemo();
System.out.println(g.getClass());//classcom.zretc.java.GetClassDemo
 Date date = new Date();
 System.out.println(date.getClass());//classjava.util.Date
 g.method();//class com.zretc.java.GetClassDemo
 }
}

4.equals()
用于比较两个对象的地址,也就是堆内存中的地址,该方法底层使用的就是==,当我们想要比较两个对象的内容的时候,需要重写equals方法,例如:String类的equals()就已经被重写了。

package com.zretc.java;
public class Course {
 private String name;
 private double score;
 
 public Course() {
 super();
 }
 public Course(String name, double score) {
 super();
 this.name = name;
 this.score = score;
 }
 public String getName() {
 return name;
 }
 public void setName(String name) {
 this.name = name;
 }
 public double getScore() {
 return score;
 }
 public void setScore(double score) {
 this.score = score;
 }
 
// 重写equals方法
 public boolean equals(Object obj) {
// 1.判断当前对象和传入的obj对象地址是否相等?
// 如果地址相等,则内容一定也相等。
 if(this == obj) {
 return true;
 }
 
// 2.判断传入的obj对象是否为null,如果为null,结果一定是false
 if(obj == null) {
 return false;
 }
 
// 3.判断当前对象与传入的obj对象的类型是否一致,若不一致一定是返false
 if(this.getClass() != obj.getClass()) {
 return false;
 }
// 4.确认是同一个类的话,将传入的对象向下转型
 Course course =(Course) obj;
 if(name == null) {
 if(course.name != null) {
 return false;
 }
// 5.当name不为空,将name与obj的name进行字符串比较
 }else if(!name.equals(course.name)){
 return false;
 }
 
// 6.判断成绩类型double,如果小数的长度不相等,也要返回false
 if(Double.doubleToLongBits(score) !=
Double.doubleToLongBits(course.score)) {
 return false;
 }
 return true;
 }
 }

测试类:

package com.zretc.java;
public class EqualsDemo {
 public static void main(String[] args) {
 Object i = 10;
 System.out.println(i.equals(1));//false
 
 //注意:c1和c2的地址不一样,但是内容相同
 Course c1 = new Course("java",90.01);
 Course c2 = new Course("java",90.01);
 System.out.println(c1.equals(c2));//true
 System.out.println(c1 == c2);//false
 }
 }

注:==和equals的区别?
==:是比较运算符

  • 可以使用在基本数据类型和引用数据类型变量中
  • 比较基本数据类型时,比较的是值
  • 比较引用数据类型时,比较的是地址
    equals():是一个方法,而非运算符
  • 要调用该方法,必须是引用数据类型的对象.的方式调用
  • Object中,equals是这样定义的
public boolean equals(Object obj) {
 return (this == obj);
}
  • 说明:Object类中定义的equals()和==的作用是相同的:比较两个对象的地址值是否相同.即两个引用是否指向同一个对象实体
  • 像String、Date、File、包装类等都重写了Object类中的equals()方法。重写以后,比较的不是两个引用的地址是否相同,而是比较两个对象的"实体内容"是否相同
  • 通常情况下,我们自定义的类如果使用equals()的话,也通常是比较两个对象的"实体内容"是否相同。那么,我们就需要对Object类中的equals()进行重写
  • 重写的原则:比较两个对象的实体内容是否相同

5.toString()

  • 该方法返回的是一个字符串,他的值为:
    getClass().getName() + “@” + Integer.toHexString(hashCode());
    [全类名][@][转换为16进制的哈希码]
  • 重写toString(),可以自定义格式:
@Override
public String toString() {
 return "Course [name=" + name + ", score=" + score + "]";
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想学摄影的IT男

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值