1.常用类
1.1 Object类之 getClass() 方法
1.object类是每个类的父类,所有类都默认继承自object
API(Application Programing Interface):应用程序接口文档
2.常用方法:
Object类中
方法:public final 类> getClass()
//getClass()---> 返回此 Object的运行时类。
Class类中
方法:public String getName()
//getName()---> 返回由类对象表示的实体(类,接口,数组类,原始类型或空白)的名称,作为 String 。
Class 类对象 = 实例化对象.getClass(); --->返回的是class 包名.类名
Class 类对象 = 类名.class --->同上
String 变量名 = 实例化对象.getName();--->返回的是 包名.类名(称为类的全限定名称)
例:
public class Student{//默认继承自Object类
}
public class ObjectDemo{
public static void main(String[] args){
Student s1 = new Student();
Student s2 = new Student();
System.out.println(s1);//输出为实例对象的地址值
System.out.println(s2);
System.out.println(s1 == s2);//false
System.out.println("---------------------------") ;
Class c1 = s1.getClass();//获取类名为String类型赋值类Class类的类对象,通过判断类型,用getName()输出
Class c2 = s2.getClass();
System.out.println(c1);
System.out.println(c2);//输出为class 包名.Student
System.out.println(c1==c2); //true 因为都是一个字节码文件
Class c3 = Student.class ;
System.out.println(c3==c2);//true
System.out.println(c3==c1);//true
System.out.println("------------------------------");
//Class类中提供的getName()方法
String name1 = c1.getName();//上面已经将s1.getClass()获取到的类名赋值类Class c1,Class类型传入String类型的值进行判断,再将值赋值给name1. String类型name接受获取到的值,为类名.包名
String name2 = c2.getName() ;
System.out.println(name1);
System.out.println(name2);
}
}
1.2 Object类之hasaCode()方法
1.public int hashCode()
返回结果:该对象的哈希码值----理解为一个地址值,实际是通过哈希算法算出来的
翻阅Object类的原码
public native int hashCode();没有方法体
关键字native-->被native修饰的方法-->本地方法-->非Java语言,C语言
举例:
public class Student{//默认继承自Object类
}
public class ObjectDemo{
public static void main(String[] args){
Student s1 = new Student();
Student s2 = new Student();
System.out.println(s1.hashCode());//输出为整数
System.out.println(s2.hashCode());
System.out.println("高圆圆".hashCode());
System.out.println("赵又廷".hashCode());
}
}
1.3 Object类 之toString方法
1.public String toString()
返回结果:对象的字符串表示形式。
结果应该是一个简明扼要的表达,容易让人阅读。 建议所有子类覆盖此方法。
idea提供的方法重写: alt+ins------>toString()
如果不进行重写
输出就是这种格式 getClass().getName() + '@' + Integer.toHexString(hashCode()) 2.toString 的原码
public String toString() {
//包名.类名+@+十六进制数据
return this.getClass().getName() + "@"+Integer.toHexString(this.hashCode()); }
举例:
public class Student {//默认继承自Object类
private String name ;
private int age ;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//alt+inser--->toString
@Override
public String toString() {
return "Student{" +
"name='" + name + ''' +
", age=" + age +
'}';
}
}
}
public class ObjectDemo {
public static void main(String[] args) {
Student s1 = new Student("高圆圆",42) ;
Student s2 = new Student("赵又廷",45) ;
System.out.println(s1) ;
System.out.println(s2) ;//引用类型,输出一个地址值
//直接输出对象名称--->等价于调用的就是Object类的toString
System.out.println(s1.toString());
System.out.println(s2.toString());
}
}
1.4 Object类之equals()方法
1.public boolean equals(Object obj)
返回结果:如果此对象与obj参数相同true; 否则false。
请注意,无论何时覆盖该方法,通常需要覆盖hashCode方法,以便维护hashCode方法的通用合同,该方法规定相等的对象必须具有相等的哈希码。
重写alt-ins--->equal+hashCode()
如果我们不重写Object的equals方法,
默认比较的是两个引用类型的地址值是否相同,
如果重写了equals方法而且同时重写了hashCode()比较的是成员信息是否相同!
2.
==和equals的区别
==:如果连接都是两个基本数据类型:比如int 比较的是数据值是否相等
如果连接的是引用类型,那么比较的是地址值是否相同
3.源码
public boolean equals(Object obj) {
return (this == obj);
}
举例:
public class Student {//默认继承自Object类
private String name ;
private int age ;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//重写alt-ins--->equal+hashCode()
//s1.equals(s3) --->hashCode()是否一样 ---不同的对象的哈希码值不同,如果相同,
// 在比较成员信息的内容是否一样,name和age
@Override
public int hashCode() {
int result = name.hashCode();//"高圆圆"
result = 31 * result + age; //31*result+42---->固定的
return result;
}
//s1.equals(s3);
@Override
public boolean equals(Object o) { // Object o= new Student() ; s3--->Student类型
if (this == o) return true; //if(s1==s3) --->return true (两个堆对象)
if (o == null || getClass() != o.getClass()) return false;
//this.getClass()--->s1.getCalss()--->s1字节码文件对象 s3---->字节码文件对象--->一样的
Student student = (Student) o;//向下转型
if (age != student.age) return false; // this.age !=student.age 年龄是否相同(现在年龄42)
return name.equals(student.name);//name--->String---jdk提供---里面重写hashCode()和euals()方法--->比较的是String的内容是否相同
//上面都不成立---->s1.name.equals(student.name) ;
//
}
}
public class ObjectDemo {
public static void main(String[] args) {
Student s1 = new Student("高圆圆",42) ;
Student s2 = new Student("赵又廷",45) ;
System.out.println(s1) ;
System.out.println(s2) ;
Student s3 = new Student("高圆圆",42) ;
System.out.println(s1==s3) ;//false new对象 地址值不一样
System.out.println(s1.equals(s3)) ;//false
Student s4 = new Student("高圆圆",43) ;
System.out.println(s1.equals(s4));
System.out.println(s1.hashCode());
System.out.println(s3.hashCode());
//Object类的equals方法默认比较的是个对象的地址值是否相同
//重写之后,如果成员信息一样-认为是同一个人--->但是还有建议覆盖hashCode()比较hashCode值是否一样
}
}
1.5 Object类之clone()方法
1. protected native Object clone() throws CloneNotSupportedException;
//native 本地方法,通过系统资源调用实现
创建并返回此对象的副本-->本质就是复制对象(浅克隆)-->将对象的地址值给新的对象
2.Cloneable(此接口没有成员方法)-->标记接口
如果此对象的类没有实现接口Cloneable,则抛出CloneNotSupportedException
public class Student implements Cloneable {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
//重写toString方法
@Override
public String toString() {
return "Student{" +
"name='" + name + ''' +
", age=" + age +
'}';
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class CloneDemo {
public static void main(String[] args) throws CloneNotSupportedException{
Student s1 = new Student("张三",20) ;
Student s2 = new Student("张三",20) ;
Object object = s1.clone();
Student s3 = (Student) object;
System.out.println(s1) ;
System.out.println(s2) ;
System.out.println(s3) ;
}
}
输出结果:
Student{name='张三', age=20}
Student{name='张三', age=20}
Student{name='张三', age=20}