api的概述
API:应用程序编程接口(Application Programming Interface)。
JavaAPI:Java API指的就是JDK中提供的各种功能的Java类
学会如何阅读API。
Object类概述
类 Object 是类层次结构的根类。每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。所有的类都直接或者间接的继承自Object类。该类的设计也符合面向对象中"万事万物皆对象"的思想。
构造方法 :
public Object()
任何一个类都会调用这个方法,访问子类构造方法的首先会先访问父类无参的构造方法。
public class ObjectDemo01 {
public static void main(String[] args) {
Object object = new Student(); // 多态
// Student student = (Student)object;
// student.test();
//
// Teacher teacher = (Teacher)object;
// teacher.show();
Student[] students = new Student[5];
Object[] objects = new Object[5];
if (object instanceof Student) {
Student student = (Student)object;
student.test();
} else if (object instanceof Teacher) {
Teacher teacher = (Teacher)object;
teacher.show();
}
}
}
class Person extends Object{
public Person() {
super();
}
}
class Teacher extends Person{
public Teacher() {
super();
}
public void show() {
System.out.println("Teacher.show()");
}
}
hashCode方法
int hashCode()
实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。
(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)
hashCode和地址有关,我们可以理解为地址值,但是不是真实地址值
==
比较基本数据类型
比较的数值是否相等
引用数据类型
比较的引用变量中存放的地址值
public class ObjectDemo02 {
public static void main(String[] args) {
Student s1 = new Student("隔壁老王", 37);
Student s2 = new Student("隔壁老王", 37);
Student s3 = new Student("隔壁老李", 38);
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
System.out.println(s3.hashCode());
Student s4 = s1;
System.out.println(s1 == s2); // false
System.out.println(s1 == s4); // true
}
}
getClass方法
/*
* Class<?> getClass() (
* com.sxt.objectdemo.Student
*/
public class ObjectDemo03 {
public static void main(String[] args) {
Object object = new Student();
// Class c = object.getClass();
// System.out.println(c);
// String name = c.getName();
// System.out.println(name);
String name = object.getClass().getName();
System.out.println(name);
}
}
toString方法
/*
* String toString()
*
* 通过观察源码分析
* public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
toString返回的是一个 类名全路径 + @ + hashCode的十六进制
System.out.println(s1);
输出语句输出一个引用类型的时候,默认调用了引用类型的toString方法输出
输出一个对象我们希望的是打印的成员变量
以后都是通过自动生成toString
*/
// 自动生成代码如下
// alt + shift + s 再按S
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", address=" + address + "]";
}
equals方法
/*
* boolean equals(Object obj)
*
* 观察源码:
* s2
* public boolean equals(Object obj) {
* // s1 == s2
return (this == obj);
}
通过源码我们发现 Object方法中的equals比较的是地址值
比较两个对象是否相等,比较地址值毫无意义
我们希望比较两个对象,比较的是成员变量是否相等,所以说父类Object继承过来的equals方法
不能满足具体子类Student的需求,所以需要方法重写
我们一般开发中使用自动生成
alt+shift+s 再按H
通过观察自动生成的代码我们发现字符串比较的是内容是否相等
观察源码:
fianl class String{
private final char value[];
this:"abc" anObject : "abe"
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
// "abe"
String anotherString = (String)anObject;
int n = value.length; // 3
if (n == anotherString.value.length 3) {
char v1[] = value; "abc"
char v2[] = anotherString.value; "abe"
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
}
所以比较两个字符串是否相等比较的是每一个字符是否相等
因为字符串类重写equals方法
如果我们自己写的类不重写equals方法,那么比较的是地址值是否相等
clone方法
/*
* protected Object clone()
* 创建并返回此对象的一个副本。
*
* java.lang.CloneNotSupportedException
* 错误名称: 克隆不支持异常
* 产生原因: 需要克隆的类没有实现克隆接口
* 解决办法: 找到对应的类实现Cloneable接口
*/
public class ObjectDemo06 {
public static void main(String[] args) throws CloneNotSupportedException {
Student s1 = new Student("张飞", 20);
Student s2 = new Student("曹操", 30);
Object s1Clone = s1.clone();
Student s3 = (Student)s1Clone;
System.out.println(s3.getName() + "|" + s3.getAge());
Student s4 = s1;
System.out.println(s1 == s4); // true
System.out.println(s1 == s3); // false
s3.setName("刘备");
s3.setAge(30);
System.out.println(s1.getName() + "|" + s1.getAge());
System.out.println(s3.getName() + "|" + s3.getAge());
}
}
public class Student extends Object implements Cloneable{
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public interface Cloneable {
}
finalize()方法
/*
* protected void finalize()
* 当垃圾回收器确定不存在对该对象的更多引用时,
* 由对象的垃圾回收器调用此方法。用于垃圾回收,但是什么时候回收不确定。
*
* 面试题1
* 什么情况下对象会被当做垃圾处理?
* 1.当对象被赋null
* Student s = new Student();
* s = null;
* 2.当对象重新被创建
* Student s = new Student();
* s = new Student();
*
* 面试题2
* finalize()方法,finally关键字,final关键字的区别?
* finalize()方法
* 当垃圾回收器确定不存在对该对象的更多引用时,
* 由对象的垃圾回收器调用此方法。用于垃圾回收,但是什么时候回收不确定。
* final
* final修饰的变量表示常量,不能够被二次赋值
* final修饰的类不能够被继承
* final修饰的方法不能够被子类重写
* finally
* 后续会讲解,一般用来释放资源(io流的端口,网络的端口,数据库的连接断开等等)
*/
public class ObjectDemo07 {
public static void main(String[] args) throws Throwable {
Student s1 = new Student();
s1.finalize();
s1 = null;
}
}
public class Student{
@Override
protected void finalize() throws Throwable {
// TODO Auto-generated method stub
super.finalize();
}
}