一、構造函數java
一般用來在對象實例化時初始化對象的成員變量。函數
1)構造函數必須與類的名字相同,而且不能有返回值(也不能返回void)this
2)每一個類都有一個默認的無參構造函數,修飾符只與所在的class有關(類爲class,構造函數也是class)。一個類能夠有多個構造函數,構造函數能夠有n個參數,便可以被重載。spa
3)構造函數伴隨着new一個類的時候一塊兒調用。指針
4)構造函數不能被繼承,所以不能被覆蓋。code
二、接口對象
因爲Java不支持多重繼承,爲了克服單繼承的缺點,引入了接口,能夠實現多個接口的方式間接達到多重繼承的目的。繼承
接口中成員的做用域修飾符都是public,常量值默認使用public static final修飾。接口中只包含方法的定義不包括方法的實現。接口
Java語言中有些接口內部並無聲明任何方法,此種接口又叫標識接口,僅有標識做用相似汽車的標誌圖標,人們看到圖標就知道是哪款車,目前Java類庫中存在的標識接口有Cloneable,Serializable等。作用域
三、clone()
protected Object clone()
throws CloneNotSupportedException
繼承自Object的clone()方法返回Object對象的新對象,不是引用。
深複製和淺複製:
淺複製:不復制對象的引用,即對象的引用仍指向原來的值,如b複製a,則a,b仍指向同一個存儲空間,改變其中一個的值另外一個也會跟着改變。
深複製:在對對象調用clone()完成複製後,對對象中非基本類型的方法等clone().如Obje.java中對getBirth()進行clone()。
淺複製:
package Four; class Obj implements Cloneable{ private int aInt = 0; public int getInt(){ return aInt; } public void changeInt(){ this.aInt = 1; } public Object clone(){ Object o = null; try{ o = (Object)super.clone(); }catch(CloneNotSupportedException e){ e.printStackTrace(); } return o; } } public class CloneTest { public static void main(String[] args){ Obj a = new Obj(); //Creates and return a copy of this Object Obj b = (Obj)a.clone();//如果 Obj b = a;則changeInt()不會改變aInt的值,此時b是a的引用 Obj c = a; b.changeInt(); System.out.println("a: "+a.getInt()); System.out.println("b: " + b.getInt()); System.out.println("c: " + c.getInt()); } }/* a: 0 b: 1 c: 0*/
深複製:
package Four; //深複製 import java.util.Calendar; class Obje implements Cloneable{ Calendar date = Calendar.getInstance();//類中包含對象(即非基本類型,須要深度複製) public Calendar getBirth(){ return date; } public void setBirth(Calendar date){ this.date = date; } public void changeDate(){ // Calendar.set(Calendar.MONTH, int month). this.date.set(Calendar.MONTH, 5); } public Object clone(){ Obje obj = null; try { obj = (Obje)super.clone(); } catch (CloneNotSupportedException e) { // TODO Auto-generated catch block e.printStackTrace(); } obj.date = (Calendar)this.getBirth().clone();//深複製 return obj; } } public class DeepClone { public static void main(String[] args){ Obje a = new Obje(); Obje b = (Obje)a.clone(); b.changeDate(); System.out.println("a = "+a.getBirth()); System.out.println("b = " + b.getBirth()); } } /*若是不對getBirth()進行clone()則輸出a,b的Month都改變,輸出5,深複製後只有b的Month改變了*/
四、反射機制(待補充)
Java語言一個很是重要的特性,容許程序在運行時進行自我檢查,同時對內部成員進行操做,可以實如今運行時對類進行裝載。
反射機制的功能主要有:獲得一個對象所屬的類:實例.getClass();獲取一個類的全部成員變量和方法;在運行時建立對象;在運行時調用對象的方法。
3種方法獲取到class類:
1)class.forName("Test");//建立一個類的引用
2)類名.class;//每一個類都有一個Class對象,每當編寫並編譯了一個新類,就會產生一個Class對象(保存在一個.class文件中)
3)實例.getClass()
Java中4種建立對象的方法:
1)new語句
2)反射機制
Class c = Class.forName("Test"); Base b = (Base)c.newInstance();
3)clone()
Obje b = (Obje)a.clone();
4)反序列化
五、回調函數
利用接口與類實現實現相似指針的效果:定義一個接口,在接口中聲明要調用的方法,接着實現這個接口,最後把實現接口類的對象做爲參數傳遞給調用程序,調用程序經過參數來調用指定的函數,從而實現接口回調。