Object类



/*
 * 类 Object 是类层次结构的根类。每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。
 * 
 * Object() 空参构造方法,因为所有的子类都会默认调用父类的空参构造方法
 * 
 * OOP面向对象思想:封装,继承,多态
 *  是根据现实生活中的事物封装得来的,封装,继承,多态是模拟现实生活中的关系
 * 面向对象编程:Think in java(万物皆对象)
 *  任何一类事物都可以封装成一个类,每一个具体的事物可以用一个对象表示
 * 怎么封装一个类?
 *  描述(属性,成员变量):name,age,sex,address,phoneNumber...
 *  功能(函数,成员方法):eat,sleep,playGame,say...
 * 创建对象:
 *  类名 对象名 = new 类名(可能有参数);
 *  对象名.成员
 */
public class ObjectDemo {
    public static void main(String[] args) throws Exception {
        // public int hashCode()返回该对象的哈希码值,默认的hashCode计算方式是根据地址值计算得来的
        Person p = new Person();
        Person p2 = new Person();
        System.out.println(p==p2);//false
        System.out.println(p.hashCode());//366712642
        System.out.println(p2.hashCode());//1829164700
        String s = new String("哈哈");
        String s2 = new String("哈哈");
        System.out.println(s==s2);//false
        //String类的hashCode方法重写了,是根据内容计算得来的
        System.out.println(s.hashCode());//694528
        System.out.println(s2.hashCode());//694528
        //一般情况下,JDK提供的类都会重写hashCode方法
        System.out.println("----------------------------");

        //public final Class<?> getClass()返回此 Object 的运行时类
        //根据面向对象的思想,可以把一个抽象概念的类用Class来表示;一个类有包名,类名,方法,属性,构造方法....
        Class clazz = p.getClass();
        Class clazz2 = p2.getClass();
        System.out.println(clazz==clazz2);//true
        //public String getName()以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。
        System.out.println(clazz.getName());//cn.edu360.Person
        //public String getSimpleName()返回源代码中给出的底层类的简称。
        System.out.println(clazz.getSimpleName());//Person
        System.out.println("----------------------------");

        //public String toString()返回该对象的字符串表示
        //println默认会调用一个对象的toString方法
        //Object类的toString方法的默认实现:getClass().getName() + "@" + Integer.toHexString(hashCode())
        System.out.println(p);//name=张三,age=10
        System.out.println(p2.toString());//name=张三,age=10
        System.out.println(s);//哈哈
        System.out.println("----------------------------");

        //public boolean equals(Object obj)指示其他某个对象是否与此对象“相等”。 
        //在java编程中,一般使用equals比较内容是否相等;使用==比较地址值是否相等
        System.out.println(s.equals(s2));//true
        System.out.println(s==s2);//false
        p.name = "哈哈";
        System.out.println(p.equals(p2));//false
        System.out.println(p==p2);//false
        System.out.println("----------------------------");

        //protected Object clone()创建并返回此对象的一个副本
        //我想根据p对象创建一个克隆对象
        Object obj = p.clone();
        Person p3 = (Person)obj;

        //当对象里面有引用类型的成员变量时,这个引用类型的成员变量并没有进行克隆成功
        System.out.println(p3==p);//false

        System.out.println(p.obj==p2.obj);//false
        System.out.println(p.obj==p3.obj);//true,所以我说是浅克隆
    }
}

class Person implements Cloneable{
    public String name = "张三";
    public int age = 10;
    public Object obj = new Object();

    @Override
    protected Object clone() throws CloneNotSupportedException {
        // TODO Auto-generated method stub
        return super.clone();
    }

    //因为不满意父类的equals方法,所以我们重写equals方法
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Person other = (Person) obj;
        if (age != other.age)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }

    /*@Override
    public boolean equals(Object obj) {
        //判断obj是否等于null,如果等于null直接返回false
        if(null==obj){
            return false;
        }
        //如果obj不是Person的类型,直接返回false
        if(!(obj instanceof Person)){
            return false;
        }
        //如果obj的字节码文件对象和this的字节码文件对象不一样,直接返回false
        if(this.getClass()!=obj.getClass()){
            return false;
        }

        //如果以上三关都通过了,那么就可以确定obj是Person的类型
        Person p = (Person)obj;
        //比较p和this的成员变量是否相等
        return this.age==p.age?this.name.equals(p.name):false;
    }*/


    //因为不满意父类的toString方法实现,可以重写toString方法
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }

    /*@Override
    public String toString() {
        return "name="+name+",age="+age;
    }*/
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值