版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第三章課程教學(xué)與總結(jié)一、面向?qū)ο蠹夹g(shù)的三大特性:繼承性、多態(tài)性和封裝性封裝:是把數(shù)據(jù)和操作數(shù)據(jù)的方法捆綁在一起,避免外部的誤用。繼承:就是一個(gè)類復(fù)用另一個(gè)類的代碼。多態(tài)(方法的多態(tài)) :顧名思義,多種形態(tài)。java 中的多態(tài)分為編譯時(shí)多態(tài)和運(yùn)行時(shí)多態(tài)。兩個(gè)多態(tài)性的體現(xiàn): Overload (重載)和 Override (重寫)。重載是一個(gè)類中的多態(tài)性的一種體現(xiàn)。 如果在一個(gè)類中定義了多個(gè)同名的方法,它們或有不同的參數(shù)個(gè)數(shù)或有不同的參數(shù)類型, 則稱為方法的重載。 重載的方法可以改變返回值的類型。重載的方法徹底是兩個(gè)不同的方法。重寫是父類和子類之間多態(tài)性的另一種體現(xiàn)。 如果在子類中定義某方法與其父
2、類有相同的名稱和參數(shù), 我們說該方法被重寫。 子類的對(duì)象使用這個(gè)方法時(shí), 將調(diào)用子類中的定義, 對(duì)它而言,父類中的定義如同被“屏蔽”了。 如果依然想用父類的方法,之前要加 super 關(guān)鍵字。當(dāng)在派生類中重寫基類中 static 、final 、或 private 方法時(shí),實(shí)質(zhì)上是創(chuàng)建了一個(gè)新的方法。例題分析class Foo public int a;public Foo() a = 3;public int addFive() a += 5;return a;public int getA() return a;public classpublic int a;public Bar() a
3、 = 8;Bar extends Foo public intaddFive () this.a += 5;return a;public intgetA() return a;public static void main(String args) Foo foo = new Bar();/Foo foo = new Bar();foo是一個(gè)父類引用,他指向的是一個(gè)子類對(duì)象,這是一個(gè)向上轉(zhuǎn)型。System.out.println(foo.getA();/* 由于子類重寫了父類的addFive 和 getA一定是調(diào)用重寫的這個(gè),也就是子類的方法。System.out.println(Value
4、: + foo.a);方法,向上轉(zhuǎn)型對(duì)象調(diào)用這個(gè)方法時(shí)*/ /調(diào)用的是子類中的方法/直接 foo.a時(shí)訪問的是父類的成員。/* 在 new Bar()時(shí)堆內(nèi)存里會(huì)創(chuàng)建一個(gè) Bar 的對(duì)象,而 Bar 對(duì)象里面會(huì)有一個(gè)父類的對(duì)象, 然后 foo 引用會(huì)指向這個(gè)對(duì)象, 但是它只能看到這個(gè)對(duì)象里的父類對(duì)象的成員,不能操作子類新增的成員, */System.out.println(foo.addFive();/ 調(diào)用的是子類中的方法。輸出結(jié)果:8Value: 313Java 中 super 的用法與使用場(chǎng)合Java 中 super 用法:假設(shè)類 A 派生出子類 B,類 B 又派生出自己的子類C,則 B
5、是 C 的直接父類,而 A 是 C 的祖先類。 super 代表的就是直接父類。若子類的數(shù)據(jù)成員或成員方法名與父類的數(shù)據(jù)成員或成員方法名相同 ,當(dāng)要調(diào)用父類的同名方法或使用父類的同名數(shù)據(jù)成員時(shí) ,可用關(guān)鍵字 super 來指明父類的數(shù)據(jù)成員和方法。super 的使用方法有三種(1)用來調(diào)用直接父類的構(gòu)造方法,其使用形式如下:super (參數(shù))(2)用來訪問直接父類隱藏的數(shù)據(jù)成員,其使用形式如下:super. 數(shù)據(jù)成員(3)用來調(diào)用直接父類中被覆蓋的成員方法,其使用形式如下: super. 成員方法(參數(shù))例如:class a1int x=4;int y=1;public void Print
6、me()System.out.println(x=+x+ y=+y);System.out.println(class name: +this.getClass().getName();public class c5_13 extends a1int x;public void Printme()int z=super.x+6;super.Printme();System.out.println(I am an +this.getClass().getName();x=5;System.out.println( z=+z+ x=+x);public static void main(Strin
7、g arg)int k;a1 p1=new a1();c5_13 p2=new c5_13();p1.Printme();p2.Printme();運(yùn)行結(jié)果如下:x=4 y=1class name: a1x=4 y=1class name: c5_13I am an c5_13z=10 x=5二、回顧修飾符的使用Java 修飾符小結(jié)* 類修飾符Public :public 在所有類中可見,在其他包中可以用import 導(dǎo)入。缺省 就是沒有修飾符, 在同一個(gè)包中的類中可見 ,在其他包中不能用 import 導(dǎo)入。Abstract:本類不能被實(shí)例化Final :本類不能再聲明子類說明:1、每個(gè)編譯
8、單元(類文件)都僅能有一個(gè)public class2、public class的名稱(包含大小寫)必須和其類文件同名。3、一個(gè)類文件 (*.java)中可以不存在 public class。這種形式的存在的場(chǎng)景:如果我們?cè)谀硞€(gè)包內(nèi)撰寫一個(gè)class ,僅僅是為了配合同包內(nèi)的其他類工作。4、class 不可以是 private和 protected 。* 類成員變量的訪問權(quán)限:Public成員變量: 任何類都可以訪問到。但是從類的封裝性上來考慮將一個(gè)類的屬性定義成 public一般很少使用;Private成員變量 :只有類本身內(nèi)部的方法可以訪問類的private屬性。默認(rèn)成員變量 :包級(jí)可見,同
9、一個(gè)包內(nèi)的類可以訪問到這個(gè)屬性。protected 成員變量 :關(guān)鍵字所處理的是所謂“繼承”的觀念。子類及同一包的其他類可訪問。* 類的成員方法的訪問權(quán)限:public :所有類可見。pirvate:只有同一類內(nèi)部的方法可見。默認(rèn):包內(nèi)可見。protected:類內(nèi)及繼承可見。局部變量修飾符 (局部變量不能加上訪問權(quán)限修飾符, 局部變量本身就是一個(gè)訪問權(quán)限的設(shè)定,只能在局部調(diào)用。 )* Java 關(guān)鍵字 final、static使用總結(jié)Java 關(guān)鍵字 final、 static(一) final根據(jù)程序上下文環(huán)境, Java 關(guān)鍵字 final有“這是無法改變的”或者“終態(tài)的”含義,它可以修
10、飾非抽象類、非抽象類成員方法和變量。final類不能被繼承,沒有子類,final類中的方法默認(rèn)是final的。final方法不能被子類的方法覆蓋,但可以被繼承。final成員變量表示常量,只能被賦值一次,賦值后值不再改變。final不能用于修飾構(gòu)造方法。注意:父類的 private成員方法是不能被子類方法覆蓋的,因此 private類型的方法默認(rèn)是 final類型的。1、final類final類不能被繼承,因此 final類的成員方法沒有機(jī)會(huì)被覆蓋, 默認(rèn)都是 final的。在設(shè)計(jì)類時(shí)候,如果這個(gè)類不需要有子類,類的實(shí)現(xiàn)細(xì)節(jié)不允許改變,并且確信這個(gè)類不會(huì)載被擴(kuò)展,那么就設(shè)計(jì)為final類。2、
11、final方法如果一個(gè)類不允許其子類覆蓋某個(gè)方法,則可以把這個(gè)方法聲明為final方法。使用 final方法的原因有二:3、final變量(常量)用 final修飾的成員變量表示常量,值一旦給定就無法改變!4、final參數(shù)當(dāng)函數(shù)參數(shù)為 final類型時(shí),你可以讀取使用該參數(shù), 但是無法改變?cè)搮?shù)的值。(二) static被 static 修飾的成員變量和成員方法獨(dú)立于該類的任何對(duì)象。也就是說,它不依賴類特定的實(shí)例,被類的所有實(shí)例共享。用 public 修飾的 static 成員變量和成員方法本質(zhì)是全局變量和全局方法, 當(dāng)聲明它類的對(duì)象時(shí),不生成 static 變量的副本,而是類的所有實(shí)例共享
12、同一個(gè)static變量。static修飾的成員變量和成員方法習(xí)慣上稱為靜態(tài)變量和靜態(tài)方法,可以直接通過類名來訪問,訪問語法為:類名 . 靜態(tài)方法名 ( 參數(shù)列表 .)類名 . 靜態(tài)變量名1、static變量按照是否靜態(tài)的對(duì)類成員變量進(jìn)行分類可分兩種:一種是被 static 修飾的變量,叫靜態(tài)變量或類變量;另一種是沒有被 static 修飾的變量,叫實(shí)例變量。兩者的區(qū)別是:對(duì)于靜態(tài)變量在內(nèi)存中只有一個(gè)拷貝(節(jié)省內(nèi)存), JVM只為靜態(tài)分配一次內(nèi)存,在加載類的過程中完成靜態(tài)變量的內(nèi)存分配,可用類名直接訪問(方便),當(dāng)然也可以通過對(duì)象來訪問(但是這是不推薦的)。對(duì)于實(shí)例變量, 每創(chuàng)建一個(gè)實(shí)例, 就會(huì)
13、為實(shí)例變量分配一次內(nèi)存, 實(shí)例變量可以在內(nèi)存中有多個(gè)拷貝,互不影響(靈活)。2、靜態(tài)方法靜態(tài)方法可以直接通過類名調(diào)用,任何的實(shí)例也都可以調(diào)用。3、static和 final一塊用表示什么?static final用來修飾成員變量和成員方法,可簡(jiǎn)單理解為“全局常量”!對(duì)于變量,表示一旦給值就不可修改,并且通過類名可以訪問。對(duì)于方法,表示不可覆蓋,并且可以通過類名直接訪問。三、包應(yīng)用程序的創(chuàng)建; (舉例:教材p79)包 package包是 Java 提供的文件管理機(jī)制。包把功能相似的類,按照J(rèn)ava 的名字空間( namespace)命名規(guī)范,以壓縮文件的方式,儲(chǔ)存在指定的文件目錄中,達(dá)到有效管理
14、和提取文件的目的。在應(yīng)用軟件開發(fā)中,所有類都以包儲(chǔ)存和管理。包也是除 import 之外,另一個(gè)可以編寫在類之外的語句。 我們可以在程序的開始,利用關(guān)鍵字 package,將該程序創(chuàng)建成為包中的一個(gè)文件。例如:package com.classes.java;com.classes.java即代表包名,同時(shí)也代表文件目錄。因?yàn)樵趧?chuàng)建包文件的指令中, com.jclasses.java指定了生成文件的目錄。例如在窗口操作系統(tǒng)中,這個(gè)目錄即: C:comclassesjava1. 包命名規(guī)范為了確保包文件名稱的唯一性,Java 對(duì)應(yīng)用軟件開發(fā)者,尤其對(duì)軟件開發(fā)公司,在包的命名方面提出如下規(guī)范:1)
15、 包名全部用英文小寫字母。2) 必須符合 Java 合法命名語法格式。3) 通常使用倒寫的互聯(lián)網(wǎng)地址作為包名。如果仍然不能表示包文件名的唯一性時(shí),加入地區(qū)性標(biāo)識(shí)符。4) 避免使用 Java API 包名。例如 java.lang 、javax.swing 等。例 1.應(yīng)用 Java 包命名規(guī)范的例子?;ヂ?lián)網(wǎng)地址包名FreeSkyTcom.freeskytech例 2作為學(xué)習(xí)和培訓(xùn)為目的的編程實(shí)踐,建議使用具有清楚含義的文件目錄作為包名。如:C:javabookclassesch3作為儲(chǔ)存包文件的目錄,而包名為:ch122. 創(chuàng)建包文件1) IDE 中的包幾乎所有流行的Java IDE 都采用包
16、和項(xiàng)目機(jī)制來管理應(yīng)用程序的編寫和開發(fā)。從這一章開始,所有舉例程序都利用Jcreator的包來儲(chǔ)存和管理。下面以 Jcreator為例,討論如何在IDE 中設(shè)置包。Jcreator提供了許多方法設(shè)置包 , 如下列舉的是其典型步驟:1. 創(chuàng)建項(xiàng)目 Project 設(shè)定項(xiàng)目路徑命名項(xiàng)目模板的名稱 (project template )如輸入 Ch3。按下 Finish 。2.file new Java 源程序,在類體外寫package ch3;3. 編譯后自動(dòng)創(chuàng)建了子文件夾ch3( 一個(gè)用來儲(chǔ)存包類的子目錄.class文件 )package ch3;public class PackageTest1
17、 public void print() System.out.println(HereisPackageTest1message.);package ch3;public class PackageTest2 public void print() System.out.println(Here is Package Test 2 message.);import ch3.PackageTest1;import ch3.PackageTest2;public class PackageTestApp public static void main(String args) PackageTe
18、st1 myPackage = new PackageTest1();myPackage.print();PackageTest2 yourPackage = new PackageTest2(); yourPackage.print();2) 利用 CLASSPATH創(chuàng)建和使用包文件創(chuàng)建用來儲(chǔ)存生成的字節(jié)碼文件的目錄。例如:C:javabookclassesch12在要?jiǎng)?chuàng)建成包文件的程序開始,按照以上目錄,加入package 語句。 即:package ch3;public class PackageTest public void print() System.out.println(He
19、re is message from Package Test .);設(shè)立 CLASSPATH 。其目的是告訴Java 編譯器以及JVM 在哪里可以找到和裝載源代碼和字節(jié)代碼文件。 根據(jù)Java 規(guī)定, CLASSPATH必須轉(zhuǎn)向比包文件儲(chǔ)存目錄高一級(jí)的目錄。如在這個(gè)例子中,CLASSPATH應(yīng)當(dāng)是:C:javabookclasses;創(chuàng)建了的包文件,可以用import引入到程序中應(yīng)用(舉例教材p80)3) 使用包文件的另外一種常用方式是利用Java 的JAR文件 。JDK 的目錄C:Program FilesJavajdk1.7.0_04jrelibext允許以Java 壓縮文件, JAR
20、( JavaArchive )文件形式,儲(chǔ)存自定義包類。這種方式無需設(shè)立CLASSPATH 。JAR 文件可以包括多個(gè)包類,用來提高引入、編譯以及裝載效率。在編譯時(shí),Java 編譯器將首先自動(dòng)對(duì)引入的包文件解壓。舉例:package ch3;public class PackageTest1 public void print() System.out.println(Here is Package Test 1 message.);以及:package ch3;public class PackageTest2 public void print() System.out.println(H
21、ere is Package Test 2 message.);可按照如下步驟創(chuàng)建和引入JAR 文件:1. 創(chuàng)建儲(chǔ)存包文件的目錄。 與利用 CLASSPATH 創(chuàng)建包文件目錄的要求相同, 從總目錄開始,必須至少有 3 個(gè)子目錄。如:C:javabookclassesch32. 將包文件(源代碼文件)復(fù)制到以上目錄中。3. 分別編譯每個(gè)程序。4. 創(chuàng)建 JAR 文件。輸入如下 jar 指令:C:javabookclassesjar cvf ch12.jar ch*這個(gè)指令在當(dāng)前目錄中產(chǎn)生一個(gè)包括子目錄所有文件的名為ch3.jar 的壓縮文件。 三個(gè) jar 指令的選項(xiàng)cvf 的含義為: c創(chuàng)建J
22、AR 文件; v顯示創(chuàng)建過程信息;f跟隨的是jar文件名?!?* ”表示將包括源代碼在內(nèi)的程序都?jí)嚎s在JAR文件中。也可以利用如下指令只包括字節(jié)文件:C:javabookclassessjar cvf ch3.jar ch12*.class注意,一般JAR文件名使用小寫字母??梢允侨魏蜫ava合法標(biāo)識(shí)符。5.將創(chuàng)建的jar文件拷貝到JDK的子目錄中。6. 實(shí)現(xiàn)引入。任何程序都可以引入這個(gè)JAR文件中的包類。例如:import ch3.*;public class PackageJarTestApp / 引入所有包類public static void main(String args) Pac
23、kageTest1 myPackage = new PackageTest1();/利用引入的包類創(chuàng)建對(duì)象myPackage.print();/調(diào)用其方法PackageTest2 yourPackage = new PackageTest2();yourPackage.print();四、抽象類和接口interface(介紹完后,舉例)抽象類中可包含一般方法,也可包含抽象方法,但對(duì)于抽象方法只是聲明,并沒有代碼實(shí)現(xiàn), 具體的實(shí)現(xiàn)需要在派生的子類中重寫抽象方法。抽象類不可以實(shí)例化,抽象類可以不包括抽象方法但是含有抽象方法的類必須是抽象類。java抽象類的作用: 通過繼承它實(shí)現(xiàn)多態(tài), 后期綁定,
24、可以為將來要實(shí)現(xiàn)的東西做好接口,實(shí)現(xiàn)重用性。抽象類舉例:長(zhǎng)方體類圓柱體類球體類長(zhǎng):半徑:半徑:寬:高:高:計(jì)算面積:計(jì)算體積:計(jì)算面積:計(jì)算面積:計(jì)算體積:計(jì)算體積:分析:上述三個(gè)類之間不存在繼承關(guān)系,所以要分別定義三個(gè)類,在這三個(gè)類中分別定義他們的成員變量和方法。由于計(jì)算公式不同,所以方法就會(huì)不同,如果按照這種思路做,會(huì)使得程序代碼增大,出錯(cuò)率增加,降低編程效率。但是,上述三個(gè)類都屬于形狀類,這時(shí)我們可以通過使用抽象類,定義它們的變量和方法,然后分別在子類中進(jìn)行實(shí)現(xiàn)。abstract class sharppublic abstract void area();public abstract
25、 void volume();public abstract void show();class cuboid extends sharp /double a,b,c;cuboid(double a,double b,double c)this.a=a;this.b=b;長(zhǎng)方體this.c=c;public void area()double s=2*(a*b+a*c+b*c);System.out.println(長(zhǎng)方體的面積是: +s);public void volume()double v=a*b*c;System.out.println(長(zhǎng)方體的體積是: +v);public voi
26、d show()System.out.println(*);class cylinder extends sharp/圓柱體double h,r;cylinder(double h,double r)this.h=h;this.r=r;public void area()double s=2*Math.PI*r*h;System.out.println(圓柱體的面積是: +s);public void volume()double v=2*Math.PI*r*r*h;System.out.println(圓柱體的體積是: +v);public void show()System.out.pri
27、ntln(#);class sphere extends sharp/Double r;sphere (double r) this.r=r;public void area()Double s=4*Math.PI*r*r;System.out.println(球的面積是:public void volume()double v=(4.0/3)*Math.PI*r*r*r;System.out.println(球的體積是:球體+s);+v);public void show()System.out.println();public class example1 /公共類public stati
28、c void main(String args)cuboid cu=new cuboid(2.0,3.0,4.0);cu.area();cu.volume();cu.show();cylinder cy=new cylinder(3.0,4.0);cy.area();cy.volume();cy.show();sphere sp=new sphere(6.0);sp.area();sp.volume();sp.show();This 與 super 分別指著有繼承關(guān)系的子類和父類, this 出現(xiàn)在程序代碼中,指的是所在的該類當(dāng)前對(duì)象; super 指的是所繼承的超類對(duì)象。 This 與 su
29、per 均不用先聲明即可直接使用。Super 的使用有 3 種情況:1)用來訪問父類被隱藏的成員變量:super. 變量名;2)用來調(diào)用父類中被重寫的方法:super. 方法名(參數(shù));3)用來調(diào)用父類的構(gòu)造函數(shù):super( 參數(shù) ) ;接口:輪 船客運(yùn)工具客 輪Java 只允許單繼承,然而在日常生活中經(jīng)常會(huì)遇到多繼承問題,如上圖。解決的方法:采用接口。接口是抽象方法和常量值的定義的集合, 從本質(zhì)上講,接口是一種特殊的抽象類,這種抽象類中 只包含常量和方法的定義, 而沒有變量和方法的實(shí)現(xiàn),因此這些方法可以在不同的地方被不同的類實(shí)現(xiàn),而這些實(shí)現(xiàn)可以具有不同的行為(功能)。接口中的所有常量必須是
30、public static final,方法必須是public abstract,這是系統(tǒng)默認(rèn)的,不管你在定義接口時(shí),寫不寫修飾符都是一樣的。定義接口:修飾符 interface接口名 extends父接口列表 / 接口聲明數(shù)據(jù)類型常量名 =常量值 ;/常量域聲明/ 接口體/ 抽象方法聲明不必加 abstract ,亦被視為抽象返回類型 方法名 ( 參數(shù)表 );一個(gè)類只有一個(gè)直接父類,但可以實(shí)現(xiàn)多個(gè)接口。接口不是類,不能使用new運(yùn)算符實(shí)例化一個(gè)接口。Java 接口的方法只能是抽象的和公開的,Java 接口不能有構(gòu)造器,Java 接口可以有 public ,靜態(tài)的和 final 屬性。接口把方
31、法的特征和方法的實(shí)現(xiàn)分割開來。這種分割體現(xiàn)在接口常常代表一個(gè)角色,它包裝與該角色相關(guān)的操作和屬性,而實(shí)現(xiàn)這個(gè)接口的類便是扮演這個(gè)角色的演員。一個(gè)角色由不同的演員來演,而不同的演員之間除了扮演一個(gè)共同的角色之外,并不要求其它的共同之處。在一個(gè)等級(jí)結(jié)構(gòu)中的任何一個(gè)類都可以實(shí)現(xiàn)一個(gè)接口,這個(gè)接口會(huì)影響到此類的所有子類, 但不會(huì)影響到此類的任何超類。此類將不得不實(shí)現(xiàn)這個(gè)接口所規(guī)定的方法,而其子類可以從此類自動(dòng)繼承這些方法,當(dāng)然也可以選擇置換掉所有的這些方法,或者其中的某一些方法,這時(shí)候,這些子類具有了可插入性。我們關(guān)心的不是哪一個(gè)具體的類,而是這個(gè)類是否實(shí)現(xiàn)了我們需要的接口。* 創(chuàng)建一個(gè)接口,請(qǐng)使用
32、interface 關(guān)鍵字。* 接口的實(shí)現(xiàn)是指在一個(gè)類的聲明中使用關(guān)鍵字 implements。表示該類使用某個(gè)已定義的接口。接口舉例:nterface faceint NUM=100;double PI=3.14159;void calculate();class toface implements facedouble d;public void calculate()d=NUM*PI;public void show()System.out.println(計(jì)算的結(jié)果為: +d);public class jiekoupublic static void main(String args
33、)toface tf=new toface();tf.calculate();tf.show();五、變量的作用范圍與參數(shù)傳遞方式(一)變量的作用范圍變量的作用范圍可分為:全局作用域范圍、類作用域范圍、塊作用域范圍。定義在類里的, 就是成員變量, 在 java 里全局變量和成員變量是一個(gè)意思;定義在方法里就叫做局部變量。成員變量的范圍依賴他的訪問修飾符:public 、protected 、 private 、默認(rèn)( default)靜態(tài)成員域具有全局作用域范圍這四個(gè)修飾符的訪問權(quán)限如下表:-類內(nèi)部package 內(nèi)子類其他public允許允許允許允許protected允許允許允許不允許def
34、ault允許允許不允許不允許private允許不允許不允許不允許-三種類型變量: 1)類的屬性( 值域 );( 實(shí)例變量和靜態(tài)變量 )2)方法里的局部變量;3)方法的參數(shù)(同2)在一個(gè)函數(shù)或者代碼塊里定義的變量成為局部變量,局部變量在函數(shù)或者代碼塊被執(zhí)行時(shí)創(chuàng)建,在函數(shù)或者代碼塊結(jié)束時(shí)被銷毀,局部變量在進(jìn)行取值操作前必須被初始化或者進(jìn)行賦值操作,否則會(huì)出現(xiàn)編譯錯(cuò)誤。成員變量: 作為類的成員而存在,直接存在于類中局部變量:作為方法或者代碼塊里面的成員存在,存在于方法的參數(shù)列表和方法定義中。1. 局部變量在使用前必須被程序員主動(dòng)初始化,成員變量則會(huì)被系統(tǒng)提供一個(gè)默認(rèn)的初始值 (以下是各種數(shù)據(jù)類型的默
35、認(rèn)值:boolean falseint 0float 0.0fdouble 0.0dshort 0byte 0long 0 L所有對(duì)象引用類型變量默認(rèn)初始值為null ,即不指向任何對(duì)象。數(shù)組本身也是對(duì)象,所以沒有初始化的數(shù)組引用在自動(dòng)初始化后其值也是null 。),所以在語法上,類的成員變量可以定義后直接使用,局部變量在定義后先要賦值,然后才能使用。這正是 java 的特點(diǎn) ,極大的提高了代碼安全性。2成員變量可以被public,protect,private,static等修飾符修飾,而局部變量不可以。3成員變量存儲(chǔ)在堆中,局部變量存儲(chǔ)在棧中4存儲(chǔ)時(shí)間不同,局部變量只存在于代碼塊或者方法內(nèi)
36、,而全局變量則存在于這個(gè)類中(二)參數(shù)傳遞對(duì)于簡(jiǎn)單的數(shù)據(jù)類型 來說(基本數(shù)據(jù)類型常被稱為四類八種:四類:1 ,整型 2 ,浮點(diǎn)型 3 ,字符型 4 ,邏輯型八種:1,整型 3 種 byte ,short , int ,long2 ,浮點(diǎn)型 2 種 float,double3 ,字符型 1 種 char4 ,邏輯型 1 種 boolean), java 實(shí)現(xiàn)的是值傳遞,方法接收參數(shù)的值但不改變參數(shù)的值。如果要改變參數(shù)的值,則需要 引用類型傳遞( 除了四類八種基本類型外,所有的類型都稱為引用類型 ),因?yàn)橐妙愋蛡鬟f給方法的是數(shù)據(jù)在內(nèi)存中的地址,方法中數(shù)據(jù)的操作可以改變數(shù)據(jù)的值。值傳遞基本數(shù)據(jù)類型
37、傳遞都屬于值傳遞, 值傳遞是實(shí)參傳遞給形參的值形參發(fā)生改變而不影響實(shí)參。 引用傳遞 引用類型之間賦值屬于引用傳遞。引用傳遞傳遞的是對(duì)象的引用地址。引用傳遞:傳的是地址,就是將實(shí)參的地址傳遞給形參,形參改變了,實(shí)參當(dāng)然被改變了,因?yàn)樗麄冎赶蛳嗤牡刂?。?nèi)存分配 一個(gè)具有值類型( value type )的數(shù)據(jù)存放在 棧內(nèi)的一個(gè)變量中。即是在棧中分配內(nèi)存空間, 直接存儲(chǔ)所包含的值, 其值就代表數(shù)據(jù)本身。 值類型的數(shù)據(jù)具有較快的存取速度。一個(gè)具有引用類型( reference type )的數(shù)據(jù)并不駐留在棧中,而是存儲(chǔ)于堆中。棧中變量的內(nèi)容存放的是指向該引用的地址。 當(dāng)訪問一個(gè)具有引用類型的數(shù)據(jù)時(shí),
38、需要到棧中檢查變量的內(nèi)容, 該變量引用堆中的一個(gè)實(shí)際數(shù)據(jù)。 引用類型的數(shù)據(jù)比值類型的數(shù)據(jù)具有更大的存儲(chǔ)規(guī)模和較低的訪問速度。java 中的垃圾回收機(jī)制 當(dāng)一個(gè)堆內(nèi)存中的對(duì)象沒有被棧內(nèi)存中表示地址的值“引用”時(shí),這個(gè)對(duì)象就被稱為垃圾對(duì)象,它無法被使用但卻占據(jù)著內(nèi)存中的區(qū)域,好比這樣:String s = new String( “person ”); s = new String( “man” ); s 本來是指向堆內(nèi)存中值為 person 的對(duì)象的,但是 s 突然討厭 person 了,它指向了堆內(nèi)存中的 man對(duì)象了, person 就像一個(gè)孤兒一樣被 s 遺棄了,但是 person 比孤兒
39、還要慘,因?yàn)闆]有什么能找的到它,除了位高權(quán)重的垃圾回收器,它會(huì)豪不留情把垃圾們清理走,并且無情的銷毀,以便釋放內(nèi)存。六、遞歸;(可用配套課件)所謂遞歸,是一種方法(函數(shù))調(diào)用自已編程技術(shù),遞歸就是程序設(shè)計(jì)中的數(shù)學(xué)歸納法。當(dāng)然,遞歸不會(huì)無休止地調(diào)用下去,它必然有一個(gè)出口,當(dāng)滿足條件時(shí)程序也就結(jié)束了。 采用遞歸, 是因?yàn)樗鼜母拍钌虾?jiǎn)化了問題,而不是因?yàn)樗岣咝省_f歸使規(guī)模逐漸降低的方式解決問題,以這種統(tǒng)一的方式解決足夠復(fù)雜的問題。例如,數(shù)學(xué)中對(duì)于N!的定義是:1(當(dāng) N=0時(shí))N!=N*(N-1)! (當(dāng) N0時(shí) )這個(gè)定義是遞歸的,即在N!=N*(N-1)!中, (N-1)!實(shí)際上是N!的減1
40、 遞推。對(duì)于這樣的問題,我們可以構(gòu)造循環(huán)來求解,即用1*2*3*(n -1) *n的算式求得結(jié)果。例如,求 4!的過程可表示成圖所示的形式。4!4*3!3* 2!2* 1!1* 0!成員方法的遞歸引用就是指在一個(gè)方法中直接或間接引用自身的情況。例如:int f1(int n)int p;p=f1(n-1)returnp;上例中,方法f1( )中引用了f1( )本身,這種引用是直接引用。int f1(int n)int f2(int m)int p;int s;p=f2(n-1);s=f1(m+2);return p;return s;上述寫法是間接引用。例 1:編程計(jì)算 4!的值。public
41、 class c4staticintfac(int n) int fa; if(n=0)fa=1;elsefa=n*fac(n-1);/遞歸引用自身return fa;public static void main(String args) int n=4;int f1=fac(n);/引用 fac( )方法System.out.println(4!=+f1);該程序的輸出結(jié)果是:4!=24例 2. 編程求出 Fibonacci數(shù)列的第 8 項(xiàng)public class c5public static void main(String args) int n=8;int f8=fibo(n);System.out.println(f8=+f8);static int fibo(int n) if(n=1)return 1;else if(n=2)return 1;else r
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度建筑設(shè)施設(shè)備定期檢查維修合同3篇
- 二零二五年度海參產(chǎn)品跨境電商物流解決方案合同2篇
- 2024年甲方乙雙方關(guān)于停車場(chǎng)清潔維護(hù)合同
- 二零二五年度影視剪輯師國(guó)際項(xiàng)目聘用合同范本3篇
- 2025年度農(nóng)業(yè)現(xiàn)代化項(xiàng)目勞動(dòng)合同范本2篇
- 2024年高新技術(shù)企業(yè)項(xiàng)目經(jīng)理全權(quán)委托承包合同3篇
- 二零二五年度智能家居系統(tǒng)銷售安裝合同3篇
- 2025年度消防工程設(shè)計(jì)咨詢勞務(wù)承包合同范本3篇
- 2024金融機(jī)構(gòu)與客戶的委托理財(cái)合同
- 2024年版夫妻雙方自愿離婚合同文檔版B版
- 教育管理學(xué)課件-管理、教育管理和教育管理學(xué)之概述
- 2025年廣西事業(yè)單位聯(lián)考招聘高頻重點(diǎn)提升(共500題)附帶答案詳解
- 真需求-打開商業(yè)世界的萬能鑰匙
- 2025五金配件購(gòu)銷合同范本
- 2025年中儲(chǔ)糧儲(chǔ)運(yùn)限公司公開招聘高頻重點(diǎn)提升(共500題)附帶答案詳解
- AS16571992固定平臺(tái)走道樓梯與梯子的設(shè)計(jì)施工與安裝
- 《鋰離子電池用二氟草酸硼酸鋰》
- 【MOOC】《形勢(shì)與政策》(北京科技大學(xué))中國(guó)大學(xué)MOOC慕課答案
- 東方電影學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 安徽省安慶市迎江區(qū)2023-2024學(xué)年四年級(jí)上學(xué)期期末數(shù)學(xué)試卷
- 護(hù)理教學(xué)基本方法與技巧
評(píng)論
0/150
提交評(píng)論