雷火电竞-中国电竞赛事及体育赛事平台

歡迎來(lái)到入門(mén)教程網(wǎng)!

Java編程

當(dāng)前位置:主頁(yè) > 軟件編程 > Java編程 >

Java編程復(fù)用類(lèi)代碼詳解

來(lái)源:本站原創(chuàng)|時(shí)間:2020-01-10|欄目:Java編程|點(diǎn)擊:

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

看了老羅羅升陽(yáng)的專(zhuān)訪,情不自禁地佩服,很年輕,我之前以為和羅永浩一個(gè)級(jí)別的年齡,也是見(jiàn)過(guò)的不是初高中編程的一位大牛之一,專(zhuān)訪之后,發(fā)現(xiàn)老羅也是一步一個(gè)腳印的人。別說(shuō)什么難做,做不了,你根本就沒(méi)去嘗試,也沒(méi)有去堅(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ù)用類(lèi)這標(biāo)題剛開(kāi)始很難懂,后面專(zhuān)門(mén)去看了書(shū)的英文原版,其實(shí)標(biāo)題是reusing classes,重新使用類(lèi),其實(shí)復(fù)用就是“利用現(xiàn)成的東西”的意思,其實(shí)實(shí)現(xiàn)的兩種方法就是java中經(jīng)常聽(tī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沒(méi)有初始化,為null,不能調(diào)用show的方法。

組合的作用強(qiáng)大,以面向?qū)ο罂?,假如你在造一個(gè)Car類(lèi),那么你可以用組合輕易的將Glass,Light,Engine等等的Car這些部件組合起來(lái)。

(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è)包訪問(wèn)權(quán)限的問(wèn)題,假如沒(méi)有加public的時(shí)候,默認(rèn)是包內(nèi)成員訪問(wèn),不同包訪問(wèn),即Son中的Father成員訪問(wèn)get方法是不可見(jiàn)的。而public的話是可見(jiàn)的,所以i訪問(wèn)得到。

private部分是不能繼承,屬于父類(lèi)私有,而public的部分,將繼承,需要修改的方法,可以進(jìn)行重寫(xiě)。要添加的屬性可以單獨(dú)添加。

而且繼承的方法,如果原本的father的public方法重寫(xiě)之后沒(méi)將public加上,會(huì)有Cannot reduce the visibility of the inherited method from Father,也就是不能減少父類(lèi)中繼承方法的可見(jiàn)性。super指的是父類(lèi),即Father。

還有一點(diǎn)是,其實(shí)java中所有的類(lèi)都隱式地繼承了Object類(lèi)。Object是父類(lèi),其他類(lèi)是子類(lèi)
老外喜歡講為基類(lèi)。子類(lèi)也叫導(dǎo)出類(lèi)或者派生類(lèi)。

(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è)類(lèi)了,那我們可以使用FatherProxy這樣的代理類(lèi),我自己定義好get方法是怎么拿的,我自己知道是調(diào)用father的get方法,但是使用我這個(gè)代理的人不知道,我只告訴他你要用就用代理的get的方法就可以了。封裝性就體現(xiàn)出來(lái)了。上面只是隨便敲的一個(gè)簡(jiǎn)單例子。

(4)重寫(xiě)和重載

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)楦割?lèi)沒(méi)有該方法,不是重寫(xiě) 
  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); 
  } 
} 

重寫(xiě)是重新覆蓋父類(lèi)的方法,如果沒(méi)有重寫(xiě)或者重載,那么子類(lèi)調(diào)用一個(gè)子類(lèi)沒(méi)有的方法時(shí),其實(shí)是調(diào)用父類(lèi)。

重載是同樣的方法名,但參數(shù)名稱(chēng)不同,為了防止你錯(cuò)誤的進(jìn)行重載可以加上@Override標(biāo)簽,那樣會(huì)提示你并沒(méi)有重寫(xiě)方法。

(5)protected

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

在前面一篇提前寫(xiě)了,因?yàn)橹皼](méi)講繼承的東西。

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

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

加上final關(guān)鍵字的基本類(lèi)型,表示這個(gè)變量初始化后不會(huì)改變。類(lèi)似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; 無(wú)法賦予新值 因?yàn)橹抵挥性诜椒▊鲄Q定  對(duì)象引用和這個(gè)類(lèi)似 
    //age ++;    無(wú)法改變 
  } 
} 

static本來(lái)是靜態(tài)初始化,和final一起用就是占據(jù)了一塊不能改變的存儲(chǔ)空間。

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

static final VALUE_ONE = 1; 

final修飾方法時(shí)

public class Print { 
  final void cannotprint(){ 
    System.out.println(1); 
  } 
} 
 
public class PrintSon extends Print{ 
  //void cannotprint(){} 
  //無(wú)法重寫(xiě) 因?yàn)楸籪inal修飾了 
   
  public static void main(String[] args) { 
    PrintSon ps = new PrintSon(); 
    ps.cannotprint(); 
  } 
} 

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

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

  • public,公共財(cái)產(chǎn),不止是子類(lèi),其他類(lèi)也可以用。
  • final,祖?zhèn)髡鋵?,留給子類(lèi),但不允許修改。
  • private,父類(lèi)私有財(cái)產(chǎn),不會(huì)給子類(lèi)繼承。
  • protected,父類(lèi)專(zhuān)門(mén)留給子類(lèi)的財(cái)產(chǎn),其他人不能用它。

當(dāng)final修飾的是類(lèi)的時(shí)候,是為了讓這個(gè)類(lèi)不會(huì)被繼承。

(7)繼承和初始化

這里的順序問(wèn)題是一個(gè)很有趣的問(wèn)題??蠢?。

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沒(méi)有,結(jié)果是s,first嗎?

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

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

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

總結(jié)

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

上一篇:Java編程guava RateLimiter實(shí)例解析

欄    目:Java編程

下一篇:Java編程實(shí)現(xiàn)計(jì)算兩個(gè)日期的月份差實(shí)例代碼

本文標(biāo)題:Java編程復(fù)用類(lèi)代碼詳解

本文地址:http://www.jygsgssxh.com/a1/Javabiancheng/8361.html

網(wǎng)頁(yè)制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語(yǔ)言數(shù)據(jù)庫(kù)服務(wù)器

如果侵犯了您的權(quán)利,請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有