一、Object类
Object类:是所有类的祖先类。
在重写equals方法的同时,一般也要重写hashCode方法。当且仅当两个对象变量引用同一个对象时,equals才返回真。相等对象必须具有相等的哈希值。
任何对象在装载到内存时都会自动生成一个有关类字节码class文件的对象,用object类对象的getClass()可获取到这个对象。同一个类产生的所有对象它们的class文件对象都是相同的。
Object对象的toString()方法返回的是 object对象的getClass().getName()+"@"+Interger.toHexString(hashCode());
二、异常
异常是在运行时间发生的不正常现象。在java中用类的形式对不正常情况进行描述和封装。描述不正常情况的类就称为异常类,以前正常代码和异常代码相结合,现在将正常流程代码和问题处理代码分离,提高了阅读性。
异常的体系:
Throwable
1.Error
通常出现重大问题,如运行的类不存在或内存溢出等。一般不编写针对代码对其处理。
是由jvm抛出的严重性问题。
2.Exception
在运行时出现的一般情况,可通过try catch finally捕获。
Error和Exception子类名都是以父类名作为后缀。
该体系的特点是Throwable以及所有的子类都具有可抛性。
可以自定义异常,但是想让一个类成为异常类,必须继承异常体系,因为只有继承异常体系的子类才具有可抛性,才能被两个关键字所操作:throw throws。
class FuShuIndexException extends Exception { FuShuIndexException(){} FuShuIndexException(String msg) {
super(msg);
} } class Demo { public int method(int[] arr,int index) throws FuShuIndexException /*throws用在函数声明中,用于声明异常*/ { if (arr==null) { throw NullPointException("数组的引用不能为空!"); } if (index>=arr.length) { /*throw有在函数体内*/ throw new ArrayIndexOutOfBoundsException("数组的角标越界!“+index); } if (index<0) { throw new FuShuIndexException("角标不能为负"); } } }
Exception异常可分为:
1.编译时检查的异常:Exception及其子类都是(除了RuntimeExcepion子类体系),一般用throws声明,在编译时抛出异常。
2.编译时不检查的异常,只在运行时检查的异常:RuntimeExcepion子类体系。它是在正常运行期间发生的异常,可能在执行期间抛出,但未被捕获的RuntimeException任何子类无需用throws进行声明。这类异常让调用者调用时的程序强制停止,让调用者对其程序进行修正。
自定义异常时一般要么继承Exception,要么继承RuntimeException。
throw和throws的区别:
1.throws使用在函数定义上,throw使用在函数内
2.throws抛出的是异常类,可同时抛出多个,用逗号隔开。而throw抛出的是异常对象
异常除了throw抛出,用throws声明外,还可以用try/catch/finally来捕捉。
对于一个try来说,可以有多个catch。
try { int c=method(arr,-30) } catch(FuShuIndexException e) { System.out.println(e.getMessage()); System.out.println(e.toString()); e.printStackTace(); //JVM默认的异常处理机制就是调用异常对象的这个方法,可指明错误位置 }
catch(NullPointException e)
{
System.out.println(e.toString());
}
finally中的内容一定会被执行,比如:
try { int i=method(arr,-30); } catch(FuShuIndexException e) { System.out.println(e.toString()); return ; } finally { System.out.println("finish"); } System.out.println("over");
当上述代码发生异常时,虽然在catch中有return;语句,使得System.out.println("over");语句执行不到,但是finally中的语句一定会被执行。当然如果将return;换成System.exit(0);直接关闭虚拟机,那么finally中的内容也就不会执行了。
当子类在覆盖父类方法时,父类的方法如果抛出了异常,那么子类的方法只能抛出父类的异常或该异常的子类异常。如果父类方法没有抛出异常,那么子类覆盖时也不能抛出异常,只能用try。