java核心技術(shù)基礎(chǔ)知識(shí)

java核心技術(shù)基礎(chǔ)知識(shí)

深圳達(dá)內(nèi)教育      2022-04-22 01:49:01     14

java核心技術(shù)基礎(chǔ)知識(shí),  一、類(lèi)、子類(lèi),超類(lèi)  1、擴(kuò)展一個(gè)子類(lèi)繼承父類(lèi),子類(lèi)的私人領(lǐng)域之間的關(guān)系在一個(gè)由子類(lèi)調(diào)用父類(lèi)沒(méi)有,只有通過(guò)超類(lèi)方法可以訪(fǎng)

課程價(jià)格 請(qǐng)咨詢(xún)

上課時(shí)段: 授課校區(qū):

詳細(xì)介紹

 


 一、類(lèi)、子類(lèi),超類(lèi)


  1、擴(kuò)展一個(gè)子類(lèi)繼承父類(lèi),子類(lèi)的私人領(lǐng)域之間的關(guān)系在一個(gè)由子類(lèi)調(diào)用父類(lèi)沒(méi)有,只有通過(guò)超類(lèi)方法可以訪(fǎng)問(wèn)父類(lèi)的私有部分,可以使用超級(jí)。方法()調(diào)用超類(lèi)的方法,但是超級(jí)不是一個(gè)對(duì)象引用,它只是一個(gè)指示編譯器調(diào)用超類(lèi)方法的特定的關(guān)鍵詞。


  2、使用超級(jí)調(diào)用父類(lèi)的構(gòu)造函數(shù)聲明必須首先一個(gè)子類(lèi)的構(gòu)造函數(shù)聲明。如果子類(lèi)的構(gòu)造函數(shù)沒(méi)有顯式地調(diào)用父類(lèi)的構(gòu)造函數(shù),它會(huì)自動(dòng)調(diào)用父類(lèi)的構(gòu)造函數(shù)默認(rèn)情況下,如果父類(lèi)的構(gòu)造函數(shù)沒(méi)有參數(shù),而在子類(lèi)構(gòu)造函數(shù)和其他沒(méi)有顯式地調(diào)用超類(lèi)的構(gòu)造函數(shù),Java編譯器錯(cuò)誤。學(xué)習(xí),而不是自然讓我想起一個(gè)結(jié)構(gòu):內(nèi)部類(lèi)。個(gè)人覺(jué)得可以把子類(lèi)具有父類(lèi)的繼承關(guān)系的內(nèi)部類(lèi)對(duì)象和結(jié)構(gòu)安全初始化,所有可以使用超級(jí)必要時(shí)。對(duì)象的方法()方法來(lái)訪(fǎng)問(wèn)公共(通常是)直接調(diào)用方法的方法名,如果子類(lèi)覆蓋父類(lèi)的方法,所謂的時(shí)間外,解釋器會(huì)去找子類(lèi)方法以盾牌超類(lèi)對(duì)象。


  3、一個(gè)對(duì)象變量可以引用對(duì)種實(shí)際類(lèi)型的現(xiàn)象被叫做多態(tài),對(duì)象變量遵行置換法則:超類(lèi)對(duì) 象的任何地方都可以用子類(lèi)對(duì)象置換,但是聲明為類(lèi)型為超類(lèi)對(duì)象的變量就算引用了一個(gè)子 類(lèi)的對(duì)象,用該引用還是不能調(diào)用子類(lèi)特有的方法,因?yàn)?quot;超類(lèi)不是子類(lèi)",而"子類(lèi)肯定超類(lèi) "。在運(yùn)行時(shí)能夠自動(dòng)地選擇調(diào)用哪個(gè)方法的現(xiàn)象叫做動(dòng)態(tài)綁定,調(diào)用方法依賴(lài)于隱式參數(shù)的 實(shí)際類(lèi)型,在JAVA5 以前的版本中,要求覆蓋方法的返回類(lèi)型必須是一樣的,而現(xiàn)在允許子 類(lèi)將覆蓋方法的返回類(lèi)型定義為原返回類(lèi)型的子類(lèi)型。


  4、繼承關(guān)系程度,動(dòng)態(tài)綁定方法被調(diào)用過(guò)程是:如果一個(gè)子類(lèi)定義了方法被調(diào)用時(shí),或者需要找到父類(lèi),而不是繼續(xù)尋找類(lèi)。每個(gè)類(lèi)(虛擬機(jī)會(huì)提前為了節(jié)約成本,創(chuàng)建一個(gè)方桌,調(diào)用方法與順序搜索方法表)。子類(lèi)覆蓋父類(lèi)的方法,子類(lèi)方法不能在類(lèi)方法低能見(jiàn)度。


  以上內(nèi)容的例子:


  class MyParentClassA{


  private String str;


  public MyParentClassA(String s){


  str=s; }


  public String getStr(){


  return str;


  }


  }


  class MyParentClassB


  {


  public MyParentClassB(String s){


  super(s);


  }


  }


  public class SuperClassTest extends MyParentClassB


  {


  private String str;


  public SuperClassTest(String s)


  {


  super(s);


  str="this is child";


  }


  public String getStr()


  {


  return super.getStr()+" "+str;


  }


  public void methodTochild()


  {


  }


  public static void main(String args[])


  {


  MyParentClassA[]mpcArray=new MyParentClassA[2];


  mpcArray[0]=new www.123yc.com MyParentClassA("parent");


  mpcArray[1]=new SuperClassTest("parent's child");


  for (MyParentClass m:mpcArray){ System.out.println(m.getStr());


  }


  mpcArray[0].methodTochild();


  //error: parent is not a child


  }


  }



  需要注意的是:


  SuperClassTest []test=new SuperClassTest [2];


  MyParentClass []mpc=test; 這樣做可以通過(guò)編譯,SuperClassTest 是一個(gè) MyParentClass ,但是當(dāng) mpc[0]=new MyParentClass();此時(shí)test[0]和mpc[0]引用同一個(gè)對(duì)象,當(dāng)調(diào)用test[0].methodTochild() 會(huì)導(dǎo)致調(diào)用一個(gè)不存在的實(shí)例域,從而打亂了相鄰存儲(chǔ)空間的內(nèi)容,所以在 mpc[0]=new MyParentClass(原創(chuàng)論文網(wǎng))時(shí)就會(huì)拋出:java.lang.ArrayStoreException,不允許放入子類(lèi)的引用。


  5、final 類(lèi):用來(lái)阻止繼承。final 類(lèi)中的所有方法自動(dòng)變?yōu)?final 的,但是類(lèi)的域不會(huì)。 類(lèi)被聲明為final 就不能被繼承,方法聲明為final 就不能被覆蓋。在設(shè)計(jì)類(lèi)層次的時(shí)候應(yīng) 該仔細(xì)考慮哪些方法和類(lèi)聲明為final。


  6、強(qiáng)制類(lèi)型轉(zhuǎn)型:如果在繼承鏈上進(jìn)行向下的強(qiáng)制轉(zhuǎn)型,并且本來(lái)就不是向下的類(lèi)型,這個(gè) 時(shí)候會(huì)產(chǎn)生ClassCastException 異常。所以在進(jìn)行類(lèi)型轉(zhuǎn)型之前,先要檢查一下是否能夠轉(zhuǎn) 型成功:o instanceof Object,如果x 為null,不會(huì)產(chǎn)生異常,只會(huì)返回false,因?yàn)閚ull 沒(méi)有引用任何對(duì)象。注意當(dāng)需要強(qiáng)制轉(zhuǎn)型的時(shí)候應(yīng)該堅(jiān)持下類(lèi)是否設(shè)計(jì)的合理,是否真的需 要用超類(lèi)的引用去調(diào)用子類(lèi)的方法。


  7、抽象類(lèi):包含一個(gè)抽象方法的類(lèi)本身必須聲明為抽象類(lèi)。其實(shí)抽象方法充當(dāng)著占位的角色, 這樣子類(lèi)實(shí)現(xiàn)該方法,用抽象父類(lèi)的引用可以統(tǒng)一調(diào)用占位的方法。



  二、Object:所有類(lèi)的超類(lèi)


  1、equals,用于檢測(cè)一個(gè)對(duì)象是否等于另外一個(gè)對(duì)象,可以重載,String 就重載了它,只要 內(nèi)容相同就返回true,當(dāng)我們重載equals 時(shí)需要注意以下幾點(diǎn): 自反性 :對(duì)任意引用值X,x.equals(x)的返回值一定為true. 對(duì)稱(chēng)性: 對(duì)于任何引用值x,y,當(dāng)且僅當(dāng)y.equals(x)返回值為true 時(shí),x.equals(y) 的返回值一定為 true;注意如果equals 的語(yǔ)義在每個(gè)子類(lèi)中有所改變,就要用 getClass 檢 測(cè) 傳遞性:如果x.equals(y)=true, y.equals(z)=true,則x.equals(z)=true 一致性:如果參與比較的對(duì)象沒(méi)任何改變,則對(duì)象比較的結(jié)果也不應(yīng)該有任何改變 非空性:任何非空的引用值X,x.equals(null)的返回值一定為false 覆蓋Object 的equals 方法參數(shù)一定是Object 類(lèi)型的。


  2、HashCode 方法:用同樣的內(nèi)容構(gòu)造的String 和StringBuilder 的HashCode 是不同的, 因?yàn)镾tringBuilder 類(lèi)中沒(méi)有定義hashCode 方法,他的散列碼是由Object 的默認(rèn)方法導(dǎo)出的對(duì)象存儲(chǔ)地址(所有沒(méi)有覆蓋HashCode 方法的類(lèi)導(dǎo)出的都是這個(gè))。 Arrays 類(lèi)有靜態(tài)方法hashCode(type[] a),這個(gè)散列碼由數(shù)組元素的散列碼組成。 


       注意:equals 與hashCode 的定義必須一致,如果equals 方法返回true,那么hashCode 就 必須相同,所以hashCode 需要散列的東西要來(lái)自equals 方法里要比較的域。


  3、toString:大部分的類(lèi)的toString 方法遵循這樣的格式:類(lèi)的名子,隨后是一對(duì)方括號(hào) 括起來(lái)的值域。 數(shù)組類(lèi)型按照舊格式打印:[類(lèi)型第一個(gè)字符@地址,所以我們想知道數(shù)組的內(nèi)容要調(diào)用 Arrays 的靜態(tài)方法toString(type[]),多維數(shù)組調(diào)用Arrays.deepToString(type[])。 建議為自定義的每一個(gè)類(lèi)都添加一個(gè)toString 方法。 Object 主要有以上 3 個(gè)重要方法,還有的就是 clone()和 getClass??梢宰⒁獾?Arrays 類(lèi)里都有以上3 個(gè)靜態(tài)方法,所以我們要用數(shù)組調(diào)用的以上3 個(gè)方法時(shí)要用Arrays 的靜態(tài)類(lèi)。



  三、泛型數(shù)組列表


  ArrayList 構(gòu)造方法接受一個(gè) int,用來(lái)設(shè)置初始容量,也可以用 對(duì)象調(diào)用 ensureCapacity(int i)來(lái)設(shè)置初始容量,一旦能夠確認(rèn)數(shù)組列表的大小不再發(fā)生 變化,可以調(diào)用trimToSize 方法,這個(gè)方法將存儲(chǔ)區(qū)域的大小調(diào)整為當(dāng)前元素?cái)?shù)量所需要的 存儲(chǔ)空間數(shù)目,垃圾回收器將回收多余的存儲(chǔ)空間。 add(Object o):添加元素添加到最后,add(int i,Object o)在 i 位置插入一個(gè)新元素; remove(int i)刪除i 位置的元素;size():返回當(dāng)前元素?cái)?shù)量;set(int i,Object o)設(shè)置 第i 個(gè)元素,get(int i)得到到第i 個(gè)元素;toArray 返回一個(gè)包還所有元素的數(shù)組??梢?使用for each 語(yǔ)法。



  四、基本類(lèi)型的包裝器與自動(dòng)打包


  從公共超類(lèi)Number 派生出來(lái)的有:Byte Short Integer Long Float Double;其他的還有:Character Void Boolean。對(duì)象包裝器類(lèi)都是final 的,不能定義他們的子類(lèi),而且一旦構(gòu)造了包裝器,就不允許更改包裝在其中的值。泛型要 用基本類(lèi)型都要用包裝器。 自動(dòng)打包是指在需要int 的地方,編譯器會(huì)自動(dòng)的添加必要的方法調(diào)用,(代寫(xiě)論文)自動(dòng)讓他們變?yōu)閕nt 后又自動(dòng)封裝回去。


  包裝器可以提供很多有用的方法(以Integer 為例,其他的類(lèi)似):


  1、int intValue()返回Integer 對(duì)象的值


  2、Static toString(int i) ||toString(int i,int num)返回指定數(shù)值i 的串,第2 種協(xié) 變參數(shù)的num 指定進(jìn)制。


