版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、Created by Alwen on 2017/5/14.java是面向對象的程序設計語言;類可被認為是一種自定義的數(shù)據(jù)類型,可以使用類來定義變量,所有使用類定義 的變量都是引用變量,它們將會引用到類的對象。類用于描述客觀世界里某一類對象的共同特征,而對象則是類的具 體存在,java程序使用類的構造器來創(chuàng)建該類的對象.java也支持面向對象的三大特征:封裝、繼承、和多態(tài)。java提供了 private> protected、和public三個訪問控 制修飾符來實現(xiàn)良好的封裝,提供了 extends關鍵字讓子類繼承父類,子類繼承父類就可以繼承到父類的成員變量和 和方法,如果訪問控制允許,
2、子類實例可以直接調(diào)用父類里定義的方法.繼承是實現(xiàn)類復用的重要手段.使用繼承關 系來實現(xiàn)復用時,子類對象可以直接賦給父類變量,這個變量具有多態(tài)性.面向對象的程序設計過程中有兩個重要的概念:類(Class)和對象(object,也被稱為實例,instance) «類可以包 含三種最常見的成員:構造器、成員變量、和方法.構造器用于構造該類的實例,java語言通過ne”關鍵字類調(diào)用構造器,從而返回該類的實例。構造器是一個類創(chuàng)建 對象的根本途徑,如果一個類沒有構造器,這個類通常無法創(chuàng)建實例。因此java語言提供了一個功能:如果程序員 沒有為一個類編寫構造器,則系統(tǒng)會為該類提供一個默認的構造器,
3、這個構造器總是沒有參數(shù)的.一旦程序員為一個 類提供了構造器,系統(tǒng)將不再為該類提供構造器.構造器用于對類實例進行初始化操作,構造器支持重載,如果多個重載的構造器里包含了相同的初始化代碼,則可以 把這些初始化代碼放置在普通初始化塊里完成,初始化塊總在構造器執(zhí)行之前被調(diào)用.靜態(tài)初始化塊代碼用于初始化 類,在類初始化階段被執(zhí)行。如果繼承樹里某一個類需要被初始化時,系統(tǒng)將會同時初始化該類的所有父類.構造器修飾符:可以是public、protected private其中之一,或者省略構造器名:構造器名必須和類名相同。 注意:構造器既不能定義返回值類型,也不能使用void聲明構造器沒有返回值.如果為構造器
4、定義了返回值類型, 或使用void聲明構造器沒有返回值,編譯時不會出錯,但java會把這個所謂的構造器當成方法來處理它就不再 是構造器.實際上類的構造器是有返回值的,當使用ne關鍵字來調(diào)用構造器時,構造器返回該類的實例,可以把這個類的實例 當成構造器的返回值。因此構造器的返回值類型總是當前類,無須定義返回值類型。不要在構造器里顯式的使用 return來返回當前類的對象,因為構造器的返回值是隱式的。java類名必須是由一個或多個有意義的單詞連綴而成的,每個單詞首字母大寫,其他字母全部小寫,單詞與單詞之 間不要使用任何分隔符.成員變量:成員變:的修飾符:public> protected、p
5、rivate> static、final前三個只能出現(xiàn)一個再和后面的修飾符組合起來 修飾成員變量,也可省略。成員變量:由一個或者多個有意義的單詞連鍛而成,第一個單詞首字母小寫,后面每個單詞首字母大寫,其他字母全 部小寫,單詞與單詞之間不要使用任何分隔符。類型:可以是java語言允許的任何數(shù)據(jù)類型,包括基本類型和引用類型.成員方法:方法修飾符:public、protected、private> static、final、abstract» 前三個只能出現(xiàn)一個,static 和 final 最 多只能出現(xiàn)其中的一個,和abstract組合起來使用。也可省略。返回值類型:可以是
6、java語言的允許的任何數(shù)據(jù)類型,包括基本類型和引用類型。方法名,和成員變量的方法命名規(guī)則相同,通常建議方法名以英文動詞開頭.方法體里多條可執(zhí)行語句之間有嚴格的執(zhí)行順序,排在方法體前面的語句總先執(zhí)行,排在方法體后面的語句總是后執(zhí) 行.static是一個特殊的關鍵字,它可用于修飾方法、成員變量等成員 static修飾的成員表明它屬于這個類本身,而 不屬于該類的單個實例,因此通過把static修飾的成員變量和方法被稱為類變量、類方法(靜態(tài)成員變量,靜態(tài)成 員方法);不使用static修飾的成員變量和方法稱為實例變量和實例方法(非靜態(tài)成員變量,非靜態(tài)成員方法). 靜態(tài)成員不能直接訪問非靜態(tài)成員。st
7、atic的真正作用就是用于區(qū)分成員變量、方法、內(nèi)部類、初始化塊,這四種成員到底屬于類本身還是屬于實例。有static修飾的成員屬于類本身,沒有類修飾的成員屬于該類的實例。java類大致有如下作用:定義變量創(chuàng)建對象調(diào)用類的類方法或訪問類的類變量。定義一個類就是為了重復創(chuàng)建該類的實例,同一個類的多個實例具有相同的特征,而類則是定義了多個實例的共同特 征.類里定義的方法和成員變量都可以通過類或實例來調(diào)用。Static修飾的方法和成員變量,既可通過類來調(diào)用,也可 通過實例來調(diào)用;沒有使用static修飾的普通方法成員變量,只可通過實例來調(diào)用.Person p=new Person。;這行代碼創(chuàng)建了一個
8、Person實例,也被稱為Person對象,這個Person對象被賦給p變量。 在這行代碼中實際上產(chǎn)生了兩個東西,一個是p變量,一個是Person對象。P引用變量本身只存儲了一個地址值,并 未包含任何實際數(shù)據(jù),但它指向實際的Person對象.Person對象由多塊內(nèi)存組成,不同內(nèi)存塊分別存儲了 Person對象的不同成員變量類是一種引用數(shù)據(jù)類型,因此程 序中定義的Person類型的變量實際上是一個引用,它被存放在棧內(nèi)存里,指向實際的Person對象;而真正的Person 對象則存放在堆內(nèi)存中.當一個對象被創(chuàng)建成功以后,這個對象將保存在堆內(nèi)存中,java程序不允許直接訪問堆內(nèi)存中的對象,只能通過
9、該對 象的引用操作該對象。堆內(nèi)存里的對象可以有多個引用,即多個引用變量指向同一個對象.如果堆內(nèi)存里的對象沒有任何變量指向該對象,那么程序將無法再訪問該對象,這個對象也就變成了垃圾,java垃圾 回收機制將回收該對象,釋放該對象所占的內(nèi)存區(qū).對象的this引用Java提供了一個this關鍵字,this關鍵字總是指向調(diào)用該方法的對象。This作為對象的默認引用有兩種情形:構造器中引用該構造器正在初始化的對象;在方法中引用調(diào)用該方法的對象.This關鍵字最大的作用就是讓類中一個方法,訪問該類里的另一個方法或者實例變量.Java允許對象的一個成員直接調(diào)用另一個成員,可以省略this前綴。如果在stat
10、ic修飾的方法中使用this關鍵字,則這個關鍵字就無法指向合適的對象,所以,static修飾的方法中不 能使用this引用.Java編程時不要使用對象去調(diào)用static修飾的成員變量、方法、而是應該使用類去調(diào)用static修飾的成員變量、方 法.如果確實需要在靜態(tài)方法中訪問另一個普通方法,則只能重新創(chuàng)建一個對象.大部分的時候,普通方法訪問其他方法、成員變量時無須使用this前綴,但如果方法里有個局部變量和成員變量同 名,但程序又需要在該方法里訪問這個被覆蓋的成員變量,則必須使用this前綴.This引用也可以用于構造器中作為默認引用,由于構造器時直接使用new關鍵字來調(diào)用,而不是使用對象來調(diào)用
11、的, 所以this在構造器中代表該構造器正在初始化對象。方法:Java里的方法不能獨立存在,所有的方法都必須定義在類里.如果這個方法是用來static修飾,則這個方法屬于這 個類,否則這個方法屬于這個類的實例.執(zhí)行方法時,必須使用類或者對象作為調(diào)用者。同一個類的一個方法調(diào)用另 外一個方法時,如果被調(diào)方法是普通方法,則默認使用this作為調(diào)用者;如果被調(diào)用方法是靜態(tài)方法,則默認使用類作為調(diào)用者.也就是說java中看起來某些方法可以被獨立執(zhí)行,但實際上還是使用this或者類來作為調(diào)用者Java里方法參數(shù)傳遞方式只有一種:值傳遞。所謂值傳遞,就是講實際參數(shù)值的副本(復制品)傳入方法內(nèi),而參數(shù) 本身不
12、會受到任何影響.從JDKL5之后,java允許定義形參個數(shù)可變的參數(shù),從而允許為方法指定數(shù)量不確定的形參。如果在定義方法時, 產(chǎn)最后一個形參的類型后增加三點(),則表明該形參可以接受多個參數(shù)值,多個參數(shù)值被當成數(shù)組傳入.public class Varargs (定義形參可變的方法public static void test(int a, String. books)/books被當成數(shù)組處理for (String tmp:books)System, out. println(tmp);System, out. print In (a);)public static void main(St
13、ring args)調(diào)用test方法test (5, "hello”, * world*, "aa");J數(shù)組形式的形參可以處于形參列表的任意位置,但個數(shù)可變的形參只能處于形參表的最后。也就是說最多只能有一個 長度可變的形參。形參可變和傳入數(shù)組的區(qū)別:public static void test(int a, String. books);public static void test (int a, String books);test (5, "aa", "bb", *cc*);test(5, new String*a
14、a*»"bb", "cc");方法重載:Java允許同一個類里定義多個同名方法,只要形參列表不同就行。如果同一個類中包含了兩個或兩個以上方法的方法 名相同,但形參列表不同,則被稱為方法的重載。Java程序確定一個方法需要三個要素:調(diào)用者;方法名;形參列表。方法的重載要求就是兩同一不同:同一個類中方法名相同,參數(shù)列表不同.至于方法的其他部分,如方法返回值類型、 產(chǎn)飾符等,與方法重裁沒有任何關系.public class OverloadVarargs public void test(String msg)System. out. printin
15、 ("只有一個參數(shù)的 test*);因為前面已經(jīng)有了一個字符串參數(shù)的方法,則長度可變形參里不包含一個字符串參數(shù)的形式public void test(String . books)System. out. println ("形參可變的 test 方法");public static void main(String args)OverloadVarargs olv=new OverloadVarargs 0;下面兩次調(diào)用將執(zhí)行第二個test方法olv. test ();olv. test (*aa*» "bb");將調(diào)用第一個tes
16、t方法 olv. test Caa*);將調(diào)用第二個test方法 olv.test(new String*aa*);Java中變量分為:成員變稿和局部變*.成員變量被分為類變量和實例變*兩種,定義成員變量時沒有static修飾 的就是實例變量,有static修飾的就是類變量。 變量的命名:從程序的可讀性角度來看,應該是多個有意義的單詞連綴而成,其中第一個單詞首字母小寫,后面 每個單詞首字母大寫. 如果通過一個實例修改了類變量的值,由于這個類變量并不屬于它,而是屬于它對應的類。因此,修改的依然是 類變量,與通過該類來修改類變量的結果完全相同,這會導致該類的其他實例來訪問這個類變量時也將獲得這個
17、被修改過的值。 成員變量無須顯式初始化,只要為一個類定義了類變量或實例變量,系統(tǒng)就會在這個類的初始化階段或創(chuàng)建該類 的實例時,進行默認初始化. 實例變量隨實例的存在而存在,而類變量則隨類的存在而存在。實例也可訪問類變量,同一個類的所有實例訪問 類變量時,實際上訪問的是該類本身的同一個變量,也就是說,訪問了同一片內(nèi)存區(qū). 局部變量根據(jù)定義形式的不同,又可分為三種形式:形參,方法局部變量,代碼塊局部變量;局部變量除了形參 之外,都必須顯示初始化。 在同一個類里,成員變量的作用范圍是整個類內(nèi)有效,一個類里不能定義兩個同名的成員變量,即使一個是類變 量,一個是實例變量也不行;一個方法里不能定義兩個同名
18、的方法局部變量,方法局部變量與形參也不能同名; 同一個方法中不同代碼塊內(nèi)局部變量可以同名;如果先定義代碼塊局部變量,后定義方法局部變量,前面定義的 代碼塊局部變量與后面定義的方法局部變量也可同名. Java允許局部變量和成員變量同名,如果方法里的局部變量和成員變量同名,局部變量會覆蓋成員變量,如果需 要在這個方法里引用被覆蓋的成員變量,則可使用this時于實例變量)或類名(對于類變量)作為調(diào)用者來限定 訪問成員變量.public class VariableOverrideTest 定義一個name實例變量private String name=“李剛”;定義一個"ice類變量pri
19、vate static double price=78. 0;public static void main(String args)方法里局部變量凄費成員變量,將輸出price的局部變量65int price=65;System, out. printin (price);使用類名作為price變量的限定,將輸出price類變量的值System, out. printin(VariableOverrideTest. price);new VariableOverrideTest 0. info 0 ;)public void info 0 方法里的局部變量,局部變量覆蓋成員變量,輸出n血局部
20、變量的值:孫悟空String name:"孫悟空";System, out. print In (name);將輸出name實例的值:李剛System, out. printin (this, name);當系統(tǒng)加載類或創(chuàng)建該類的實例時,系統(tǒng)自動為成員變量分配內(nèi)存空間,并在分配內(nèi)存空間后,自動為成員變量指定 初始值。Person pl=new Person。;時,如果這行代碼是第一次使用Person類,則系統(tǒng)通常會在第一次使用Person類時加載 這個類,并初始化這個類.局部變量定以后,必須經(jīng)過顯式初始化后才能使用,系統(tǒng)不會為局部變*執(zhí)行初始化.局部變量不屬于任何類或者實
21、例,因此它總是保存在其所在方法的棧內(nèi)存中如果局部變量時基本類型的變髭,則直接把這個變量的值保存在該變 量對應的內(nèi)存中;如果局部變量是一個引用類型的變,則這個變量里存放的是地址,通過該地址引用到該變量實際 引用的對象或者數(shù)組。棧內(nèi)存中的變量無須系統(tǒng)垃圾回收,往往隨是方法或代碼塊的運行結束而結束。如果定義的某個變量是用于描述某個類或某個對象的固有信息的,這種變量應該定義成成員變量.如果這種信息對這 個類的所有實例完全相同,或者說它是類相關的,則該定義成類變量;如果這個信息是實例相關的,則應該定義成實 例變量。用于保存某個類或某個實例狀態(tài)信息的變量通常應該使用成員變量。如果某個信息需要在某個類的多個
22、方法之間進行 共享,則這個信息應該使用成員變量來保存。隱藏和封裝訪問控制符用于控制一個類的成員是否可以被其他類訪問。Java提供了 3個訪問控制修飾符:private, protected,和public,還有一個默認訪問控制修飾符defaultPrivate (當前類訪問權限);default (包訪問權限);protected (子類訪問權限):如果一個成員使用protected訪問 修飾符修飾,那么這個成員既可以被同一個包中的其他類訪問,也可以被不同包中子類訪問。通常情況下,使用 protected修飾的方法,通常希望其子類來重寫這個方法。Public (公共訪問權限)對于局部變量而言,
23、其作用域就是它所在的方法,不可能被其他類訪問,因此不能使用訪問控制符來修飾.外部類只能有兩種訪問控制級別:public和默認,不能使用private和protectedpublic class Person private String name;private int age;public void setName(String name) if (name, length 0 >61 | name, length 0 <2) System, out. print In ("error"); return;)elsethis. name=naine;)publ
24、ic String getName 0 return this, name;public void setAge(int age) if (age > 100 | age < 0) System, out. printin Cerror*); else this, age = age;)public int getAge()return this, age;public class PersonTest public static void main(String args)Person p=new Person 0 ;下面的變量不會運行錯誤,但是會提示錯誤p. setAge(10
25、00);因為上面沒有成功設置P的age成員,故輸出0System, out. println(p. getAe 0);成功設置P的Me成員p.setAge(30);System, out. println(p. getAge 0);成功設置p的naae成員p. setName ("李剛");System, out. printin (p. getNamc 0 );)構造器:構造器最大的用途是創(chuàng)建對象時執(zhí)行初始化.當創(chuàng)建一個對象時,系統(tǒng)為這個對象的實例變量進行默認初始化,這種 默認的初始化把所有基本類型的實例變量設為0 (對數(shù)值型實例變量)或false (對布爾型實例變量),
26、把所有引用類 型的實例變量設為null.如果想改變這種默認的初始化,想讓系統(tǒng)創(chuàng)建對象時就位該對象的實例變量顯式指定初始值, 就可以通過構造器來實現(xiàn).因為構造器主要用于被其他方法調(diào)用,用以返回該類的實例,因而通常把構造器設置成public訪問權限,從而允許系 統(tǒng)中任何位置的類來創(chuàng)建該類的對象.如果設置成protected,主要用于被子類調(diào)用;設置為private,阻止其他類創(chuàng) 建該類的實例。如果系統(tǒng)中包含了多個構造器,其中一個構造器B的執(zhí)行體里完全包含另一個構造器A的執(zhí)行體.為了這構造器B中 調(diào)用構造器A中的初始化代碼,又不會重新創(chuàng)建一個java對象,可以使用this關鍵字來調(diào)用相應的構造器.p
27、ublic class Apple public String name:public String color;public double weight;/輛個蓼數(shù)的構造器public Apple(String name, String color)this. name=neune;this. color=color;)三個參數(shù)的構造器public Apple(String name, String color, double weight)通過this調(diào)用另一個重載的構造器的初始化代碼this(name, color);通過this引用該構造器正在初始化的Java對象 this. weig
28、ht=weight;使用this調(diào)用另一個重載的構造器只能在構造器中使用,而且必須作為構造器執(zhí)行體的第一條語句。使用this調(diào)用 重載的構造器時,系統(tǒng)會根據(jù)this后括號里的實參來調(diào)用形參列表與之對應的構造器 類的繼承: Java繼承通過extends關鍵字來實現(xiàn)實現(xiàn)繼承的類被稱為子類,被繼承的類被稱為父類,有的也稱為基類、超類。 因為子類是一種特殊的父類,因此父類包含的范圍總比子類包含的范圍要大。Java子類不能獲得父類的構造器public class Fruit public double weight;public void info()System, out. printin (wei
29、ght);)public class Apple extends Fruit Apple 類繼承了Fruit 類,所以 Apple對象也就有了 weight 成員變量和info 0方法public static void main(String args)Apple a=new Apple 0;即pie對象本身沒有weight成員變量,但是,Apple父類有“eight成員變量,所以,也可以訪問Apple對象的weight成員變量a. weight=56;調(diào)用Apple對象的info 0方法a. info 0 ;)Java類只能有一個直接父類,實際上,Java類可以有無限多個間接父類。重寫父類
30、方法:子類擴展了父類,子類是一個特殊的父類。大部分時候,子類總是以父類為基礎,額外增加新的成員變量和方法。但有一種情況例外:子類需要重寫父類方法public class Bird /Bird類的fly 0方法public void flyO System. out. print In ("我在天空中飛”);)public class Ostrich extends Bird 重寫B(tài)ird類的fly。方法public void fly 0 System, out. printin ("我在陸地上飛“);)public static void main(String args)
31、/創(chuàng)建Ostrich對象Ostrich or=new Ostrich0;/執(zhí)行Ostrich對象的fly () 小將輸出“我在陸地上飛” or. flyO ;)這種子類包含與父類同名方法的現(xiàn)象被稱為方法重寫(Override),也被稱為方法覆蓋可以說子類重寫了父類的方法, 也可以說子類覆蓋了父類的方法。方法的重寫要遵循“兩同兩小一大”規(guī)則,“兩同”即方法名相同、形參列表相同;“兩小”指的是子類方法的返回值 類型應比父類方法返回值類型更小或相等,子類方法聲明拋出的異常類應比父類聲明拋出的異常類更小或相等產(chǎn)一大” 指的是子類方法的訪問權限應比父類方法的訪問權限更大或相等。覆蓋方法和被覆彘方法要么都
32、是類方法,要么都是實例方法。當子類覆蓋了父類方法后,子類的對象將無法訪問父類中被覆蓋的方法,但可以在子類方法中調(diào)用被覆蓋的方法.如 果需要在子類方法中調(diào)用父類中被覆蓋的方法,則可以使用super (被覆蓋的是實例方法)或者父類類名(被覆蓋的是 類方法)作為調(diào)用者來調(diào)用父類中被覆蓋的方法.如果父類方法具有private訪問權限,則該方法對其子類是隱藏的,因此其子類無法訪問該方法,也就是無法重寫該 方法。重載只要發(fā)生在同個類多個同名方法之間,而重寫發(fā)生在子類和父類同名方法之間.父類方法和子類方法之間也可能 發(fā)生重載.Super限定:Super是Java提供的一個關鍵字,super用于限定該對象調(diào)用
33、它從父類繼承得到的實例變量或方法.Super不能出現(xiàn) 在static修飾的方法中。Static修飾的方法是屬于類的,該方法的調(diào)用者可能是一個類,而不是對象,因而super限 定就失去了意義.如果在構造器中使用super,則super用于限定該構造器初始化的是該對象從父類繼承得到的實例變量,而不是該類自 己定義的實例變量.如果子類定義了和父類同名的實例變量,則會發(fā)生子類實例變量隱藏父類實例變量的情形。在正常情況下,子類里定 義的方法直接訪問該實例變量,默認會訪問到子類中定義的實例變量,無法訪問到父類中被隱藏的實例變量。在子類 定義的實例方法中可以通過super來訪問父類中被隱藏的實例變量。pub
34、lic class BaseClass public int a=5;)public class SubClass extends BaseClasspublic int a=7;public void accessOwner0 System, out. printin (a);)public void accessBaseO iSH super來限定訪問從父類繼承得到的a實例變量 System, out. printin (super, a);)public static void main(Strins args)SubClass sb=new SubClass 0;sb. accessB
35、ase 0 ; /1ft出 5sb. accessOwner 0 ; 輸出 7)如果在某個方法中訪問名為a的成員變量,但沒有顯式指定調(diào)用者,則系統(tǒng)查找”的順序為:1 .查找該方法中是否有名為a的局部變量2 .查找當前類中是否包含名為a的成員變量3 .查找a的直接父類中是否包含名為a的成員變量,一次上溯a的所有父類,直到java. lang. Object類,如果最終 不能找到名為a的成員變量,則系統(tǒng)出現(xiàn)編譯錯誤如果被覆蓋的是類變量,在子類的方法中則可以通過父類名作為調(diào)用者來訪問被覆蓋的類變量 當程序創(chuàng)建一個子類對象時,系統(tǒng)不僅會為該類中定義的實例變量分配內(nèi)存,也會為它從父類繼承得到的所有實例變
36、 量分配內(nèi)存,即使子類定義了與父類中同名的實例變量。如果在子類里定義了與父類中已有變量同名的變量,那么子類中定義的變量會隱藏父類中定義的變量.注意不是完全 ,蓋,因此系統(tǒng)在創(chuàng)建子類對象時,依然會為父類中定義的、被隱藏的變量分配內(nèi)存空間.public class Parent public String tag=helloworld*;)public class Derived extends Parent 定義一個私有的tag實例變量來隱藏父類的tag實例變量private String ta<="abc")public class HideTest public s
37、tatic void main(String args)Derived d=new Derived0;程序不可訪問d的私有變量tag,所以會出現(xiàn)編譯錯誤/ System, out. print In (L tag);將d變量顯式的向上轉型為Parent后,即可訪問tag實例變量System, out. printin (Parent) d) tag);)調(diào)用父類構造器:子類不會獲得父類的構造器,但子類構造器里可以調(diào)用父類構造器的初始化代碼。在一個構造器里調(diào)用另一個重載的 構造器使用this調(diào)用來完成,在子類構造器中調(diào)用父類構造器使用super調(diào)用來完成.public class Base (p
38、ublic double size;public String name;public Base(double size, String name)this, size;size;this. name=name;)public class Sub extends Basepublic String color;public Sub(double size, String name, String color) 通過super調(diào)用父類構造器的初始化過程super (size, name);this, color:color;)public static void main(String args
39、) Sub s=new Sub (5. 6,"測試","red');System, out. printing size+=, "+s name+=, "+s. color);)Super調(diào)用的是其父類的構造器,而this調(diào)用的是同一個類中重教的構造器;因此,使用super調(diào)用父類的構造器也 必須出現(xiàn)在子類構造器執(zhí)行體的第一行,所以this調(diào)用和super調(diào)用不會同時出現(xiàn).當調(diào)用子類構造器來初始化子類對象時,父類構造器總會在子類構造器之前執(zhí)行;不僅如此,執(zhí)行父類構造器時,系 統(tǒng)會再次上溯執(zhí)行其父類的構造器依次類推,創(chuàng)建任何java對象,
40、最先執(zhí)行的總是lang. Ob ject類的構造 器。public class Creature public Creature 0 System. out. printin ("無參"); ) ) public class Animal extends Creature ( public Animal(String name) System. out. printin (*Animal 帶一個參數(shù)的構造器"+name); ) public Animal(String name, int age)/this調(diào)用同一個重教構造器 thisGiame);System.
41、 out. printin ("Animal 帶兩個參數(shù)的構造器“+age); ) public class Wolf extends Animal ( public Wolf 0 super ('灰太狼,4);System. out, println(*wolf 無參構造器"); ) public static void main(String args)Wolf wf=new Wolf 0 ;/雖然main方法只創(chuàng)建了一個Wolf對象,但系統(tǒng)在底層完成了復雜的操作,運行將會得到 無參Animal帶一個奉數(shù)的構造器灰太狼Animal帶兩個參數(shù)的構造器4 wolf無
42、參構造器 )創(chuàng)建任何對象總是從該類所在繼承樹最頂層類的構造器開始執(zhí)行,然后依次向下執(zhí)行,最后才執(zhí)行本類的構造器。如 果某個父類通過this調(diào)用了同類中重載的構造器,就會依次執(zhí)行此父類的多個構造器.4.7多態(tài):Java引用變量有兩個類型:一個是編譯時類型,一個是運行時類型。編譯時類型由聲明該變量時使用的類型決定,運 行時類型由實際賦給該變量的對象決定.如果編譯時類型和運行時類型不一致,就可能出現(xiàn)所謂的多態(tài).public class BaseClass public int book=6;public void base 0 System. out printin ("父類的普通方法“)
43、;)public void test 0 System. out. printin("父類被覆蓋的方法”);)public class SubClass extends BaseClass 重寫定義一個book實例變量隱蒙父類的book實例變量 public String book=*abc*;public void test 0 System,也已printin ("子類的覆蓋父類的方法'); public void subO System. out. printin ("子類的普通方法”); ) public static void main(Stri
44、ng args)編譯時類型和運行時類型完全一樣,因此不存在多態(tài)BaseClass be:new BaseClass 0;輸出父類be對象的成員變量值:6System, out. printin (be. book);be. test 0 ;be. base 0 ;編譯時類型和運行時類型完全一樣,因此不存在多態(tài)SubClass sbc=new SubClass();輸出子類對象sbe的成員變量值:abcSystem, out. printin (sbc. book);sbc.test 0;sbc. sub 0 ;下面調(diào)用將執(zhí)行從父類繼承到的base。方法 sbc. base 0 ;/編譯時類型和
45、運行時類型不一樣,發(fā)生多態(tài)發(fā)生BaseClass ployBc=new SubClass 0;訪問的是父類對象的實例變量System, out. printin (ployBc. book);執(zhí)行從父類繼承到的base 0方法ployBc. base 0;/調(diào)用將執(zhí)行當前類的test。方法ployBc. test 0; ployBc. sub ();因為編譯時類型是BaseClass,沒有提供sub。方法,所以編譯會出現(xiàn)錯誤 )因為子類是一種特殊的父類,因此java允許把一個子類對象直接賦給一個父類引用變量,無須任何類型轉換,或者被 稱為向上轉型,向上轉型由系統(tǒng)自動完全。對象的實例變量不具備多
46、態(tài)性。注:引用變量在編譯階段只能調(diào)用其編譯時類型所具有的方法,但運行時則執(zhí)行它運行時類型所具有的方法。因此在編寫 Java代碼時,引用變量只能調(diào)用聲明該變量時所用類里包含的方法.例如:Object p=new Person。代碼定義了一個 變量P,則這個P只能調(diào)用Object類的方法,而不能調(diào)用Person類里的方法.如果需要讓這個引用變量調(diào)用它運行時類型的方法,則必須把它強制類型轉化成運行時的類型,強制類型轉換符帝要 借助于類型轉換運算符,用法是(type) variable強制類型轉換需要注意:基本類型之間的轉換只能在數(shù)值類型之間進行,這里所說的數(shù)值類型包括,整數(shù)型、字符型和浮點型;但數(shù)值
47、類型和 布爾類型之間不能進行類型轉換。引用類型之間的轉換只能在具有繼承關系的兩個類型之間進行,如果是兩個沒有任何繼承關系的類型,則無法進行類型轉換。考慮到強制類型轉換時可能出現(xiàn)異常,因此進行類型轉換之前應先通過instemceof運算符來判斷是否可以成功轉換.注意:當把子類對象賦給父類引用變量時,被稱為向上轉型,這種轉型總是可以成功的,這也從另一個側面證實了子類是一 種特殊的父類.這種轉型只是表明這個引用變:的編譯時類型是父類,但實際執(zhí)行它的方法時,依然表現(xiàn)出子類對象 行為方式.但把一個父類對象賦給子類引用變量時,就需要進行強制類型轉換,而且還可能在運行時產(chǎn)生 ClassCastExcepti
48、on異常,使用instanceof運算符可以讓強制類型轉換更安全.Instanceof 運算符:Instanceof運算符前一個操作數(shù)通常是一個引用類型變量,后一個操作數(shù)通常是一個類(也可以是接口),它用于判 斷前面的對象是否是后面的類,或者其子類、實現(xiàn)的實例。如果是,則返回ture,否則返回false.在使用instanceof運算符時需要注意:instanceof運算符前面操作數(shù)的編譯時類型要么與后面的類相同,要么與后 面的類具有父子繼承關系,否則會引起編譯錯誤.public class instanceofTest public static void main(String args)
49、聲明hello時使用Object類,Ml/hello的編譯類型是Object“Object是所有類的父類,但hell。變量的實際類型是StringObject hello=*hello*;System, out. printin (hello instanceof Object);/String和Objec t類存在繼承關系,可以進行ins tanceof運算,返回trueSystem, out. println( (hello instanceof String);/Math和Object類存在繼承關系»可以進行instanceof運算,返回falseSystem, out. pr
50、intin (hello instanceof Math);/String 實現(xiàn) T Cooparabel 接口,所以返回 trueSystem, out. println(hello instanceof Comparable);String a=*hello*;“String類和Math類沒有繼承關系,所以下面的代碼編譯無法通過/System, out. print In (a instanceof Math);4 . 8初始化塊:初始化塊是一段固定執(zhí)行的代碼,它不能接受任何參數(shù)。因此初始化塊對同一個類的所有對象所進行的的初始化處理 完全相同.如果兩個構造器中有相容的初始化代碼,且這些初始
51、化代碼無須接收參數(shù),就可以把它們放在初始化塊中 定義.當創(chuàng)建java對象時,系統(tǒng)總是先調(diào)用該類里定義的初始化塊,相同類型的初始化塊之間按順序執(zhí)行。初始化塊在執(zhí)行 構造器之前執(zhí)行。與構造器類型,創(chuàng)建一個java對象時,不僅會執(zhí)行該類的普通初始化塊和構造器,而且系統(tǒng)會一直上溯到 java. lang. Object類,先執(zhí)行java. Ians. Object類的初始化塊,再開始執(zhí)行java. lang. Object的構造器,依次向下 執(zhí)行其子類的初始化塊,再開始執(zhí)行其子類的構造器最后才執(zhí)行該類的初始化塊和構造甥,返回該類的對象。靜態(tài)初始化塊:如果定義初始化塊時使用了 static修飾符,則這個
52、初始化塊就變成了靜態(tài)初始化塊,也被稱為類初始化塊(普通初始 化塊負責對對象執(zhí)行初始化,類初始化塊則負責對類進行初始化靜態(tài)初始化塊總是類相關的,系統(tǒng)將在類初始化階 段執(zhí)行靜態(tài)初始化塊,而不是在創(chuàng)建對象時才執(zhí)行.因此靜態(tài)初始化塊總是比普通初始化塊先執(zhí)行.通常靜態(tài)初始化塊用于對類變量執(zhí)行初始化處理 與普通初始化塊類型,系統(tǒng)在類初始化階段執(zhí)行靜態(tài)初始化塊時,不僅會執(zhí)行本類的靜態(tài)初始化塊,而且還會一直上 溯到java. lang. Object類,從最高父類開始一直到本類結束,依次執(zhí)行每個類中的靜態(tài)初始化塊。public class Test public static void main(String
53、 args)new Leaf ();new Leaf ();)class Root(staticSystem. out. printin ("Root 的靜態(tài)初始化塊”);)(System, out. println(*Root 的初始化塊");)public Root 0 System. out. printin CRoot 的無參構造器“);)class Mid extends Root(staticSystem, out, printin (*Mid 的靜態(tài)初始化塊“);)System. out. printin ("Mid 的初始化塊”);public M
54、idO System. out. printin (*Mid 的無參構造器”);)public Mid(String msg)/Hit this調(diào)用同一類中重載的構造器thisO ;System. out. printin (*Mid的帶有參數(shù)的構造器");)class Leaf extends MidistaticSystem. out. printin CLeaf 的靜態(tài)初始化塊“);)(System. out. println(*Leaf 的初始化塊“);)public Leaf 0 super("abc");System. out. printin (&q
55、uot;執(zhí)行 Leaf 的構造器”);)Root的靜態(tài)初始化塊 Mid的靜態(tài)初始化塊 Leaf的靜態(tài)初始化塊Root的初始化塊Root的無參構造器Mid的初始化塊Mid的無參構造能Mid的帶有參數(shù)的構造器Leaf的初始化塊 執(zhí)行Leaf的構造器Root的初始化塊Root的無參構造器Mid的初始化塊Mid的無參構造器Mid的帶有參數(shù)的構造器Leaf的初始化塊 執(zhí)行Leaf的構造器類初始化階段,先執(zhí)行最頂層父類的靜態(tài)初始化塊,然后依次向下,直到執(zhí)行當前類的初始化塊.對象初始化階段,先執(zhí)行最頂層父類的初始化塊、最頂層父類的構造器,然后依次向下,直到執(zhí)行當前類的初始化塊、 當前類的構造器Java系統(tǒng)加
56、羲并初始化某個類時,總是保證該類的所有父類(包括直接父類和間接父類)全部加載并進行初始化。靜態(tài)初始化塊和靜態(tài)成員變量的執(zhí)行順序與在源程序中排列順序相同。第五章面向對象下5.1 java增強的包裝類為了解決8種基本類型的變量不能當成Object類型變量使用的問題,java提供了包裝類的概念。除了 int和char有點例外,其他的基本數(shù)據(jù)類型對應的包裝類都是將其首字母大寫即可。自動裝箱和自動拆箱用法:public class AutoBoxingUnboxing (public static void main(String args) /直接把一個基本類型變量賦給In teger對象Integer in0bj=5;/直接把一個boolean類型變量賦給Objec t類型變量Object boolObj=true;直接把一個Integer對象賦給int類型變量int it=inObj;if(boolObj instanceof Boolean)/先把Object對象強制類型轉換為Boolean類型,再賦給boolean變量boolean b=(Boolean)boolObj;System, out- print In (b); )包裝類還可實現(xiàn)基本類型變量和字符串之間的轉換.把字符串類型的值轉換為基本類型的值有兩種方式:1)利用包裝
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 突發(fā)性耳聾診治現(xiàn)狀與建議
- 個人借款合同協(xié)議模板
- 普洱茶銷售合同模板
- 工程合作項目協(xié)議范例
- 分期付款合同2024年
- 專利申請委托協(xié)議
- 新版簡易房屋租賃合同
- 快遞承運合作協(xié)議范本
- 技術合同-資源授權協(xié)議
- 簡單版房屋出租合同范本
- 婦科護理進修匯報
- 新團員團課培訓課件
- 學?;@球教練外聘協(xié)議書
- 工作流程改進匯報
- 浙教版六年級勞動項目三-任務二《創(chuàng)意班規(guī)巧設計》課件
- 高思學校競賽數(shù)學課本五年級
- 油田開發(fā)方案及調(diào)整方案經(jīng)濟評價技術要求
- 康復科常見疾病護理常規(guī)2023版
- 英漢互譯單詞練習打印紙
- 2021年國家公務員考試《申論》真題(副省級)及參考答案(兩套答案)
- GA/T 2012-2023竊照專用器材鑒定技術規(guī)范
評論
0/150
提交評論