API常用类
(Application Programming interface)应用程序编程接口
就是JDK 提供的帮助简化编程的东西
编写一个机器人程序去控制机器人踢足球,程序就需要向机器人发出向前跑,向后跑,射门等各种命令,对于有开发经验的人员说,这道机器人厂商一定会提供一些关于控制机器人的java类,这些类定义好了操作机器人的各种动作的方法,其实这些java类就是机器人厂商提供给应用程序编程的接口。
Object类
javv.lang.Object
Object类的概述
类Object是类层次结构的根类,每个类都使用Object类作为超类。所有对象(包括数组)都实现这个类的方法。‘’
构造方法:
public Object();
问题:子类的构造方法默认访问的是父类的无参构造方法。
因为根类Object只有一个无参构造。
Object类的成员方法
public int hashCode();
public final Class getClass();
public String toString();
public boolean equals(Object obj);
protected void finalize();
protected Object clone();
public int hashCode()
返回该对象的哈希码值,支持此方法是为了提高哈希表的性能。
实际上,由Object类定义的hashCode 方法确实会针对不同的对象返回不同的整数(这一般是通过哈希算法将该对象的内部地址(实际地址)转换成一个整数来实现的,和地址值有关,但不是实际地址值。java编程语言不需要这种实现技巧)
注意:因为哈希值是根据地址值换算出来的,所以每次创建对象的时候,内存空间往往不是同一个,所以多次运行时,哈希值是会变化的。
public final Class<?> getClass();
返回此object的运行时类。
此处的Class是类,返回的是类名,真实返回的是该类的对象,该对象是由所表示类的static synchronized 方法锁定的对象。
java.lang.Class<T>
//Class<T>下有一个方法:
public String getName();
//以String的形式返回此Class对象所表示的实体(类,接口,数组类,基本类型或void)名称。
Student s = new Student();
Class c = s.getClass();
String str = c.getName();
System.out.println(str);//cn.itcast_01.Student
//打印的是当前类的包名及其类名。是全路径名称
//链式编程
String str2 = s.getClass.getName();
public String toString();
返回对象的字符串表示。
Object类的toString方法返回一个字符串,该字符串由类名(对象是该类的一个实例),at标记符”@”和此对象哈希码的无符号十六进制表示组成。即,该方法返回一个字符串,它的值等于:
getClass().getName()+’@’+Integer.toHexString(hashCode());
即,this.getClass().getName+’@’+Integer.toHexString(this.hashCode());
其中,java.lang.Integer 在Integer类中有一个静态的方法:
public static String toHexString(int i);
该方法以十六进制无符号整数形式返回一个整数参数的字符串表示形式。
Student s = new Student();
System.out.println(s.toString());
//cn.itcast_02.Student@42552c
//通常toString方法会返回一个“以文本方式表示”此对象的字符串。结果应试一个简明且易于读懂的信息表达式。
//建议所有子类都重写此方法。
System.out.println(s.getClass.getName+'@'+Integer.toHexString(s.hashCode()));
//cn.itcast_02.Student@42552c
重写toString 方法
一般把该类的所有成员变量值组成返回即可。
@Override
public String toString(){
//return super.toString();
//return "hello";
return "姓名:"+name + ",年龄:"+age;
}
toString()方法自动生成
右键–source–generate toString()
//toString方法已经如上面重写
Student s = new Student();
System.out.println(s);//姓名:null , 年龄:0
注意:
直接输出一个对象的名称,其实就是调用该对象的toString() 方法
Scanner jdk5 以后
public final class Scanner extends Object implements Iterator(String)
public boolean equals(Object obj);
指示其他某个对象是否与此对象“相等”。
源码:
public boolean equals(Object obj){
//this就是调用该方法的当前对象
return(this == obj);
//等于号,比价地址值
}
==:
基本类型:比较的就是值是否相等
引用类型:比较的就是地址值是否相等
equals :
引用类型:默认情况下,比较的是地址值
不过,我们可以根据自己重写该方法,一般重写都是自动生成,比较对象的成员变量值是否相同
注意:
当重写equals方法时,通常有必要重写hashCode方法,以维护hashCode方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
重写equals方法
一般都是用来比较对象的成员变量值是否相等。
@Override
public boolean equals(Object obj){
//return super.equals(obj);
//return true;
//这里根据比较的成员变量来决定返回true还是false
//这里其实要比较的是name和age
//但是,name是String类型的,而String是引用类型的,所以,不能直接用“==”比较。应该用equals()比较。
//java.lang.String String类中有equals 方法,而且该方法是重写自Object类的。比价的是字符串的值是否相等。
//this---S1
//Obj--s2
//我们要使用的是学生类的特有成员变量,所以要向下转型
Student s = (Student)obj;//s---obj---s2
if(this.name.equals(s.name)&& this.age==s.age){
return true;
}else{
return false;
}
//三元
//return this.name.equals(s.name)&& this.age ==s.age;
}
优化版
@Override
public boolean equals(Object obj){
//如果比较的两个对象是同一个地址值
if(this==obj){
return true;
//return 结束方法
}
//提高程序的健壮性
//先判断obj 是不是学生的一个对象,如果是就向下转型,如果不是就返回false
//判断一个对象是否是某个类的对象,格式如下:
//格式:对象名 instanceof 类名
//表示:判断该对象名是否是该类名的一个对象
if(!(obj instanceof Student)){
return false;
}
//如果是,就继续。
//我们要使用的是学生类的特有成员变量,所以要向下转型
Student s = (Student)obj;//s---obj---s2
return this.name.equals(s.name)&& this.age ==s.age;
}
protected void finalize();
protected 修饰的方法,一般要重写该方法。
当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法,但是什么时候回收不确定。子类重写 finalize 方法,以配置系统资源或执行其他清除。
finalize 的常规协定是:当 JavaTM 虚拟机已确定尚未终止的任何线程无法再通过任何方法访问此对象时,将调用此方法,除非由于准备终止的其他某个对象或类的终结操作执行了某个操作。
finalize 方法可以采取任何操作,其中包括再次使此对象对其他线程可用;
不过,finalize 的主要目的是在不可撤消地丢弃对象之前执行清除操作。
例如,表示输入/输出连接的对象的 finalize 方法可执行显式 I/O 事务,以便在永久丢弃对象之前中断连接。
object 类的finalize 方法执行非特殊性操作,它仅执行一些常规返回。object 的子类可以重写此方法。
protected Object clone();
创建并返回此对象的一个副本,
public static void main(String args[]){
//创建学生对象
Student s = new Student();
s.setName("赵小泉");
s.setAge(11);
//克隆学生对象
Object obj = s.clone();
Student s2 = (Student)obj;
System.out.println(s2.getName()+“----”+s2.getAge());
//赵小泉----11
//比较
Student s3 = s;
System.out.println(s3.getName()+“----”+s3.getAge());
//区别
s3.setName("赵小曲");
s3.setAge(13);
System.out.println(s.getName()+“----”+s.getAge());//赵小曲---13
System.out.println(s2.getName()+“----”+s2.getAge());//赵小泉---11
System.out.println(s3.getName()+“----”+s3.getAge());//赵小曲---13
//总结:
//此处克隆后的对象,如果对其数据进行修改和原来的对象没有关系
//而两个引用指向同一个对象,它们的改变是相互影响的
}
重写该方法 并抛出CloneNotSupportedException的异常
注意:重写该方法的类需要实现一个接口Cloneable,否则运行时会有CloneNotSupportedException抛出。
Cloneable 接口 是没有方法的接口,叫做标记接口。告诉我们实现该接口的类就可以实现对象的复制了 。
Cloneable 接口,以指示Object.clone() 方法可以合法的对该类实例进行按字段复制。
Object类的其他方法
void notify();唤醒在此对象监视器上等待的单个线程
void notifyAll();唤醒在此对象监视器上等待的所有线程
void wait();在其他线程调用此对象的notify()方法或notifyAll()方法前,导致当前线程等待
void wait(long timeout);在其他线程调用此对象的notify()方法或notifyAll()方法,或者超过指定的时间量前,导致当前线程等待。
void wait(long timeout,int nanos);在其他线程调用此对象的notify()方法或notifyAll()方法,或其他某个线程中断当前线程,或者超过指定的时间量前,导致当前线程等待。