• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
Foreordination
酒后高歌磨剑,梦中快意恩仇,名利脚下踩,情义两肩挑
博客园    首页    新随笔    联系   管理    订阅  订阅
一、Object类

1.Object类是所有类的父类

  声明一个类的时候,实际上已经默认继承了Object类 

package property;

public class Hero extends Object{
    String name;
    float hp;
    float armor;
    int moveSpeed;
    
    public void useItem(Item i){
        System.out.println("Hero use item");
        i.effect();
    }
    
    public Hero(){
        System.out.println("Hero的无参构造方法");
    }
    
    public Hero(String name){
        System.out.println("Hero的有参构造方法");
        this.name=name;
    }
    
    public static void main(String[] args){
        new Hero();
    }
}
View Code

2.toString()方法

  Object类提供一个toString()方法,所以所有的类都有toString()方法,返回当前对象的字符串表达

package property;
public class Hero{
    String name;
    protected float hp;
    
    public String toString(){
        return name;
    }
    
    public static void main(String[] args){
        Hero h=new Hero();
        h.name="demo";
        System.out.println(h.toString());
        System.out.println(h);//直接打印对象就是打印对象的toString()返回值
    }
}
View Code

3.finalize()方法

  当一个对象没有任何引用指向的时候,它就满足垃圾回收的条件,当他被垃圾回收的时候,他的finalize()方法就会被调用

finalize()方法不是开发人员主动调用的方法,而是由JVM调用的。

package property;

public class Hero{
    public String name;
    protected float hp;
    
    public String toString(){
        return name;
    }
    
    public void finalize(){
        System.out.println("这个对象正在被回收");
    }
    
    public static void main(String[] args){
        Hero h;//只要一个引用
        for(int i=0;i<100;i++){
        /*不断生成新的对象
        每次创建一个对象,前一个对象,就没有引用指向了,那些对象就满足
        垃圾回收的条件,当垃圾堆积的比较多的时候,就会触发垃圾回收
        一旦这个对象被回收,它的finalize()方法就会被调用。
        
        */
            h=new Hero();
        }
    }
}
View Code

4.equals()方法

  用于判断两个对象的内容时候相同,java里的equals方法是交给开发者去重写的,自己定义满足条件的Object是equal的

package property;
public class Hero{
    public String name;
    protected float hp;
    
    public boolean equals(Object o){
        if(o instanceof Hero){
            Hero h=(Hero)o;
            return this.hp==h.hp;
        }
        return false;
    }
    
    public static void main(String[] args){
        Hero h1=new Hero();
        h1.hp=20;
        Hero h2=new Hero();
        h2.hp=30;
        System.out.println(h1.equals(h2));
    }
}
View Code

5.==

  这个不是Object的方法,但是用于判断两个对象是否相同,更确切的说是,判断两个引用,是否指向同一个对象。

package property;
public class Hero{
    public String name;
    protected float hp;
    
    public boolean equals(Object o){
        if(o instanceof Hero){
            Hero h=(Hero)o;
            return this.hp==h.hp;
        }
        return false;
    }
    
    public static void main(String[] args){
        Hero h1=new Hero();
        h1.hp=30;
        Hero h2=new Hero();
        h2.hp=30;
        System.out.println(h1==h2);
    }
}
View Code

6.hashCode()方法

  返回一个对象的哈希值,hashcode存在主要是为了查找的快捷性,用来在散列表存储结构中确定对象的存储地址的。

  1. 如果两个对象的equals相等,那么这两个对象的hashcode一定相同
  2. 如果对象的equals方法被重写,那么对象的hashcode方法也要重写
  3. 如果对象的hashcode相同,不代表两个对象就相同,

举个例子:Set集合里元素不可以重复,那么原理是什么,set是根据equals方法来判断两个元素是否相等的,比如set里面已经有了100个元素,那么第101个元素进来的时候,最多能调用100次equals方法,如果equals方法写得复杂,对比的东西很多,那么效率大大降低。

使用hashcode就不一样了,比如HashSet,底层是基于HashMap实现的,先通过Hashcode取一个模,这样就一下子固定到某个位置了,如果这个位置上没有元素,那么就可以肯定HashSet中必定没有和新添加元素equals的元素,就可以直接存放,不用比较,如果这个位置上有元素了,逐一比较,先比较HashCode,如果HashCode都不同接下来不用比了,肯定不一样,如果HashCode相等时,在用equals()方法比较,如果相等就不存,不相等就存。

7.线程同步相关的方法

  Object还提供线程同步的方法:wait()  notify()  notifyAll()

8.getClass()方法

  会返回一个对象的类对象。属于反射,获取当前对象的类型。

比如:Class class="Hello".getClass();得到的就是字符串类型。

反射:理解为在运行时期获取对象类型信息的操作。传统的编程方法要求程序员在编译阶段决定使用的类型,但是在反射下,可以童泰获取这些信息

编写更加具有可移植性的代码。

 

posted on 2018-02-24 15:48  Foreordination  阅读(136)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3