几种常用类的使用
什么是JavaAPI?
API的英文专业术语翻译过来就叫做应用程序接口而JavaAPI指的就是Java提供给我们使用的类这些类将底层的实现封装了起来,意思就是开发Java的大神们已经将Java里我们使用的含有一些重要功能的类写好了,我们只管调用就是。下面我们就来看看这些大神写的其中一个我们经常需要使用的类:
Object类
这个类指的就是所有类的顶层父类,也可以这样描述,它是类层次结构的根类,所有的类都直接或者间接的继承自该类;它有一个构造方法是一个空参构造,所以我们写的所有类都有默认有一个空参构造,这个就是继承父类的机制。
Object类的hashcode()方法的使用
这个是Object类的hashcode方法,它的功能是根据对象的地址值来计算它的哈希码值,随后返回给方法,不同的对象,其哈希码值一般是不同的,但也有可能是相等的,但这种情况违反了Java的规范,所以我们一般就考虑两个不同对象的哈希码值是不相同的,但是对于同一个对象其哈希码值一定是相同的,这个没有别的情况,我们可以在任何测试类中直接使用hashcode 方法。
输出结果:
我们可以看到输出的结果是一个哈希码值,它是根据对象的地址值来进行计算的。
Object类的getclass()方法的使用
这个是Object类的getclass方法,它是我们可以用此方法来获取对象的真实类的全名称
输出结果:
我们可以看到对象调用这个方法后我们可以直接看到该对象使用的是哪个类。
Object类的toString()方法的使用
这个是Object的返回对象的字符串表示的方法,他可以将对象实现对象的一种字串表示,这个方法的源代码是很简单的我们大可以来在Idea中来看其源代码。
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
该方法的实现就是返回一个获得对象类名和对象名+@+对象的地址的哈希码值的字符串。
这种方法存在时没有意义的,我们一般时用不到这样字符串的信息的,所以我们在设计具体类的时候如果想用顶层父类Object的这个方法的时候,我们就需要将该方法进行重写了,我们一般希望重写完后这个方法的功能是返回该类的成员变量。所以我们 可以将方法重写成如下的方法:
public String toString() {
return this.name+this.age
}
其中name 和age是该类的成员变量。
Object类的equals()方法的使用
这是Object类中的equals方法它的方法功能是指示其他对象与此对象是否相等,在默认情况下该方法就是比较对象的引用是否相等:
public boolean equals(Object obj) {
return (this = obj);
}
在比较结束后返回一个Boolean类型的值。
但这样判别很明显其作用不大,甚至可以说没有任何意义,因为对象不同这点对象是否相同我们直接就可以看的出来,而不需要进行这无谓的一步。所以同样的我们在使用该方法时要对其进行方法的重写,我们可以改写该方法的功能是能够判断两个对象的成员变量的值是否相等。
public boolean equals(Object obj) {
return (this .name== obj.name);
}
注意 :在String类中对equals方法Java已经重写过了,重写后的equals方法可以判断两个String类的字符串否相等,而不是判断其引用类型的地址值是否相同。
Object类的clone()方法的使用
我们在使用这个方法的时候我们必须要注意:clone方法的权限修饰符是受保护的,在用的时候需要该类重写该方法,并把该方法的权限修饰符改为Public,任何对象需要调用clone方法克隆的时候,前提是该对象的类必须要实现cloneable接口,cloneable接口只是一个标识接口,没有任何的方法逻辑。
public class test {
public static void main(String[] args) throws CloneNotSupportedException {
DogFood dogFood = new DogFood("王中王");
Dog dog = new Dog("旺财", 3, dogFood);
dog.dogFood.name = "双汇";
Dog dog1 = (Dog) dog.clone();
dog1.dogFood.name = "金锣";
System.out.println(dog.dogFood.name);//
System.out.println(dog1.dogFood.name);//
new Object().hashCode();
}
}
class Dog implements Cloneable {
public String name;
public int age;
public DogFood dogFood;
public Dog() {
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
public Dog(String name, int age, DogFood dogFood) {
this.name = name;
this.age = age;
this.dogFood = dogFood;
}
}
class DogFood {
public String name;
public DogFood(String name) {
this.name = name;
}
}
输出克隆的结果:
深浅克隆的区别:如果克隆一个对象的时候该对象里有着另一个类的对象,我们在浅克隆的时候,浅克隆中没有调用到构造方法,那个对象中的对象不会被克隆,我们只是得到该类对象的地址值,并没有克隆对象中的对象,而深克隆可以实现该对象的克隆