前面学习的Java的语法基础, 后面的几篇介绍一下Java的常用API
那么什么是API?(Application Programming Interface,应用程序编程接口
)
API就是一组用于构建和集成应用软件的定义和协议。
学习类的过程就是学习Java的过程:换句话说学Java就是学习类
- 首先,了解这个类是干啥的(看介绍)JDK帮助文档由官方类的解释
- 看构造方法
- 看常量或者静态属性
- 看有哪些方法,静态方法还是成员方法 (这个API能实现什么功能)
- 调用方法 (使用其中的功能)
Object是老祖宗类,所有类都继承Object类并实现了他所有的功能和方法
Object类型的构造方法
1、Object():空参数构造方法,该构造方法内,第一行没有super(),因为Object没有父类
用途:① 创建Object类型的对象
② 子类去使用,所有的子类都会直接的或者间接的访问到这个顶层父类的构造方法
在JAVA中所有的类都默认继承Object类
java
public class Demo01 {
public static void main(String[] args) {
//使用空参构造创建对象
Object o1 = new Object();
Person p = new Person();
p.equals(o);//可以调用Object类中的方法,因为所有的类都是Object的子类,所以可以使用Object类中的方法
Object o2 = new Person();//父类的引用指向子类对象
//Object类型根据多态关系,可以接收任意类型的对象
//所有的类都直接的或者间接的继承自Object类
}
}
class Person{
}
1.toString
toString()方法在Object类里定义的,其返回值类型为String类型,返回类名和它的引用地址
1、public String toString() 返回对象的字符串表示,默认使用Object类的toString方法打印的对象, 在 idea中我们可以右键生成to String,或者alt+insert生成to String
2、对象返回一个地址值和全类名没有什么意义,所以建议将toString方法进行重写
- 重写的原则:返回该对象中所有成员变量的值
3、重写之后使用该方法,或者打印一个对象名,都是打印的toString方法返回的结果,重写之后,打印的结果就是一个类名和属性值的集合
java
public class Demo02 {
public static void main(String[] args) {
Person p = new Person("小黑",20);
System.out.println(p.toString());
System.out.println(p);
// System.out.println(p.getClass().getName() + "@" + Integer.toHexString(p.hashCode()));
//一般自定义类中都要重写toString方法,如果不重写打印地址值没有意义
//重写不需要自己手写,而是通过alt + insert 或者鼠标右键生成
Person p2 = new Person("小明",222);
System.out.println(p2);
}
}
class Person{
private String name;
private int age;
// 如果不重写toString方法,默认调用的就是父类的方法功能 也就是object中的打印全类名+@+哈希值
// @Override
// public String toString() {
// return "Person{" +
// "name='" + name + '\'' +
// ", 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;
}
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
2.equals
特点:是一个方法,并非运算符
,只适用于引用数据类型
1、public boolean equals(Object obj) 比较两个对象是否相同
2、比较的是Object类型,比较的是地址值,地址值是否相同
3、在实际生活中,比较地址值没有意义,因此在自定义类中都需要重写该方法
4、重写的原则:比较两个对象的属性值是否相同,如果属性值相同则认为是同一个对象
5、== 和 equals区别:比较的规则不同:
① ==比较任意数据类型,可以比较基本数据类型 ,也可以比较引用数据类型 比较的是地址值
② equals只能比较引用数据类型,equals方法在重写之前,比较是两个对象的地址值,重写之后比较的是对象的属性值
java
public class Demo03 {
public static void main(String[] args) {
Man m = new Man();
System.out.println(m.hashCode());//hashCode方法 重写之前是根据地址值生成的哈希值
Man m2 = new Man();
//重写之后,是根据属性值产生对应的哈希值
//属性值相同,哈希值相同
//属性值不同,哈希值大概率不同
System.out.println(m2.hashCode());
System.out.println(m == m2);
System.out.println(m.equals(m2)); //equals方法重写之前比较的是地址值,重写之后比较的是属性值
}
}
class Man{
//以后在使用自定义类的时候 一般都要重写 toString 和equals方法
private String name;
private int age;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Man man = (Man) o;
return age == man.age && Objects.equals(name, man.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
@Override
public String toString() {
return "Man{" +
"name='" + name + '\'' +
", 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;
}
public Man() {
}
public Man(String name, int age) {
this.name = name;
this.age = age;
}
}