国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > Java > 正文

Java編程復用類代碼詳解

2024-07-13 10:17:17
字體:
來源:轉載
供稿:網友

本文研究的主要是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/244018.html">javascript/297272.html">java/276795.html">java/222461.html">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編程復用類代碼詳解的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 鲁山县| 康定县| 霞浦县| 沁源县| 松桃| 昌宁县| 嵊州市| 新晃| 昭苏县| 沾化县| 贵阳市| 铜川市| 大石桥市| 金阳县| 安仁县| 什邡市| 彭州市| 那坡县| 民县| 潜山县| 新安县| 玉屏| 宁海县| 湾仔区| 凤阳县| 绩溪县| 龙州县| 杂多县| 普陀区| 甘南县| 濮阳市| 怀化市| 信丰县| 福鼎市| 通许县| 锦屏县| 汉源县| 巴里| 崇文区| 丰城市| 博爱县|