您的位置:首页 > 编程语言 > Java开发

我的java学习笔记(1)不按时间顺序

2007-09-18 22:47 411 查看
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时,非常有必要去重写它们,然后再考虑自己的的特有方法。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息