/*
* 类 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;
}*/
}
Object类
最新推荐文章于 2023-03-05 20:37:04 发布