Java編程復(fù)用類代碼詳解
本文研究的主要是Java編程中的復(fù)用類,那么到底復(fù)用類是什么東西,又有什么用法,下面具體介紹。
看了老羅羅升陽的專訪,情不自禁地佩服,很年輕,我之前以為和羅永浩一個(gè)級(jí)別的年齡,也是見過的不是初高中編程的一位大牛之一,專訪之后,發(fā)現(xiàn)老羅也是一步一個(gè)腳印的人。別說什么難做,做不了,你根本就沒去嘗試,也沒有去堅(jiān)持。
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.
復(fù)用類這標(biāo)題剛開始很難懂,后面專門去看了書的英文原版,其實(shí)標(biāo)題是reusing classes,重新使用類,其實(shí)復(fù)用就是“利用現(xiàn)成的東西”的意思,其實(shí)實(shí)現(xiàn)的兩種方法就是java中經(jīng)常聽到的——組合和繼承。
(1)組合
has-a的作用。
public class TV { Show show; public String toString(){ return "showgirl"; } } class Show{ }
提一下toString方法,當(dāng)你需要String而你是一個(gè)對(duì)象的時(shí)候,編譯器會(huì)調(diào)用對(duì)象的toString方法。
TV里有Show,現(xiàn)在的show沒有初始化,為null,不能調(diào)用show的方法。
組合的作用強(qiáng)大,以面向?qū)ο罂矗偃缒阍谠煲粋€(gè)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"); } }
這里有個(gè)包訪問權(quán)限的問題,假如沒有加public的時(shí)候,默認(rèn)是包內(nèi)成員訪問,不同包訪問,即Son中的Father成員訪問get方法是不可見的。而public的話是可見的,所以i訪問得到。
private部分是不能繼承,屬于父類私有,而public的部分,將繼承,需要修改的方法,可以進(jìn)行重寫。要添加的屬性可以單獨(dú)添加。
而且繼承的方法,如果原本的father的public方法重寫之后沒將public加上,會(huì)有Cannot reduce the visibility of the inherited method from Father,也就是不能減少父類中繼承方法的可見性。super指的是父類,即Father。
還有一點(diǎn)是,其實(shí)java中所有的類都隱式地繼承了Object類。Object是父類,其他類是子類
老外喜歡講為基類。子類也叫導(dǎo)出類或者派生類。
(3)代理
設(shè)計(jì)模式里面有個(gè)比較難懂的——代理模式,作者講的很有趣,代理是組合和繼承的中庸之道。
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當(dāng)做成員,那么father的方法就暴露給這個(gè)類了,那我們可以使用FatherProxy這樣的代理類,我自己定義好get方法是怎么拿的,我自己知道是調(diào)用father的get方法,但是使用我這個(gè)代理的人不知道,我只告訴他你要用就用代理的get的方法就可以了。封裝性就體現(xiàn)出來了。上面只是隨便敲的一個(gè)簡(jiǎn)單例子。
(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 //會(huì)有錯(cuò)誤提示 因?yàn)楦割悰]有該方法,不是重寫 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); } }
重寫是重新覆蓋父類的方法,如果沒有重寫或者重載,那么子類調(diào)用一個(gè)子類沒有的方法時(shí),其實(shí)是調(diào)用父類。
重載是同樣的方法名,但參數(shù)名稱不同,為了防止你錯(cuò)誤的進(jìn)行重載可以加上@Override標(biāo)簽,那樣會(huì)提示你并沒有重寫方法。
(5)protected
Java編程訪問權(quán)限的控制代碼詳解
在前面一篇提前寫了,因?yàn)橹皼]講繼承的東西。
可以簡(jiǎn)單將protected看成父類給兒子繼承的遺產(chǎn),其他非繼承類不能訪問。
(6)final關(guān)鍵字
加上final關(guān)鍵字的基本類型,表示這個(gè)變量初始化后不會(huì)改變。類似c的define,你希望一個(gè)變量在這個(gè)程序里就是這個(gè)值不需要改變。就可以用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; //雖然引用恒定不變,但是,對(duì)象本身卻可以改變。 } void change(final int c){ // c= this.age; 無法賦予新值 因?yàn)橹抵挥性诜椒▊鲄Q定 對(duì)象引用和這個(gè)類似 //age ++; 無法改變 } }
static本來是靜態(tài)初始化,和final一起用就是占據(jù)了一塊不能改變的存儲(chǔ)空間。
static final即編譯期常量,常量名按照c的常量命名傳統(tǒng),全部用大寫字母,單詞之間用下劃線分開。
static final VALUE_ONE = 1;
final修飾方法時(shí)
public class Print { final void cannotprint(){ System.out.println(1); } } public class PrintSon extends Print{ //void cannotprint(){} //無法重寫 因?yàn)楸籪inal修飾了 public static void main(String[] args) { PrintSon ps = new PrintSon(); ps.cannotprint(); } }
可以看成父類要求子類必須繼承的不可修改財(cái)產(chǎn)(祖?zhèn)鳎?。private隱式地指定為final,因?yàn)閜rivate根本就不給你繼承。這比給你繼承但不能修改還更私有。
順便將權(quán)限理清。
- public,公共財(cái)產(chǎn),不止是子類,其他類也可以用。
- final,祖?zhèn)髡鋵?,留給子類,但不允許修改。
- private,父類私有財(cái)產(chǎn),不會(huì)給子類繼承。
- protected,父類專門留給子類的財(cái)產(chǎn),其他人不能用它。
當(dāng)final修飾的是類的時(shí)候,是為了讓這個(gè)類不會(huì)被繼承。
(7)繼承和初始化
這里的順序問題是一個(gè)很有趣的問題。看例子。
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"); } }
打印的結(jié)果是first嗎?錯(cuò)了。
雖然執(zhí)行的是main方法,但是看到son這個(gè)需要靜態(tài)初始化的i沒有,結(jié)果是s,first嗎?
這還有初始化的問題,son是繼承father,那么編譯器會(huì)加載father,并初始化i,那father繼承g(shù)randfather,那么編譯器會(huì)去加載grandfather,類似遞歸。
那最后最先初始化的是grandfather的i。
所以最后的結(jié)果是:g,f,s,first。
總結(jié)
以上就是本文關(guān)于Java編程復(fù)用類代碼詳解的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!
上一篇:Java編程guava RateLimiter實(shí)例解析
欄 目:Java編程
下一篇:Java編程實(shí)現(xiàn)計(jì)算兩個(gè)日期的月份差實(shí)例代碼
本文標(biāo)題:Java編程復(fù)用類代碼詳解
本文地址:http://mengdiqiu.com.cn/a1/Javabiancheng/8361.html
您可能感興趣的文章
- 01-10Java咖啡館(1)——嘆咖啡
- 01-10Java Socket編程(三) 服務(wù)器Sockets
- 01-10Java進(jìn)階:Struts多模塊的技巧
- 01-10Java Socket編程(一) Socket傳輸模式
- 01-10Java Socket編程(二) Java面向連接的類
- 01-10Java運(yùn)行時(shí)多態(tài)性的實(shí)現(xiàn)
- 01-10Java經(jīng)驗(yàn)點(diǎn)滴:處理沒有被捕獲的異常
- 01-10Java Socket編程(四) 重復(fù)和并發(fā)服務(wù)器
- 01-10Java中的浮點(diǎn)數(shù)分析
- 01-10面向?qū)ο缶幊?Java中的抽象數(shù)據(jù)類型


閱讀排行
- 1C語言 while語句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-10Java咖啡館(1)——嘆咖啡
- 01-10JVM的垃圾回收機(jī)制詳解和調(diào)優(yōu)
- 01-10Java Socket編程(三) 服務(wù)器Sockets
- 01-10Java進(jìn)階:Struts多模塊的技巧
- 01-10J2SE 1.5版本的新特性一覽
- 01-10Java Socket編程(一) Socket傳輸模式
- 01-10Java運(yùn)行時(shí)多態(tài)性的實(shí)現(xiàn)
- 01-10Java Socket編程(二) Java面向連接的類
- 01-10Java Socket編程(四) 重復(fù)和并發(fā)服務(wù)
- 01-10Java經(jīng)驗(yàn)點(diǎn)滴:處理沒有被捕獲的異常
隨機(jī)閱讀
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10delphi制作wav文件的方法
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 04-02jquery與jsp,用jquery
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文