3、Static int parseInt(String s) ||toString(String s,int num) 返回字符串s 表示的 整型數(shù)值,第2 種協(xié)變參數(shù)的num 指定進(jìn)制。


  4、Static Integer valueOf(String s) ||toString(String s,int num) 返回字符串s 表 示的整型數(shù)值進(jìn)行初始化后的Integer 對(duì)象,第2 種協(xié)變參數(shù)的num 指定進(jìn)制。



  五、參數(shù)數(shù)量可變的方法


  callMethod(type... args)表明可以接受任意數(shù)量的對(duì)象,其實(shí) 編譯器將其打包成了數(shù)組。



  六、反射


  能夠分析類(lèi)能力的程序被稱(chēng)為反射。java 運(yùn)行時(shí)系統(tǒng)始終為所有的對(duì)象維護(hù)一個(gè) 被稱(chēng)為運(yùn)行時(shí)的類(lèi)型標(biāo)示,這個(gè)信息保存著每個(gè)對(duì)象所屬的類(lèi)足跡。


  1、class 類(lèi):用來(lái)保存對(duì)象運(yùn)行時(shí)的信息,得到該對(duì)象的方法有


a、Object 類(lèi)中的getClass() 方法返回一個(gè)Class 類(lèi)型的實(shí)例。


