JAVA static、final、interface、abstract

一、 static表示「全局」或者「靜態」的意思,用來修飾成員變量和成員方法,也能夠造成靜態static代碼塊。被static修飾的成員變量和成員方法獨立於該類的任何對象使用公共內存空間。 java

用public修飾的static成員變量和成員方法本質是全局變量和全局方法,當聲明它類的對象時,不生成static變量的副本,而是類的全部實例共享同一個static變量。在外部調用靜態方法時,可以使用「類名.方法名」也可使用「對象名。方法名」的方式,即調用靜態方法能夠無需建立對象。 this

 static變量前能夠有private修飾,表示這個變量能夠在類的靜態代碼塊中,或者類的其餘靜態成員方法中使用(固然也能夠在非靜態成員方法中使用),可是不能在其餘類中經過類名來直接引用,這一點很重要。實際上你須要搞明白,private是訪問權限限定, static表示不要實例化就可使用,這樣就容易理解多了。static前面加上其它訪問權限關鍵字的效果也以此類推。
 
        static修飾的成員變量和成員方法習慣上稱爲靜態變量和靜態方法,能夠直接經過類名來訪問,訪問語法爲:
類名.靜態方法名(參數列表...) 
類名.靜態變量名
        用static修飾的代碼塊表示靜態代碼塊,當Java虛擬機(JVM)加載類時,就會執行該代碼塊(用處很是大,呵呵)。
 
一、static變量
        按照是否靜態的對類成員變量進行分類可分兩種:一種是被static修飾的變量,叫靜態變量或類變量;另外一種是沒有被static修飾的變量,叫實例變量。二者的區別是:
        對於靜態變量在內存中只有一個拷貝(節省內存),JVM只爲靜態分配一次內存,在加載類的過程當中完成靜態變量的內存分配,可用類名直接訪問(方便),固然也能夠經過對象來訪問(可是這是不推薦的)。
        對於實例變量,沒建立一個實例,就會爲實例變量分配一次內存,實例變量能夠在內存中有多個拷貝,互不影響(靈活)。
 
二、靜態方法
        靜態方法能夠直接經過類名調用,任何的實例也均可以調用,所以靜態方法中不能用this和super關鍵字,不能直接訪問所屬類的實例變量和實例方法(就是不帶static的成員變量和成員成員方法),只能訪問所屬類的靜態成員變量和成員方法。由於實例成員與特定的對象關聯!這個須要去理解,想明白其中的道理,不是記憶!!!
        由於static方法獨立於任何實例,所以static方法必須被實現,而不能是抽象的abstract。
 
三、static代碼塊
        static代碼塊也叫靜態代碼塊,是在類中獨立於類成員的static語句塊,能夠有多個,位置能夠隨便放,它不在任何的方法體內,JVM加載類時會執行這些靜態的代碼塊,若是static代碼塊有多個,JVM將按照它們在類中出現的前後順序依次執行它們,每一個代碼塊只會被執行一次。

二、final關鍵字能夠用來修飾類、方法、變量。各有不一樣。 spa

A、修飾類(class)。 
     一、該類不能被繼承。 
     二、類中的方法不會被覆蓋,所以默認都是final的。 
     三、用途:設計類時,若是該類不須要有子類,沒必要要被擴展,類的實現細節不容許被改變,那麼就設計成final類
設計

B、修飾方法(method) 
     一、該方法能夠被繼承,可是不能被覆蓋。 
     二、用途:一個類不容許子類覆蓋該方法,則用final來修飾 
     三、好處:能夠防止繼承它的子類修改該方法的意義和實現;更爲高效,編譯器在遇到調用fianal方法轉入內嵌機制,提升了執行效率。 
     四、注意:父類中的private成員方法不能被子類覆蓋,所以,private方法默認是final型的(能夠查看編譯後的class文件)
code

C、修飾變量(variable) 
     一、用final修飾後變爲常量。包括靜態變量、實例變量和局部變量這三種。 
     二、特色:能夠先聲明,不給初值,這種叫作final空白。可是使用前必須被初始化。一旦被賦值,將不能再被改變。
