Try{
For(; ;){
Try{
//
}catch(Exception e){
//
}finally{
Continue; / break;
}
}
}catch(Exception e){
e.printStackTrace();
}
注: 死循环finally中用break,contine,return等任何操作,都肯定不会被执行到。
如果在finally中写了出异常的程序,则会先执行finally后去运行catch块中的语句。
Eg : Try{
For(; ;){
Try{
//
}catch(Exception e){
//
}finally{
Throw new Exception();
}
}
}catch(Exception e){
e.printStackTrace();
}finally{
System.out.println(“finally first”);
}
一: object
隐含的默认根对象。
Eg: Array a = new Array[3]; ---- 此也是属object类的,数组也是属于Object类的。
常用方法: equals(), hashcode(); toString(); clone(); finalize();(object类中可重写的五种方法)。
注: 接口与类是不同体系的。
(1). Equals(); 对象的相等性测试
“==”: 是对比两个对象的地址是否一致。
Equals: 是对比两个对象的内容是否一致。
Eg: @override
public boolean equals (Object obj) {
if (null == obj) { //非空性
return false;
}
if (this == obj) { //自反性(如果为同一实例,为真)
return true;
}
if (!(obj instanceof PhoneNumber)) { //对比是否是同一类型的(为了//解决不是一类型的对象做对比时的出错问题)
return false;
}
PhoneNumber temp = (PhoneNumber) obj;
if ((this.dianhuahaoma.equals(temp.dianhuahaoma)) && (this.kuozhan.equals(temp.kuozhan)) && (this.quhao.equals(temp.quhao))) { //对比对象里面的内容是否一致
return true;
}
else{
return false;
}
}
注:重写这种 object类方法时,要注意
自反性, 对称性, 传递性, 一致性, 非空性。
x.equals(x) x.equals(y) x—z;y—z;则x—z 多次调用不出错 对于空值返回false;
小技巧: 字符串或者字节数组中,可用 变量名.getBytes().length; 来获取字符串的长度。
(2)。Hashcode(); 为了支持hash运算;eg: hashmap等。
注:一般重写了equals()方法,则hashcode()方法也要重写。
小技巧:因为这个方法经常和equals方法配对出现,所以为了区分开不同的对象,让它们拥有独立的值;可以在声明实例变量时,多加一个变量用于区分它们, 例如:
class PhoneNumber implements Cloneable{
private String quhao;
private String dianhuahaoma;
private String kuozhan;
public PhoneNumber(String dianhuahaoma, String kuozhan, String quhao){
this.dianhuahaoma = dianhuahaoma;
this.kuozhan = kuozhan;
this.quhao = quhao;
}
public int hashcode(){
int result = 17;
result = result * 37 + quhao.length();
result = result * 37 + dianhuahaoma.length();
result = result * 37 + kuozhan.length();
return result;
}
}
如果这么声明实例变量,则当两个电话号码的三个部分全是一样时,则会出现hashcode同值的情况( result会传回相同的值 ),为了避免这种情况,可以多声明一个变量,在构造这个对象时,传入这个对象特有的这个变量值:
class PhoneNumber implements Cloneable{
private String quhao;
private String dianhuahaoma;
private String kuozhan;
private String index;
public PhoneNumber(String dianhuahaoma, String kuozhan, String quhao, String index){
this.dianhuahaoma = dianhuahaoma;
this.kuozhan = kuozhan;
this.quhao = quhao;
this.index = index;
}
public int hashcode(){
int result = 17;
result = result * 37 + quhao.length();
result = result * 37 + dianhuahaoma.length();
result = result * 37 + kuozhan.length();
result = result * 37 + index.getBytes().length;
return result;
}
}
这样就能区分开不同的对象的hashcode了。
(3).toString()方法: 当比如System.out.println(e2),则JVM会自动调用其
(此方法是对其对象的描述)
toString()方法。
默认实现形式:getClass().getName() + ‘@’ + Integer.toHexString(hashcode())
Eg:
public String toString(){
return this.getClass().getName()+'@'+Integer.toHexString(hashCode());
}
(4). Clone()方法: 支持对象的克隆。
使用: PhoneNumber pn = new PhoneNumber();
PhoneNumber pn1 = pn.clone();
Eg:
Protected Object clone() throws CloneNotSupportedException {
Super.clone();
PhoneNumber result = new PhoneNumber();
result.setDianhuahaoma(this.dianhuahaoma);//调用其设置方法set方法
result.setKuozhan(this.kuozhan);
result.setQuhao(this.quhao);
return result; // 前面定义时要求返回的是object类型的,但是这里返//回的是其子类型,这个是允许的(向上转型)。
}
使用clone()方法时,JVM会强制要求将clone()方法放在Try块中。
Public static void main(String[] args){
PhoneNumber e0 = new PhoneNumber();
Try{
PhoneNumber e1 = (PhoneNumber)e0.clone();
}catch(CloneNotSupportedException e){
System.out.println(“…..”);
}
}
在此方法所在的类的定义时,要增加implements Cloneable ,
Eg: class PhoneNumber implements Cloneable{ //想使用clone()方法一定要实现这个接口
//Cloneable接口里是没有任何内容的,但还是要实现它。
Protected Object clone() throws CloneNotSupportedException {
Super.clone();
PhoneNumber result = new PhoneNumber();
Result.setDianhuahaoma(this.dianhuahaoma);//调用其设置方法set方法
result.setKuozhan(this.kuozhan);
result.setQuhao(this.quhao);
return result;
}
}
注:克隆出来的:内容一样, 地址不同
x.equals(x.clone()); x != x.clone();
这个方法的其中一个作用:可以把一个不愿给其对象的东西,克隆一下给另一个人。
(5). Finalize()方法;垃圾回收;
在垃圾回收器在准备要收回某个内存块之前,会去调用它,而且只调用一次,但这个时间不确定,只能保证去调用一次。
作法:一般在重写时,在最前面写一句super.finalize();把父类的先回收。
轻松一下: 用语排序的接口为Comparable。
重写其中的方法compareTo(T o), 与之前的equals类似。(如想练习,可参照equals方法的例子)
以上所写的Object类中的五种方法在需要写一个通用的Class时,非常有必要去重写它们,然后再考虑自己的的特有方法。