b、Static forName(String classname):通過(guò)類(lèi)名獲得一 個(gè)對(duì)應(yīng)的Class 對(duì)象。


c、用 類(lèi)名.class 代表對(duì)應(yīng)的Class 對(duì)象。一個(gè)class 對(duì)象實(shí)際上表 示的一個(gè)類(lèi)型,而這個(gè)類(lèi)型未必是一種類(lèi),例如可以:int.class。class 類(lèi)里的一般的方法有:getName()返回類(lèi)的名子。如果類(lèi)在一個(gè)包里,那么包名也會(huì)作 為類(lèi)名的一部分。 newInstance():可以用來(lái)快速地創(chuàng)建一個(gè)類(lèi)的實(shí)例 ,調(diào)用的是默認(rèn)的構(gòu)造器,如果這個(gè)類(lèi)沒(méi) 有默認(rèn)的構(gòu)造起就會(huì)拋出一個(gè)異常。


  2、利用反射分析類(lèi)的能力:Class 類(lèi)中的 getFields(),getMethods(),getConstructors() 這三個(gè)方法分別返回對(duì)應(yīng)類(lèi)的 field(封裝域信息),method(封裝方法信息),constructor(封 裝構(gòu)造器信息)對(duì)象的數(shù)組(都是public 的域,方法或則構(gòu)造器),getMethods()返回的是所 有的公有方法,包括從超類(lèi)繼承來(lái)的方法。 getDeclareMethod()返回這個(gè)類(lèi)的全部方法包括該類(lèi)的私有方法,但不包括由超類(lèi)繼承了的 方法。 getDeclareField()返回的是這個(gè)類(lèi)的所有域,但不包括由超類(lèi)繼承了的方法。 getDeclareConstructor()返回的是所有的構(gòu)造器。


  Field、Method、Constructor 類(lèi)都有的方法:


  String getName()返回該域的名字;int getModifiers()返回一個(gè)整形數(shù)值用來(lái)描述成員的修飾符,Modifier 類(lèi)有很多靜態(tài)方法可以 對(duì)這個(gè)整型做判斷,比如isPublic 等;Class getDeclaringClass()返回一個(gè)用于描述定義的 構(gòu)造器、方法或者域的Class 對(duì)象。


  field 類(lèi):


  Class getType()方法返回描述域所屬類(lèi)型的Class 對(duì)象。Object get(Object o) 方法的參數(shù)是某個(gè)包含域F 的類(lèi)的對(duì)象,返回該對(duì)象的這個(gè)域的原始對(duì)象,對(duì)于基本類(lèi)型有 相應(yīng)的getInt 等。注意的是如果沒(méi)有調(diào)用setAccessible(true)(這個(gè)方法并不是永遠(yuǎn)的能 有效的,在一些服務(wù)器比如 weblogic,可以通過(guò)安全性設(shè)置來(lái)屏蔽這個(gè)函數(shù)的功能),只能得 到可訪(fǎng)問(wèn)(public)的域的值。(很明顯,通過(guò)這個(gè)機(jī)制,多少破壞了封裝性)


  Method 類(lèi):


  Class[] getParameterTypes()返回描述該方法參數(shù)類(lèi)型的 Class 數(shù)組。


  Class getReturnType()返回描述該方法返回值類(lèi)型的Class 對(duì)象。Class[] getExceptionTypes 返 回描述該構(gòu)造器方法拋出異常類(lèi)型的Class 對(duì)象數(shù)組。


  Constructor 類(lèi):


  Class[] getParameterTypes()返回描述該構(gòu)造器方法參數(shù)類(lèi)型的Class 數(shù) 組。Class[] getExceptionTypes 返回描述該構(gòu)造器方法拋出異常類(lèi)型的Class 對(duì)象數(shù)組。


  3、使用反射里的數(shù)組:Class 類(lèi)里的有g(shù)etComponentType 方法確定數(shù)組對(duì)應(yīng)的類(lèi)型。 Array:Static Object newInstance(Class cl,int length)可以通過(guò)CL 類(lèi)型創(chuàng)建一個(gè)長(zhǎng) 度為length 的數(shù)組。


  Static Object get(Array a,int index)通過(guò)索引返回?cái)?shù)組A 指定位置的對(duì)象。 基本類(lèi)型就是相應(yīng)的get 方法,如:畢業(yè)論文范文getInt(Array a,int index); statci int getLength(Object o)返回?cái)?shù)組o 的長(zhǎng)度。


  4、方法指針:Method 類(lèi) : Object invoke(Object,Object...args)方法第一個(gè)參數(shù)是隱式 參數(shù)(要在哪個(gè)對(duì)象上調(diào)用,如果是靜態(tài)方法,其可以為 null),其余的對(duì)象提供的是顯式 參數(shù),如果沒(méi)有就傳一個(gè)null,如果方法返回的是基本類(lèi)型,那么調(diào)用invoke 可以返回基本 類(lèi)型的包裝類(lèi)。


  Method getMethod(String s,Class...parameterTypes) :提供了參數(shù)的類(lèi)型信息,可以在很 多重載的方法中返回準(zhǔn)確的對(duì)象。



  七、繼承設(shè)計(jì)技巧


1、把公共超類(lèi)的操作和域。


2、最好不使用保護(hù)域。


3、明”是一個(gè)“繼承關(guān)系。


4、除非所有繼承的方法是有意義的,否則最好不要使用繼承。


5、當(dāng)覆蓋方法,不改變預(yù)期的行為。


6、使用多態(tài),而不是類(lèi)型信息。


7、不要過(guò)多使用反射。



培訓(xùn)啦提醒您:交易時(shí)請(qǐng)核實(shí)對(duì)方資質(zhì),對(duì)于過(guò)大宣傳或承諾需謹(jǐn)慎!任何要求預(yù)付定金、匯款等方式均存在風(fēng)險(xiǎn),謹(jǐn)防上當(dāng)。