對象

D、修飾參數(arguments) 
     一、用final修飾參數時,能夠讀取該參數,可是不能對其做出修改。
繼承

A、抽象類(abstract class) 
     一、抽象方法(abstract method):不含方法體的方法,它由繼承它子類根據需求去實現,必須用abstract修飾。此外,該方法必須對子類可見,所以要加只能加public 或者 protected!。 
     二、抽象類:至少包含一個抽象方法的類(能夠包含非抽象方法)。必須用abstract修飾。 
     三、特色:抽象類不能被實例化(也就是不能new對象);含有抽象方法的類必須聲明爲抽象類;一個類只有實現了抽象類中的全部方法才能被實例化,不然它依然是抽象類。
接口

B、接口(interface) 
     一、接口定義:抽象方法和常量值的集合(全部的方法都是抽象方法)。它是一種特殊的抽象類(會生成一個xxx.class文件,編譯器會自動在interface關鍵字前加上abstract)。
     二、特色: 
          a、接口裏的常量默認都是public static final來修飾的(若是什麼都不寫,編譯器會自動幫你寫上)。 
          b、接口裏的方法默認都是public abstract來修飾的(若是是什麼都不寫,編譯器會自動幫你寫上)。 
          c、能夠用extends繼承已有的接口。 
          d、一個類,能夠用implements實現一個或多個接口中的全部方法(包括這個接口的父接口中的方法)。 
          e、一個抽象類,能夠implements實現接口中的
部分方法 
         
f、一個類,能夠extends一個父類的同時implements多個接口,可是extends關鍵字必須在implements關鍵字以前
內存



三、Java抽象類和抽象方法: get

<span style="font-size:18px;">package OOTest;
public abstract class Human {//抽象父類
	private final int time=++count;//對象計數器
	private static int count;//靜態池
	//屬性封裝
	private String name;//封裝三步:隱藏屬性,提供getter與setter方法,構造中調用setter初始化
	private int age;
	private String sex;
	
	//getter&&setter
	public String getName(){
		return this.name;
	}
	public void setName(String name){
		//處理代碼:姓名不能爲空,且不能包含數字
		if(name.length()==0){
			System.out.println("姓名不能爲空");
		}
		else if(this.isWrongName(name)){//調用私有方法處理
			System.out.println("非法姓名,不能包含數字");
		}
		else{
			this.name=name;
		}
	}
	private boolean isWrongName(String name){//判斷非法姓名輸入(私有)
		char[] ch=name.toCharArray();
			for(int i=0;i<ch.length;i++){
				try{
					int s=Integer.parseInt(String.valueOf(ch[i]));
					s++;//廢
					return true;
				}
				catch(Exception e){
					continue;//出錯就繼續下一次循環轉換
				}
				}
		return false;//先返回錯誤
	}
	public int getAge(){
		return this.age;
	}
	public void setAge(int age){
		if(age<=0){
			System.out.println("年齡有誤");
		}
		else{
			this.age=age;
		}
	}
	public String getSex(){
		return this.sex;
	}
	public void setSex(String sex){
		if(sex.length()>1||sex.length()==0){
			System.out.println("性別設定錯誤");
		}
		else if(sex.toCharArray()[0]=='男'||sex.toCharArray()[0]=='女'){
			this.sex=sex;
		}
		else{
			System.out.println("性別設定錯誤");
		}
	}

	//構造
	public Human(){//無參
		this("無1名氏",25,"男");
	}
	public Human(String name,int age,String sex){//全參
		this.setName(name);
		this.setAge(age);
		this.setSex(sex);
	}

	//抽象方法
	public abstract void speak();//說話
	public abstract void work();//工做
	public abstract void eat();
	
	//獲取對象建立數目
	public int getHumanClassUseTimes(){
		return this.time;
	}
}
</span>
相關文章
相關標籤/搜索