11-1,Object类-equals方法
1,Object是所有类的根类。
Object是不断向上抽取而来的,具备着所有对象都具备的共性的内容。
2,equals方法:指示其他某个对象是否与此对象相等。equals(Object obj)。
equals方法比较的是两个对象的地址值。
他在Java中的源代码为:
public boolean equals(Object obj) {
return this == obj;
}
调用格式为obj1.equals(obj2);
如:
Person p1 = new Person(); Person p2 = new Person(); Person p3 = p1; System.out.println(p1 == p2); System.out.println(p1.equals(p3));
11-2,equals方法覆盖
1,开发时一般都会覆盖equals方法,因为值判断地址值没有太大意义。
根据对象的特有内容,建立判断对象是否相等的依据。
如:
比较两个人的年龄是否相同:
public boolean equals(Object obj) {
if(!(obj instanceof Person)) { //判断obj是否是Person类型
throw new ClassCastException("类型错误");//如果不是Person类型,则不能向下转型
}
Person p = (Person)obj; //向下转型后才能使用子类中的特有内容
return this.age == p.age;
}
这里因为用Object obj接收参数,相当于Object obj = p;把p2向上转型为Object类型,p2里面的特有内容不能使用。
11-3,Object类-hashCode方法
1,作用:返回该对象的散列码值(哈希码)。
2,Person p = new Person();
System.out.println(p.hashCode()); //打印十进制的哈希值
3,验证哈希码是否相同
Person p1 = new Person(20); System.out.println(p1); System.out.println(Integer.toHexString(p1.hashCode()));//把十进制的哈希值转成十六进制
11-4,Object类-getClass方法
1,作用:返回此Object的运行时类。
Person p1 = new Person(); Person p2 = new Person(); Class clazz1 = p1.getClass(); Class clazz2 = p2.getClass(); //比较获取的字节码文件的内存地址,由于p1和p2都是由Person创建的,所以地址相同 System.out.println(clazz1 == clazz2); //true //返回字节码文件的名称 System.out.println(clazz1.getName()); //Person
以上例来说,Person类加载创建了Person.class文件,这个文件就是Person类以后创建对象的顶层字节码文件,Person.class字节码文件在内存中有且只有一个,p1和p2这些对象都是依据Person.class文件创建的。
getClass方法返回的就是这样的字节码文件。
11-5,Object类-toString方法
1,作用:返回该对象的字符串表示。
2,Person p1 = new Person();
Person p2 = new Person();
System.out.println(p1);//Person@616d63
System.out.println(p1.getClass().getName+ "$"+Integer.toHexString(p1.hashCode()));//Person$616d63
3,Object类的toString方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at标记符@和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:getClass().getName()+"@"+Integer.toHexString(hashCode());
4,为了实际应用,通常在子类中重写equals、hashCode和toString方法。
如:
public String toString() {
return "Person : " + age;
}
11-6,异常-概述
1,异常:是在运行时间发生一些不正常的情况。
在Java中用类的形式对不正常的情况进行了描述和封装对象。
描述不正常的情况的类,就称为异常类。
以前正常的流程代码和问题处理代码相结合,现在将正常流程代码和问题处理代码分离,提高了阅读性。
其实异常就是Java通过面向对象的思想将问题封装成了对象。
用异常类对其进行描述。
不同的问题用不同的类进行具体的描述。比如角标越界,空指针等。
旧方法与新方法的比较:
class ExceptionDemo {
public static void main(String[] args) {
int[] arr = new int[3];
arr = null;
System.out.println(arr[3]);//抛出指向为空的异常,若没有arr=null则抛出角标越界异常
sleep(-5); //若时间为负或大于10000,则抛出异常。
}
public static void sleep(int time) {
/* 原始解决办法,正常流程代码和问题处理代码相结合
if(time < 0) {
处理办法...
}
if(time > 10000) {
处理办法...
}
System.out.println("我睡" + time);
*/
//抛出异常的处理办法,正常流程代码和问题处理代码相分离
//代码时间为负的情况,这个FuTime对象中会包含异常的名称,信息,位置等信息。
if(time < 0) {
抛出 new FuTime();
}
if(time > 10000) {
抛出 new BigTime();
}
System.out.println("我睡" + time);
}
}
//定义异常解决办法的类
class FuTime {
处理办法...
}
class BigTime {
处理办法...
}
11-7,异常体系
1,Java中有很多异常,每一个异常都是一个类。问题很多,意味着描述他的类也很多,将其共性向上抽取,就形成了异常体系。
2,最终问题分为两大类:
(1)一般不可处理的,用Error类表示。
(2)可以处理的,用Exception类表示。
Throwable
|--Error
|--Exception
无论是Error还是Exception,问题发生就应该可以抛出,让调用这知道并处理。该体系的特点就在于Throwable及其所有的子类都具有可抛性。
3,可抛性到底指的是什么呢?怎样体现可抛性呢?
是通过两个关键字来体现的,就是throws和throw,凡是可以被这两个关键字所操作的类和对象都具备可抛性。
4,Error的特点为:
是由JVM抛出的严重性的问题,这种问题发生一般不针对性