Java基础11--Object类--异常机制(一)

2014-11-24 07:42:56 · 作者: · 浏览: 0

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抛出的严重性的问题,这种问题发生一般不针对性