Object类中的五种方法
clone()
Object类源码:protected native Object clone() throws CloneNotSupportedException; 这里有个问题:为什么Sun公司会用protected来修饰clone()方法呢,而不用public呢?有知道的朋友请指教 native表示该方法的实现不只是通过java实现的,还用C、C++实现 克隆一个对象的方法 1.先覆盖克隆方法 2.实现Cloneable接口 3.方法调用,抛出异常 ------------- public class ExecClone01{ //3.抛出异常 public static void main(String[] args) throws Exception{ Machine m1 = new Machine("Lenovo"); Machine m2 = m1.clone(); System.out.println(m1 == m2);//打印 false,说明克隆成功 System.out.println(m2.name);//打印 Lenovo } } //2.实现Cloneable()接口 class Machine implements Cloneable{ String name; public Machine(String name){ this.name = name; } //1.覆写clone()方法,抛出异常 @Override public Machine clone() throws CloneNotSupportedException{//jdk5.0之后覆写的返回类型可以改变,但是必须是父类返回类型的子类类型->协变返回类型 Object obj = super.clone(); return (Machine)obj; } } ------------- public class ExecClone02 { //3.方法调用的时候需要抛出异常 public static void main(String[] args) throws CloneNotSupportedException{ OS o1 = new OS("Win10"); OS o2 = o1.clone(); System.out.println(o1 == o2); System.out.println(o2.name); } } //要求OS类可以实现克隆 //2.实现一个接口: Cloneableclass OS implements Cloneable{ String name; public OS(String name){ this.name = name; } //1.先覆盖clone()方法 ->抛出异常CloneNotSupportedException @Override public OS clone() throws CloneNotSupportedException{ Object obj = super.clone(); return (OS)obj; } } -------------
finalize()
protected void finalize() throws Throwable {} 对象的"遗言"方法 当gc回收一个对象的时候,主动会调用这个对象的finalize方法 面试题:final和finalize之间的区别? final表示最终的 修饰符,可以修饰类、方法、变量 finalize是Object类里面的一个方法,当gc回收一个对象的时候会主动调用的一个方法
toString()
public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); } 用来制定打印一个对象,显示的内容 当打印一个对象时,实际上打印的是该对象的toString方法,Object类本身打印对象,显示 类型@XX,String类中覆盖了Object类的toString方法,返回内容,所以打印出的是内容 ------------- public class Test01{ public static void main(String[] args){ Person p = new Person("王天二",22,'男',true); System.out.println(p); //XXX先生/女士 今年XXX岁 是个已婚/未婚人士 } } class Person{ String name; int age; char gender; boolean isMarry; public Person(String name,int age,char gender,boolean isMarry){ this.name = name; this.age = age; this.gender = gender; this.isMarry = isMarry; } @Override public String toString(){//当要进行较多拼接时,最好是采用StringBuffer进行拼接,效率更高 return name + (gender == '男'?"男士":"女士") + " 今年" + age + "岁" + " 是个" + (isMarry?"已婚":"未婚") + "人士"; } } -------------
equals()
public boolean equals(Object obj) { return (this == obj); } Object类本身比较的是两个对象的地址 程序员可以按照自己的意愿将内存里面不同的两个对象视为相等对象 -> 逻辑相等也就是说,制定一个类型比较的规则,当什么条件成立的时候,可以将两个不同的对象视为相等对象 Object类中equals()源代码如下: //对象1.equals(对象2) public boolean equals(Object obj){//普通方法,需要用对象来调用 //this:当前调用equals方法的对象 //obj:表示参数传来要参与比较的另一个对象 //==:比较地址 return (this == obj); } ------------- public class ExecEquals01 { public static void main(String[] args){ Student stu1 = new Student("王天一",12,"A"); Student stu2 = new Student("陈浩南",24,"O"); Student stu3 = new Student("山鸡",25,"A"); System.out.println(stu1.equals(stu2)); //打印 false System.out.println(stu1.equals(stu3)); //打印 true } } /** 定义一个Student类型 属性:name age blood 创建对象时 完成所有属性的赋值 只要两个学生的血型一样就视为相等对象 */ class Student{ String name; int age; String blood; public Student(String name,int age,String blood){ this.name = name; this.age = age; this.blood = blood; } @Override public boolean equals(Object obj){//覆写的条件 1.发生在有继承关系的子类中 2.权限修饰符大于父类被覆写方法权限修饰符;返回类型jdk5.0之前必须一致,jdk5.0之后可以是父类方法返回类型的子类类型,称为协变返回类型;方法签名(方法名和方法参数)必须一致 3.抛出异常的范围必须小于父类被覆写的方法抛出的异常 String blood1 = this.blood; String blood2 = ((Student)obj).blood; return blood1.equals(blood2); } } ------------- public class ExecEquals02 { public static void main(String[] args){ Food f1 = new Food("豆腐西施",12.5,"热菜"); Food f2 = new Food("西红柿炒鸡蛋",12.5,"热菜"); Food f3 = new Food("豆腐西施",12.5,"热菜"); System.out.println(f1.equals(f2)); System.out.println(f1.equals(f3)); } } /** 定义一个Food类型 属性:name price type 两个菜的所有属性一样就视为两个对象相等 考虑一行实现 */ class Food{ String name; double price; String type; public Food(String name,double price,String type){ this.name = name; this.price = price; this.type = type; } @Override public boolean equals(Object obj){ return (this.name).equals(((Food)obj).name) && (this.price == ((Food)obj).price) && (this.type.equals(((Food)obj).type)); } } -------------
hashCode()
public native int hashCode(); 制定一个对象的散列特征码 散列:将一大组数据分散为不同的小组 HashSet HashMap的底层是基于哈希表实现的 比如:将19 5 62 81 93 66分为4组,可以将每个数对4取余 x%4 [0] [1]93 81 5 [2]66 62 [3]19 注意:当equals()方法被重写时,通常有必要重写hashCode()方法,以维护 hashCode()方法的常规协定,该协定声明相等对象必须具有相等的哈希码 ---------- public class Test04 { public static void main(String[] args){ Teacher tea1 = new Teacher("二爷",10000.0,'女',true); Teacher tea2 = new Teacher("二爷",1232,'女',false); Teacher tea3 = new Teacher("二爷",10000.0,'女',true); System.out.println(tea1.equals(tea2)); //打印 false System.out.println(tea1.equals(tea3)); //打印 true System.out.println(tea1.hashCode()); //打印 685487 System.out.println(tea2.hashCode()); //打印 676718 System.out.println(tea3.hashCode()); //打印 685487 } } class Teacher{ String name; double salary; char gender; boolean isMarry; public Teacher(String name,double salary,char gender, boolean isMarry){ this.name = name; this.salary = salary; this.gender = gender; this.isMarry = isMarry; } @Override public boolean equals(Object obj){ if(obj == null)return false; if(!(obj instanceof Teacher))return false; if(obj == this)return true; return this.name.equals(((Teacher)obj).name)&& this.salary == (((Teacher)obj).salary)&& this.gender == (((Teacher)obj).gender)&& this.isMarry == (((Teacher)obj).isMarry); } @Override public int hashCode(){ return name.hashCode() + (int)salary + gender + (isMarry?1:0); } } -----------
Object类中的五种方法的更多相关文章
- 并发编程(六)Object类中线程相关的方法详解
一.notify() 作用:唤醒一个正在等待该线程的锁的线程 PS : 唤醒的线程不会立即执行,它会与其他线程一起,争夺资源 /** * Object类的notify()和notifyAll()方法详 ...
- 说说Object类下面有几种方法呢?
今天说一道基础题型,不过很多人会忽略或者至少说不完整,但是面试时被问到的几率还是很大的. 面试题 Object有几种方法呢? Java语言是一种单继承结构语言,Java中所有的类都有一个共同的祖先.这 ...
- Object类中通用方法之:toString()方法
1.Java所有的对象都是Object类的实例,都可以直接调用该类中定义的方法,这些方法称为通用方法 2.toString()方法即为Object类中定义的通用方法之一 3.平时我们如果在控制台直接打 ...
- Object类的equals()方法总结
1.equals()是Object中的方法,作用在于检测一个对象是否等于另一个对象. 2.在Object类中equals()方法是判断两个对象是否有相同的引用 ,即是否是相同的对象. 3.String ...
- 【Java基础之Object类(一)】Java中Object类中的所有方法(toString、equals、hashCode、clone、finalize、wait和notify等)详解(转载)
java中的hashcode.equals和toString方法都是基类Object的方法. 首先说说toString方法,简单的总结了下API说明就是:返回该对象的字符串表示,信息应该是简明但易于读 ...
- Object类中方法详解
目录 概述 hashCode方法 getClass方法 toString方法 equals方法 clone方法 finalize方法 概述 Object 是类层次结构的根类.每个类都使用 Object ...
- html table表格导出excel的方法 html5 table导出Excel HTML用JS导出Excel的五种方法 html中table导出Excel 前端开发 将table内容导出到excel HTML table导出到Excel中的解决办法 js实现table导出Excel,保留table样式
先上代码 <script type="text/javascript" language="javascript"> var idTmr; ...
- [Python之路] object类中的特殊方法
一.object类的源码 python版本:3.8 class object: """ The most base type """ # d ...
- Java面试系列第2篇-Object类中的方法
Java的Object是所有引用类型的父类,定义的方法按照用途可以分为以下几种: (1)构造函数 (2)hashCode() 和 equals() 函数用来判断对象是否相同 (3)wait().wai ...
随机推荐
- Struts2中期(这框架目前正处于淘汰状态)
Struts2的第二天 Struts2的第二天的内容 1. Struts2框架中的Servlet的API的使用 2. Struts2中Action接收请求参数 3. Struts2中自定义拦截器 案例 ...
- IE浏览器关于ajax的缓存机制
IE浏览器对于同一个URL只返回相同结果.因为,在默认情况下,IE会缓存ajax的请求结果.对于同一个URL地址,在缓存过期之前,只有第一次请求会真正发送到服务端.大多数情况下,我们使用ajax是希望 ...
- Hibernate知识点小结(二)
一.持久化对象和标识符 1.持久化类 配置完关系后,操作的实体对应的类,成为持久化类 (Customer) 2.持久化类标识符(oid:object id) 3.持久 ...
- span没有name属性
<span id="test" name="测试数据">测试咯</span> 在eclipse中这么写发现会有警告提示.百度发现原来sp ...
- 【TOJ 1449】Area of Circles II(求不同位置的两圆面积之和)
描述 There are two circles on the plane. Now you must to calculate the area which they cover the plane ...
- ABAP术语-Field
Field 原文:http://www.cnblogs.com/qiangsheng/archive/2008/02/01/1061244.html Name in an ABAP program f ...
- 利用login-path对MySQL安全加固
Preface Connection security is one of the most important safety strategies which we should ...
- idea中注解配置一对多,多对一,双向多对一映射(不详细)
一对多 package cn.pojo; import javax.persistence.*; import java.io.Serializable; import java.util.Set; ...
- web pack
WebPack是模块捆绑器,如果你的代码跨越了不同模块(例如不同Javascript文件),web pack可以将这些零散的代码构建到浏览器可读单个文件中. web pack还可以作为构建通道,你可以 ...
- 服务器空间不足导致mysql服务器无法运行
今天有朋友请我帮忙解决一个问题,他公司服务器mysql数据库一直连接失败.登录服务期之后发现服务器空间占满了,导致mysql不能启动. 下面说解决方法: 首先查看空间占用,发现空间占满了 df -h ...