ApI的概述和Object的概述
- Java API:就是Java提供给我们使用的类,这些类将底层的实现封装了起来,
- Object类概述:类层次结构的根类,所有类都直接或者间接的继承自该类
- 构造方法:
public Object() - hashCode()方法
特点:
- 返回该对象的哈希码值。默认情况下,该方法会根据对象的地址来计算。
- 不同对象的,hashCode()一般来说不会相同。但是,同一个对象的hashCode()值肯定相同。
- 不是对象的实际地址值,可以理解为逻辑地址值。
代码示例:
public class MyTest {
public static void main(String[] args) {
//创建Object类的对象
Object obj = new Object();
System.out.println("Object 的地址值obj是:" + obj);
int i = obj.hashCode();
System.out.println("Object的哈希值:" + i);
Object obj2 = new Object();
System.out.println("第二个Object的地址值obj2是:" + obj2);
int i2 = obj2.hashCode();
System.out.println("第二个Object的哈希值:" + i2 );
System.out.println(obj.hashCode()==obj2.hashCode());
//不同的哈希码值是不同的
}
}
代码运行结果:
Object 的地址值obj是:java.lang.Object@140e19d
Object的哈希值:21029277
第二个Object的地址值obj2是:java.lang.Object@17327b6
第二个Object的哈希值:24324022
false
- getClass()方法
特点:
- 返回此 Object 的运行时类。
- 可以通过Class类中的一个方法,获取对象的真实类的全名称。
代码示例:
public class MyTest2 {
public static void main(String[] args) {
//object.class字节码文件加载进内存,JVM就会为Object.class创建一个对象
Object obj = new Object();
Class clazz = obj.getClass();//object.class 字节码文件对象
Object obj2 = new Object();
Class<?> aClass = obj2.getClass();//返回该类的字节码文件对象
Object obj3 = new Object();
Class aClass1 = obj3.getClass();
System.out.println(obj==obj2);//flase
System.out.println(obj2==obj3);
System.out.println(clazz==aClass);//true 字节码文件对象是一个,所以相同
System.out.println(aClass==aClass1);
}
}
代码运行结果:
false
false
true
true
- toString()方法
具体实现:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
代码示例:
public class MyTest1 {
public static void main(String[] args) {
Object o = new Object();
System.out.println(o.toString());//后面的toString默认有
String s = o.toString();//获取该对象的地址值的字符串表现行式
System.out.println(s);
}
}
代码运行结果:
java.lang.Object@140e19d
java.lang.Object@140e19d
代码示例2:
public class MyTest {
public static void main(String[] args) {
Teacher teacher = new Teacher("张三",19);
teacher.toString();
System.out.println(teacher);
}
}
class Teacher{
private String name;
private int age;
public Teacher(String name, int age) {
this.name = name;
this.age = age;
}
//利用软件重写toString()放法
// ctrl+o 重写 选择toString()
// alt+Insert get。set方法,空参构造
@Override
public String toString() {
return "name"+name +"\n"+"age"+age;
}
}
代码运行结果:
name张三
age19
- equals()方法
- 指示其他某个对象是否与此对象“相等”。
源代码:
public boolean equals(Object obj) {
return (this == obj);
} - 默认情况下比较的是对象的引用是否相同。
- 由于比较对象的引用没有意义,一般建议重写该方法。一般用于比较成员变量的值是否相等
代码示例:
package org.westos.demo5;
import sun.rmi.transport.ObjectTable;
public class MyTest {
public static void main(String[] args) {
Object obj1 = new Object();
Object obj2 = new Object();
System.out.println(obj1==obj2);//flase
//public boolean equals(Object obj1) 判断两个对象的值是否相等
boolean b = obj1.equals(obj2);
System.out.println(b);//flase
System.out.println("-----");
Student s1 = new Student("战三", 19);
Student s2 = new Student("战三", 19);
System.out.println(s1 == s2);//flase
System.out.println(s1.equals(s2));//true
//只要两个对象的成员变量的值一样,我们就认为这两个对象是一样。重写equals()方法
boolean b1 = s1.equals(new Teacher());//ClassCastException 类型转换异常
System.out.println(b1);
System.out.println("------");
boolean b2 = s1.equals(s2);
System.out.println(b2);//flase
}
}
class Student{
private String name;
private int age;
public Student(String name,int age){
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object obj) {
//如果对象的地址值相同,则其内容相同
if(this == obj){
return true;
}
if(!(obj instanceof Student)){
return false;
}
//也可以这样
//if (obj == null || getClass() != obj.getClass()) {
// return false;
// }
Student stu = (Student)obj;
return this.name.equals(stu.name) && this.age ==age;
}
}
class Teacher{
}
代码运行结果:
false
false
-----
false
true
false
------
tru
- 使用clone()方法克隆
使用clone()方法采用的是浅克隆的方式
对象浅克隆要注意的细节:
- 如果一个对象需要调用clone的方法克隆,那么该对象所属的类必须要实现Cloneable接口。
- Cloneable接口只不过是一个标识接口而已,没有任何方法。
- 对象的浅克隆就是克隆一个对象的时候,如果被克隆的对象中维护了另外一个类的对象,这时候只是克隆另外一个对象的地址,而没有把另外一个对象也克隆一份。
- 对象的浅克隆也不会调用到构造方法的。
代码示例:
public class MyTest {
public static void main(String[] args) throws CloneNotSupportedException {
// protected Object clone () 创建并返回此对象的一个副本。
Dog dog = new Dog();
dog.name = "小明";
dog.age = 10;
System.out.println(dog.name+","+dog.age);
System.out.println("-----");
Dog clone = (Dog) dog.clone();
System.out.println(clone.name+","+clone.age);
System.out.println("------");
Dog dog3 = new Dog();
Dog clone3 = (Dog) dog3.clone();
System.out.println(clone3.name+","+clone3.age);
}
}
/*此类实现了Cloneable 接口,以实现Object.clone()方法可以合法的对该类实例进行按字段复制
* 在没有实现Cloneable 接口的实例上调用Object的clone方法,则会导致跑出*CloneNotSupportedException 异常。
* Cloneable没有任何的抽象方法的接口,是一个标记接口
* */
class Dog extends Object implements Cloneable{
String name = "熊白";
int age = 1;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
运行结果:
小明,10
-----
小明,10
------
熊白,1