API的概念:
API:Application Programming Interface,应用程序编程接口。本质是:程序的说明书
是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。比如:手机上的语音识别/面部识别都是使用已经定义好的API来进行识别的。
Java API:Java提供给我们使用的类,这些类将底层的实现封装了起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用。
注:我们可以通过查帮助文档来了解Java提供的API如何使用。以下是JAVA常用的API。
Object类:
1.Object类:
是类层次结构的根类,所有类都直接或间接的继承自该类。它的优势在于多态性的实现,即可以接受所有子类的实例对象。
2.Object类的构造方法:
public Object() ----------- 子类实例化的同时默认调用父类的构造方法,此处不写方法体的原因是我们不需要关注底层方法的实现。
注:1.eclipse中看源码使用 ctrl + 左键点击方法
2.Object类中关于八种基本数据类型并没有覆盖,因此出现了包装类,使得Object类基本上一统江湖。
Object类的部分成员方法:
public int hashCode():返回该对象的哈希码值。默认情况下,该方法会根据对象的地址来计算。重写之后则表示根据对象的属性值来计算哈希码。
不同对象的hashCode值不同,可以根据hashCode判断是否是同一个对象:
1.如果两个对象的hashCode值不同,代表他们一定不是同一个对象
2.如果得到的hashCode值相同,也不一定是同一个对象(哈希编码是一个算法,存在前后地址值编译相同的情况)
3.hashCode方法使用native修饰,表示本地的,被native修饰的一般使用C/C++来进行底层编码,本地使用效率较高
public final Class getClass():获得Class对象,该对象中包含所有类的所有信息:
Class类中的部分getter方法,除此之外还有很多方法,涉及反射的知识:
getName()、getSimpleName()、getPackage()方法
public String toString():返回该对象的字符串表示,默认情况下,返回:全类名 + @ + 地址名
toString :能够将所有的对象转成字符串。而默认情况下的数据对我们来说没有意义,一般建议重写该方法。
底层源码:
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}由上可知:在打印实例化对象的时候,会默认调用方法内的toString方法,若子类中没有重写,则去父类中找。
public boolean equals(Object obj):指示其他某个对象是否与此对象“相等”。 默认使用 ==,比较的是对象的引用是否相同。
equals 和hashCode 都可以判断两个对象是否相同:
在比较对象的时候:
1.先判断hashCode是否相等,
不相等:不是同一个对象
相等:
2.再比较equals
true: 同一个对象
false:不同的对象
我们在重写equals方法的同时,也要重写hashCode,目的就是为了保证他们的一致性
右键->source->generate hashCode and equals: 生成equals和hashCode,比较属性值
public class ObjectDemo2 {
public static void main(String[] args) {
Student1 stu1 = new Student1("张三",18);
Student1 stu2 = new Student1("张三",18);
System.out.println(stu1);//重写前:com._51doit.javase05.day11.classdemo.Student1@bd8d8;重写后:Student1 [name=张三, age=18]
System.out.println(stu2);//重写前:com._51doit.javase05.day11.classdemo.Student1@4e25154f;重写后:Student1 [name=张三, age=18]
//重写前比较地址值:false;重写后比较属性值:true。
System.out.println(stu1.hashCode()==stu2.hashCode());
//重写前比较地址值:false;重写后比较属性值:true。
System.out.println(stu1.equals(stu2));
//String是引用数据类型,其中也重写了.equals()和hashCode()方法,因此使用equals/hashCode方法比较字符串时直接比较的是:属性值
String str = "一笑倾城";
String str1 = new String("一笑倾城");
System.out.println(str==str1); //false:基本数据类型 -等号比较内容;引用数据类型 -等号比较地址值
System.out.println(str.hashCode()==str1.hashCode()); //true
System.out.println(str.equals(str1)); //true
Class clazz = stu1.getClass();
System.out.println(clazz.getName()); //全类名:com._51doit.javase05.day11.classdemo.Student1
System.out.println(clazz.getSimpleName()); //类名:Student1
System.out.println(clazz.getPackage()); //包名:package com._51doit.javase05.day11.classdemo
}
}
class Student1{
String name;
int age;
public Student1() {}
public Student1(String name,int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student1 [name=" + name + ", age=" + age + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student1 other = (Student1) 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;
}
}
== 和 .equals() 方法的区别:
•== 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。基本数据类型比较值大小是否相等。引用比较地址。
•equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断。