欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java編程復用類代碼詳解

 更新時間:2018年01月26日 09:56:03   作者:iaiti  
這篇文章主要介紹了Java編程復用類代碼詳解,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下

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

看了老羅羅升陽的專訪,情不自禁地佩服,很年輕,我之前以為和羅永浩一個級別的年齡,也是見過的不是初高中編程的一位大牛之一,專訪之后,發(fā)現(xià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.

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

(1)組合

has-a的作用。

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

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

TV里有Show,現(xiàn)在的show沒有初始化,為null,不能調(diào)用show的方法。

組合的作用強大,以面向?qū)ο罂矗偃缒阍谠煲粋€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");
}
}

這里有個包訪問權(quán)限的問題,假如沒有加public的時候,默認是包內(nèi)成員訪問,不同包訪問,即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)代理

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

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方法是怎么拿的,我自己知道是調(diào)用father的get方法,但是使用我這個代理的人不知道,我只告訴他你要用就用代理的get的方法就可以了。封裝性就體現(xià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 //會有錯誤提示 因為父類沒有該方法,不是重寫 
  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)用一個子類沒有的方法時,其實是調(diào)用父類。

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

(5)protected

Java編程訪問權(quán)限的控制代碼詳解

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

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

(6)final關(guān)鍵字

加上final關(guān)鍵字的基本類型,表示這個變量初始化后不會改變。類似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本來是靜態(tài)初始化,和final一起用就是占據(jù)了一塊不能改變的存儲空間。

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

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(); 
  } 
} 

可以看成父類要求子類必須繼承的不可修改財產(chǎn)(祖?zhèn)鳎rivate隱式地指定為final,因為private根本就不給你繼承。這比給你繼承但不能修改還更私有。

順便將權(quán)限理清。

  • public,公共財產(chǎn),不止是子類,其他類也可以用。
  • final,祖?zhèn)髡鋵殻艚o子類,但不允許修改。
  • private,父類私有財產(chǎn),不會給子類繼承。
  • protected,父類專門留給子類的財產(chǎn),其他人不能用它。

當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"); 
  } 
} 

打印的結(jié)果是first嗎?錯了。

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

這還有初始化的問題,son是繼承father,那么編譯器會加載father,并初始化i,那father繼承g(shù)randfather,那么編譯器會去加載grandfather,類似遞歸。

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

所以最后的結(jié)果是:g,f,s,first。

總結(jié)

以上就是本文關(guān)于Java編程復用類代碼詳解的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

相關(guān)文章

  • java中動態(tài)代理如何實現(xiàn)詳解

    java中動態(tài)代理如何實現(xiàn)詳解

    動態(tài)代理是基于接口實現(xiàn)的代理,mybatis就是用這個技術(shù)實現(xiàn)的,下面這篇文章主要給大家介紹了關(guān)于java中動態(tài)代理如何實現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • spring boot下mybatis配置雙數(shù)據(jù)源的實例

    spring boot下mybatis配置雙數(shù)據(jù)源的實例

    這篇文章主要介紹了spring boot下mybatis配置雙數(shù)據(jù)源的實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • scala當中的文件操作和網(wǎng)絡(luò)請求的實現(xiàn)方法

    scala當中的文件操作和網(wǎng)絡(luò)請求的實現(xiàn)方法

    這篇文章主要介紹了scala當中的文件操作和網(wǎng)絡(luò)請求的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-06-06
  • spring boot 下對JSON返回值去除null和空字段操作

    spring boot 下對JSON返回值去除null和空字段操作

    這篇文章主要介紹了spring boot 下對JSON返回值去除null和空字段操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • Java報錯Java.text.ParseException的解決方法匯總

    Java報錯Java.text.ParseException的解決方法匯總

    在Java開發(fā)的復雜世界中,錯誤處理是開發(fā)者必須面對的關(guān)鍵挑戰(zhàn)之一,其中,Java.text.ParseException就像一個隱藏在代碼叢林中的陷阱,常常讓開發(fā)者們陷入困惑,本文給大家介紹了Java報錯Java.text.ParseException的解決方法,需要的朋友可以參考下
    2024-10-10
  • 基于java查找并打印輸出字符串中字符出現(xiàn)次數(shù)

    基于java查找并打印輸出字符串中字符出現(xiàn)次數(shù)

    這篇文章主要介紹了基于java查找并打印輸出字符串中字符出現(xiàn)次數(shù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11
  • 一文帶你真正理解Java中的內(nèi)部類

    一文帶你真正理解Java中的內(nèi)部類

    不知道大家在平時的開發(fā)過程中或者源碼里是否留意過內(nèi)部類,那有思考過為什么要有內(nèi)部類,內(nèi)部類都有哪幾種形式,本篇文章主要帶領(lǐng)大家理解下這塊內(nèi)容
    2022-08-08
  • 在SpringBoot中整合使用Netty框架的詳細教程

    在SpringBoot中整合使用Netty框架的詳細教程

    這篇文章主要介紹了在SpringBoot中整合使用Netty框架的教程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • java正則表達式的應用 java讀取文件并獲取電話號碼

    java正則表達式的應用 java讀取文件并獲取電話號碼

    這篇文章主要介紹了java正則表達式的應用,應用的內(nèi)容是java讀取文件并獲取電話號碼,感興趣的小伙伴們可以參考一下
    2015-11-11
  • 基于Spring整合mybatis的mapper生成過程

    基于Spring整合mybatis的mapper生成過程

    這篇文章主要介紹了Spring整合mybatis的mapper生成過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03

最新評論