Java編程複用類代碼詳解,java編程複用詳解

來源:互聯網
上載者:User

Java編程複用類代碼詳解,java編程複用詳解

本文研究的主要是Java編程中的複用類,那麼到底複用類是什麼東西,又有什麼用法,下面具體介紹。

看了老羅羅昇陽的專訪,情不自禁地佩服,很年輕,我之前以為和羅永浩一個層級的年齡,也是見過的不是初高中編程的一位大牛之一,專訪之後,發現老羅也是一步一個腳印的人。別說什麼難做,做不了,你根本就沒去嘗試,也沒有去堅持。

If you can't fly then run,if you can't run then walk, if you can't walk then crawl,but
whatever you do,you have to keep moving forward——Martin Luther King.

複用類這標題剛開始很難懂,後面專門去看了書的英文原版,其實標題是reusing classes,重新使用類,其實複用就是“利用現成的東西”的意思,其實實現的兩種方法就是java中經常聽到的——組合和繼承。

(1)組合

has-a的作用。

public class TV {   Show show;   public String toString(){    return "showgirl";   } }  class Show{ } 

提一下toString方法,當你需要String而你是一個對象的時候,編譯器會調用對象的toString方法。

TV裡有Show,現在的show沒有初始化,為null,不能調用show的方法。

組合的作用強大,以物件導向看,假如你在造一個Car類,那麼你可以用組合輕易的將Glass,Light,Engine等等的Car這些組件組合起來。

(2)繼承

is-a

package com.myown.iaiti;public class Father {public int i;void get(){System.out.println("father");}}package son;import com.myown.iaiti.*;public class Son extends Father{Father f = new Father();int j = f.i;Son son = new Son();son.get();}public void get(){super.get();System.out.println("son");}}

這裡有個包存取權限的問題,假如沒有加public的時候,預設是包內成員訪問,不同包訪問,即Son中的Father成員訪問get方法是不可見的。而public的話是可見的,所以i訪問得到。

private部分是不能繼承,屬於父類私人,而public的部分,將繼承,需要修改的方法,可以進行重寫。要添加的屬性可以單獨添加。

而且繼承的方法,如果原本的father的public方法重寫之後沒將public加上,會有Cannot reduce the visibility of the inherited method from Father,也就是不能減少父類中繼承方法的可見度。super指的是父類,即Father。

還有一點是,其實java中所有的類都隱式地繼承了Object類。Object是父類,其他類是子類
老外喜歡講為基類。子類也叫匯出類或者衍生類別。

(3)代理

設計模式裡面有個比較難懂的——代理模式,作者講的很有趣,代理是組合和繼承的中庸之道。

package son; class Father{   public void get(){     System.out.println("father");   } } public class Son extends Father{   public static void main(String[] args) {     Father f = new Father();     f.get();   } }  class FatherProxy{   private Father f = new Father();   public void get(){     f.get();   } } 

像直接把Father當做成員,那麼father的方法就暴露給這個類了,那我們可以使用FatherProxy這樣的代理類,我自己定義好get方法是怎麼拿的,我自己知道是調用father的get方法,但是使用我這個代理的人不知道,我只告訴他你要用就用代理的get的方法就可以了。封裝性就體現出來了。上面只是隨便敲的一個簡單例子。

(4)重寫和重載

class Father{   public void get(String s){     System.out.println("father");   }      public void get(boolean b){     System.out.println("boolean");   } } public class Son extends Father{   @Override   public void get(String s){     System.out.println("father");   }      // @Override //會有錯誤提示 因為父類沒有該方法,不是重寫   public void get(int i ){     System.out.println("sonint");   }      public static void main(String[] args) {     Son s = new Son();     s.get("d");     s.get(false);     s.get(1);   } } 

重寫是重新覆蓋父類的方法,如果沒有重寫或者重載,那麼子類調用一個子類沒有的方法時,其實是調用父類。

重載是同樣的方法名,但參數名稱不同,為了防止你錯誤的進行重載可以加上@Override標籤,那樣會提示你並沒有重寫方法。

(5)protected

Java編程存取權限的控制碼詳解

在前面一篇提前寫了,因為之前沒講繼承的東西。

可以簡單將protected看成父類給兒子繼承的遺產,其他非繼承類不能訪問。

(6)final關鍵字

加上final關鍵字的基本類型,表示這個變數初始化後不會改變。類似c的define,你希望一個變數在這個程式裡就是這個值不需要改變。就可以用final。

public class Son{   int age = 2;   public static void main(String[] args) {          final int i = 1;     // i = 2; 值不能再改變     final Son son = new Son();     // son = new Son();     //The final local variable son cannot be assigned.      //It must be blank and not using a compound assignment     //final修飾的局部變數son不能被分配,必須為空白或者不要再次分配          son.age = 4;     //雖然引用恒定不變,但是,對象本身卻可以改變。   }      void change(final int c){     // c= this.age; 無法賦予新值 因為值只有在方法傳參決定  對象引用和這個類似     //age ++;    無法改變   } } 

static本來是靜態初始化,和final一起用就是佔據了一塊不能改變的儲存空間。

static final即編譯期常量,常量名按照c的常量命名傳統,全部用大寫字母,單詞之間用底線分開。

static final VALUE_ONE = 1; 

final修飾方法時

public class Print {   final void cannotprint(){     System.out.println(1);   } }  public class PrintSon extends Print{   //void cannotprint(){}   //無法重寫 因為被final修飾了      public static void main(String[] args) {     PrintSon ps = new PrintSon();     ps.cannotprint();   } } 

可以看成父類要求子類必須繼承的不可修改財產(祖傳)。private隱式地指定為final,因為private根本就不給你繼承。這比給你繼承但不能修改還更私人。

順便將許可權理清。

  • public,公用財產,不止是子類,其他類也可以用。
  • final,祖傳珍寶,留給子類,但不允許修改。
  • private,父類私人財產,不會給子類繼承。
  • protected,父類專門留給子類的財產,其他人不能用它。

當final修飾的是類的時候,是為了讓這個類不會被繼承。

(7)繼承和初始化

這裡的順序問題是一個很有趣的問題。看例子。

class GrandFather{   private static int i = print();   private static int print(){     System.out.println("g");     return 1;   } } class Father extends GrandFather{   private static int i = print();   private static int print(){     System.out.println("f");     return 1;   } } public class Son extends Father{   private static int i = print();   private static int print(){     System.out.println("s");     return 1;   }   public static void main(String[] args) {     System.out.println("first");   } } 

列印的結果是first嗎?錯了。

雖然執行的是main方法,但是看到son這個需要靜態初始化的i沒有,結果是s,first嗎?

這還有初始化的問題,son是繼承father,那麼編譯器會載入father,並初始化i,那father繼承grandfather,那麼編譯器會去載入grandfather,類似遞迴。

那最後最先初始化的是grandfather的i。

所以最後的結果是:g,f,s,first。

總結

以上就是本文關於Java編程複用類代碼詳解的全部內容,希望對大家有所協助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支援!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.