Java基礎知識2

一、構造函數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)反序列化

五、回調函數

利用接口與類實現實現相似指針的效果:定義一個接口,在接口中聲明要調用的方法,接着實現這個接口,最後把實現接口類的對象做爲參數傳遞給調用程序,調用程序經過參數來調用指定的函數,從而實現接口回調。

相關文章
相關標籤/搜索