zoukankan      html  css  js  c++  java
  • Java——Object类

    2.6 Object类

    ①java.lang.Object 类,是所有类的根父类!

    ②如果在类的声明中未使用extends 关键字指明其基类,则默认基类为Object 类

    ③Object类仅有一个空参的构造器  public Object(){  }

    2.5.1 toString方法

    SUN在Object类中设计toString方法的目的:返回java对象的字符串表示形式。

    在现实的开发过程中,Object里边的toString方法已经不够用了。因为Object的toString方法实现的结果不满意。Object中的toString方法就是要被重写的。

    SUN是这样实现toString方法的:

    public String toString() {

                                return getClass().getName() + "@" + Integer.toHexString(hashCode());   

                      }

    Object中的toString方法返回:类名@java对象的内存地址经过哈希算法得出的int类型值再转换成十六进制。

    这个输出结果可以等同看做java对象在堆中的内存地址。

    public class Test01{        

           public static void main(String[] args){

                  //创建一个Object类型的对象.

                  Object o1 = new Object();

                  //调用toString方法.

                  String oStr = o1.toString();

                  System.out.println(oStr); //java.lang.Object@de6ced

                  //创建一个Person类型的对象

                  Person p1 = new Person("刘德华",50);

                  //调用toString方法.

                  String pStr = p1.toString();

                  System.out.println(pStr); //重写前:Person@lfb8ee3//后:Person[name=刘德华,age=50]

                  Person p2 = new Person("巩俐",50);

                  System.out.println(p2.toString()); //Person[name=巩俐,age=50]

                  //print方法后面括号中如果是一个引用类型,会默认调用引用类型的toString方法.

                  System.out.println(p2); //Person[name=巩俐,age=50]

           }

    }

    class Person{

           String name;

           int age;

          

           Person(String name,int age){

                  this.name = name;

                  this.age = age;

           }

          

           //重写toString方法.

           //根据项目的需求而定。

           //需求规定,显示格式:Person[name=刘德华,age=50]

           public String toString(){

                  return "Person[name="+name+",age="+age+"]";

           }

          

    }

    【eclipse操作】

    快速生成重写的toString 方法:Source à Generate toString()…

     

    2.6.2 equals方法

    Object中的equals方法:

           public boolean equals(Object obj) {

                         return (this == obj);

               }

    o1.equals(o2);  o1是this,o2是obj

    == 两边如果是引用类型,则比较内存地址,地址相同则是true,反之则false.

    Object中的equals方法比较的是两个引用的内存地址。

    java对象中的equals方法的设计目的:判断两个对象是否一样。

    public class Test01{

          

           public static void main(String[] args){

                 

                  Object o1 = new Object();

                  Object o2 = new Object();

                 

                  boolean b1 = o1.equals(o2);

                 

                  System.out.println(b1); //false

                 

                 

                  Star s1 = new Star(100,"黄晓明");

                  Star s2 = new Star(100,"黄晓明");

                  Star s3 = new Star(110,"黄晓明");

                 

                  System.out.println(s1.equals(s2)); //true

                  System.out.println(s2.equals(s3)); //false

           }

    }

    class Star{

          

           //身份证号

           int id;

          

           //姓名

           String name;

          

           //Constructor

           public Star(int id,String name){

                  this.id = id;

                  this.name = name;

           }

           //Object中的equals方法比较的是内存地址.

           //在现实的业务逻辑当中,不应该比较内存地址,应该比较内容。

           //所以Object中的equals方法也要重写。

           //根据需求规定重写equals方法,

           //需求规定:如果身份证号一致,并且名字也一致,则代表是同一个人。

           //s1.equals(s2);

           public boolean equals(Object obj){

                 

                  if(this==obj) return true;

                 

                  if(obj instanceof Star){

                         Star s = (Star)obj;

                         if(s.id == id && s.name.equals(name)){

                                return true;

                         }

                  }

                 

                  return false;

           }

    }

    /*

           关于java语言中如何比较两个字符串是否一致.

           在java中比较两个字符串是否一致,不能用“==”

           只能调用String类的equals方法.

    */

    public class Test02{

           public static void main(String[] args){

                  String s1 = new String("ABC");

                  String s2 = new String("ABC");

                 

                  System.out.println(s1==s2); //false

                 

                  //String已经重写了Object中的equals方法,比较的是内容。

                  System.out.println(s1.equals(s2)); //true

                 

           }

    }

    【eclipse快捷方式】

    快速生成重写的equals 方法:

    Source àGenerate hashCode() and equals()…

    2.6.3 finalize方法

    垃圾回收器(Garbage Collection),也叫GC,垃圾回收器主要有以下特点:

    ①当对象不再被程序使用时,垃圾回收器将会将其回收

    ②垃圾回收是在后台运行的,我们无法命令垃圾回收器马上回收资源,但是我们可以

    告诉他,尽快回收资源(System.gc 和Runtime.getRuntime().gc())

    ③垃圾回收器在回收某个对象的时候,首先会调用该对象的finalize 方法

    ④GC 主要针对堆内存

    ⑤单例模式的缺点

    finalize方法什么时候调用?   

    ①finalize方法每个java对象都有

    ②finalize方法不需要程序员去调用,由系统自动调用。

    ③java对象如果没有更多的引用指向它,则该java对象成为垃圾数据,等待垃圾回收器的回收,垃圾回收器在回收这个java对象之前会自动调用该对象的finalize方法。

    ④finalize方法是该对象马上就要被回收了,例如:需要释放资源,则可以在该方法中释放。

    public class Test01{

           public static void main(String[] args){

                  Person p1 = new Person();

                  p1 = null; //没有引用再指向它.等待回收.

                  //程序员只能“建议”垃圾回收器回收垃圾.

                  System.gc();

           }

    }

    class Person{

           //重写Object中的finalize方法.

           public void finalize() throws Throwable {

                  System.out.println(this + "马上就要被回收了!");

                  //让引用再次重新指向该对象,该对象不是垃圾数据,不会被垃圾回收器回收!

                  //Person p = this;

           }

    }

    2.6.4 hashCode方法

    public class Test01{

          

           public static void main(String[] args){

                 

                  //hashCode方法返回的是该对象的哈希码值

                  //java对象的内存地址经过哈希算法得出的int类型的数值.

                  Test01 t = new Test01();

                 

                  System.out.println(t.hashCode()); //14576877

                 

           }

    }

    当垃圾收集器将要收集某个垃圾对象时将会调用finalize,建议不要使用此方法,因为此方法的运行时间不确定,如果执行此方法出现错误,程序不会报告,仍然继续运行。

    public class FinalizeTest01 {

    public static void main(String[] args) {

    Person person = new Person();

    person.id = 1000;

    person.name = "张三";

    //将person 设置为null 表示,person 不再执行堆中的对象

    //那么此时堆中的对象就是垃圾对象

    //垃圾收集(GC)就会收集此对象

    //GC 不会马上收集,收集时间不确定

    //但是我们可以告诉GC,马上来收集垃圾,但也不确定,会马上来,也许不会来

    person = null;

    System.gc();//通知垃圾收集器,来收集垃圾

    /*

    try {

    Thread.sleep(5000);

    }catch(Exception e) {

    }

    */

    }

    }

    class Person{

    int id;

    String name;

    //此方法垃圾收集器会调用

    public void finalize() throws Throwable {

    System.out.println("Person.finalize()");

    }

    }

    注意以下写法

    public class FinalizeTest02 {

    public static void main(String[] args) {

    method1();

    }

    private static void method1() {

    Person person = new Person();

    person.id = 1000;

    person.name = "张三";

    //这种写法没有多大的意义,

    //执行完成方法,所有的局部变量的生命周期全部结束

    //所以堆区中的对象就变成垃圾了(因为没有引用指向对象了)

    //person = null;

    }

    }

    class Person{

    int id;

    String name;

    public void finalize() throws Throwable {

    System.out.println("Person.finalize()");

    }

    }

  • 相关阅读:
    两台Mysql数据库数据同步实现
    利用Python读取外部数据文件
    在Python应用中使用MongoDB
    使用python语言操作MongoDB
    windows下Graphviz安装及入门教程
    【Machine Learning】决策树案例:基于python的商品购买能力预测系统
    Python数据可视化-seaborn
    np.tile 函数使用
    Python机器学习库scikit-learn实践
    基于C#net4.5websocket客户端与服务端
  • 原文地址:https://www.cnblogs.com/superjishere/p/11819712.html
Copyright © 2011-2022 走看看