版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
課程概況學(xué)習(xí)者先修課背景使用教材:Java程序設(shè)計(jì)學(xué)時(shí)80作業(yè)與實(shí)驗(yàn)要求教材目錄第一章Java語言概述與語言基礎(chǔ)第二章類和對(duì)象第三章類的層次結(jié)構(gòu)第四章Java資源庫第五章集合類第六章流與文件處理第七章異常第八章多線程第九章網(wǎng)絡(luò)編程第十章圖形用戶界面設(shè)計(jì)第11章JSP開發(fā)基礎(chǔ)第12章JDBC數(shù)據(jù)庫訪問技術(shù)第1章Java語言概述與語言基礎(chǔ)XXXX1.1Java概述1.1.1 Java的面向?qū)ο筇匦?.1.2 Java的跨平臺(tái)和可移植特性1.1.1 Java語言的面向?qū)ο筇匦訨ava是一個(gè)完全面向?qū)ο蟮恼Z言。AlanKay總結(jié)了Smalltalk的五項(xiàng)基本特征。Smalltalk是最早獲得成功的面向?qū)ο蟮木幊陶Z言,也是Java技術(shù)發(fā)展所依賴的基礎(chǔ)之一。這些特征代表了純的面向?qū)ο蟮木幊谭椒ǎ喝f物皆對(duì)象。程序就是一組相互之間傳遞消息,告訴對(duì)方該干些什么的對(duì)象。每個(gè)對(duì)象都利用別的對(duì)象來組建它自己的記憶。也即是在已有對(duì)象的基礎(chǔ)上去構(gòu)建新的對(duì)象。對(duì)象都有類型。可以看作類可以提供功能,每個(gè)類都提供了一些方法。所以類和類之間的區(qū)分可看作他們各自能提供哪些方法。所有屬于同一類型的對(duì)象能接受相同的消息。1.1.2 Java的跨平臺(tái)和可移植特性
一段java源程序編輯完畢后,以*.Java的文件名形式保存。通過編譯器編譯成二進(jìn)制代碼,以*.class的文件名形式存在。通過JRE,能使之運(yùn)行在不同的操作系統(tǒng)之上。Java程序執(zhí)行步驟如圖1-1所示。這種運(yùn)行方式使得跨平臺(tái)成為可能。java源程序:*.javajava字節(jié)碼文件:*.class運(yùn)行結(jié)果編譯解釋執(zhí)行圖1-1Java程序執(zhí)行步驟正如.EXE文件在Windows操作系統(tǒng)下可以被執(zhí)行,是因?yàn)閃indows提供了這種EXE文件的執(zhí)行環(huán)境。而.class文件不能被Windows直接“接受”,需要有java運(yùn)行時(shí)環(huán)境,即JRE。所以我們可以使用同一個(gè).class文件,運(yùn)行在不同操作系統(tǒng)的機(jī)器上。當(dāng)然前提是這些機(jī)器都安裝了和自己操作系統(tǒng)配套的JRE。1.2 Java的開發(fā)工具1.2.1 JDK概述1.2.2 JDK的安裝與配置1.2.3 開發(fā)工具Eclipse1.2.1 JDK概述使用Java語言開發(fā)的Javaapplication類型程序和applet類型程序在運(yùn)行狀態(tài)下需要有Java運(yùn)行時(shí)環(huán)境(JavaRuntimeEnvironment,JRE)。而開發(fā)Javaapplication類型程序和applet類型程序則需要Java開發(fā)工具包(JavaDevelopmentKit,JDK)。JDK是作為Java平臺(tái)標(biāo)準(zhǔn)版本(JavaPlatform,StandardEdition,JavaSE)發(fā)行的產(chǎn)品1.2.2 JDK的安裝與配置JDK的系列版本可于Oracle網(wǎng)站下載。/technetwork/java/javase/downloads/index.html本例中,我們可以使用較為簡單的文本編輯器:記事本,編輯一個(gè)簡單的Java源程序,Pro1_1:源文件one.java:publicclassone{publicstaticvoidmain(String[]args){System.out.println("hello!EveryOne");}}從這個(gè)簡單的程序可以看到,和c語言相較,程序的入口仍然是main方法,但是main方法本身又被包含在一個(gè)這樣的程序框架中:publicclassone{//程序代碼}這是因?yàn)?,使用Java語言編寫的程序都必須以一個(gè)“class”為單位,“class”就是類,所以C語言程序的基本組成單位是函數(shù),而java是類。面向?qū)ο蟮木幊趟季S中,要完成從顯示設(shè)備上輸出任意字符。就要考慮“哪個(gè)對(duì)象提供了這個(gè)功能?”在Java中,是輸出流對(duì)象,“System.out”可以得到一個(gè)輸出流對(duì)象,輸出流對(duì)象的println方法可以用于從控制臺(tái)輸出相應(yīng)數(shù)據(jù)。本程序只有一個(gè)類,類的名字是符合Java語法規(guī)定的自定義標(biāo)識(shí)符,one。標(biāo)識(shí)符用于變量、常量、方法、對(duì)象、類、方法的名稱等。一個(gè).java源程序文件必須有一個(gè)修飾符為public的類,且類名和文件名須保持一致;Java程序的入口是main方法,一個(gè)類只能有一個(gè)main方法。且main方法必須定義在類里;如果脫離one這個(gè)類的定義,而只存在“main”,是不合法的。main方法有其特殊性,一般普通方法也同樣只能定義在某個(gè)類中。此例main方法因?yàn)槠涮厥庑?,它的三個(gè)修飾符是固定不變的,是一個(gè)公有的靜態(tài)的無返回值的方法。因?yàn)槠涫庆o態(tài)方法,所以可以直接作為程序的入口而被執(zhí)行。將one.java放置在d:\。該文件的全名為:d:\one.java在d:\將出現(xiàn)one.class文件。Java應(yīng)用:桌面應(yīng)用程序舉例:1Java應(yīng)用:桌面應(yīng)用程序舉例:2Java應(yīng)用:Android應(yīng)用程序舉例1.2.3 開發(fā)工具Eclipse1.3 Java語言基礎(chǔ)1.3.1 一個(gè)簡單的Java程序1.3.2 關(guān)于main方法的參數(shù)1.3.3 基本數(shù)據(jù)類型1.3.4 常量和變量1.3.5 流程控制語句1.3.6 枚舉1.3.7 數(shù)組語言基礎(chǔ)概述如果程序中由一系列函數(shù)組成,程序的功能由一系列的函數(shù)調(diào)用來完成,這是一種面向過程式的編程思想,如果程序的功能完全由一系列對(duì)象和對(duì)象之間的交互完成,這樣則屬于面向?qū)ο蟮木幊趟枷敕懂?。Java在面向?qū)ο蟪绦蛟O(shè)計(jì)的支持上比C++更進(jìn)了一步,在Java程序中,所有的方法、數(shù)據(jù)必須定義在類中。如希望類似于C++那樣定義在類體外,則會(huì)出現(xiàn)語法錯(cuò)誤。本章將不涉及到如何以面向?qū)ο蟮乃枷雭碓O(shè)計(jì)有著良好面向?qū)ο蟪绦蚪Y(jié)構(gòu)的程序,這些請(qǐng)參見第2章、第3章。作為語言基礎(chǔ),本節(jié)將重點(diǎn)介紹Java語言中的基本數(shù)據(jù)類型、流程控制、枚舉、數(shù)組等的基礎(chǔ)應(yīng)用。并通過一個(gè)簡單Java程序的講解,使學(xué)習(xí)者能認(rèn)識(shí)基本的Java程序結(jié)構(gòu)。這些語言基礎(chǔ)將是后續(xù)知識(shí)的學(xué)前預(yù)備,如流程控制語句用于方法(函數(shù))內(nèi)部編程,枚舉、數(shù)組作為基本的數(shù)據(jù)組織形式來進(jìn)行待操作數(shù)據(jù)的設(shè)計(jì)等。這些語言基礎(chǔ)概念及應(yīng)用無論是面向過程式的程序設(shè)計(jì)或是面向?qū)ο蟮某绦蛟O(shè)計(jì),都是作為語言基礎(chǔ)來先行學(xué)習(xí)的,如學(xué)習(xí)者已有其他高級(jí)語言的基礎(chǔ),可在本節(jié)進(jìn)行如Java關(guān)鍵字等的基本了解之后,進(jìn)入到后續(xù)的學(xué)習(xí)。1.3.1Java代碼的基本格式修飾符class類名{ /*程序代碼*/}1.3.2 一個(gè)簡單的Java程序【例1?1】一個(gè)簡單的HelloWorld程序publicclassone{ publicstaticvoidmain(String[]args){System.out.println("hello!EveryOne”);}}1.3.2 關(guān)于main方法的參數(shù)使用控制臺(tái)命令運(yùn)行該程序時(shí),需要輸入?yún)?shù),此處為2個(gè)參數(shù),參數(shù)值分別為“one”、“two”javaoneonetwo輸出結(jié)果為:onetwoHello!Pro1-3:one.javapublic
classone{
public
static
voidmain(String[]args) {System.out.println(args[0]+args[1]+"Hello!"); }}1.3.3 基本數(shù)據(jù)類型Java編程語言有兩種數(shù)據(jù)類型:基本數(shù)據(jù)類型和引用數(shù)據(jù)類型。類類型、接口類型、數(shù)組類型均屬于引用類型(將在后續(xù)章節(jié)詳細(xì)講述)。boolean、int、float等均屬于值類型基本數(shù)據(jù)類型的變量可存儲(chǔ)相應(yīng)類型的值。和整數(shù)相關(guān)的類型包括byte,short,int,long,分別按8位,16位、32位、64位存儲(chǔ)。浮點(diǎn)型數(shù)據(jù)類型包括32位的float和64位的double布爾類型為boolean,只能取值為true和false如和整數(shù)相關(guān)的類型及存儲(chǔ)范圍為:?byte,–128to127?short,–32768to32767?int,–2147483648to2147483647?long,–9223372036854775808to9223372036854775807?char,0to65535 publicclassTest{ publicstaticvoidmain(String[]args){ byteb=127; shorts=32767; inti=2147483647; intj=1; intq=i+j;//-2147483648 intk=2; intp=j+k;//3 longl=9223372036854775807L; charc='c'; System.out.println("q的值為"+q); System.out.println("p的值為"+p); System.out.println("thecharactaraftercis="+(char)(c+1)); System.out.println("thelongestnumberis="+l); }}【例1?3】基本數(shù)據(jù)類型應(yīng)用示例1.3.4 常量和變量常量一般稱為不可改變的量,如"你好\n同學(xué)!"是一個(gè)字符串常量;你好同學(xué)!public
classone{
public
static
voidmain(String[]args) { System.out.println("你好\n同學(xué)!"); }}變量變量一般由一個(gè)標(biāo)識(shí)符表示,且需要定義其類型。變量可以存儲(chǔ)值,且值是可以通過賦值等操作進(jìn)行改變。下例中i、s、schoolName均是變量。wpuicclassGlobal{
public
static
int
i=100;
public
staticStrings="wpuic";}public
classexampleString{
public
static
voidmain(String[]args) { StringschoolName="whu";
intnameLenth=schoolName.length();
if(nameLenth>=Global.s.length()) System.out.println(nameLenth);
elseSystem.out.println(Global.s); }}Java的全局變量Java的全局變量不能在所有類之外定義,只能通過在一個(gè)類中定義公有、靜態(tài)的變量.public
classone{
public
static
voidmain(String[]args) { System.out.println(Global.i); }}classGlobal{
public
static
int
i=100;}運(yùn)算符和表達(dá)式-算數(shù)運(yùn)算符符號(hào)功能示例+正號(hào)、加+5、1+2=3-負(fù)號(hào)、減-5、
4-3=1*乘2*5=10/除5/2=2(整除特性:兩個(gè)整數(shù)相除結(jié)果仍為整數(shù))%取余5%2=1++自增a=1時(shí),a++或++a
對(duì)于a變量的值無差別都為2--自減b=1時(shí),b--或--b對(duì)于b變量的值無差別都為0運(yùn)算符和表達(dá)式-邏輯運(yùn)算符符號(hào)功能說明&、&&與、邏輯與操作數(shù)同為true時(shí)結(jié)果為true,其余為false|、||或、邏輯或操作數(shù)同為false時(shí)結(jié)果為false,其余為true^異或相同為false,不同為true!非!true為false,!false為true運(yùn)算符的優(yōu)先級(jí)略1.3.5 流程控制語句1.if語句2.if-else語句3.switch-case語句4.for循環(huán)if-else語句importjava.util.*;public
classone{
public
static
voidmain(String[]args) { Scannerscan=newScanner(System.in);
intscore=scan.nextInt();
if(score<60) { System.out.println("Sorry!"); }
else
{ System.out.println("pass!"); System.out.println("bye!"); } }}P12-P15略1.3.6 枚舉當(dāng)我們定義一個(gè)int類型的變量i時(shí)候,i可以在限定的范圍內(nèi)取值;如果我們希望某個(gè)類型,它能被設(shè)定的取值是自己限定的。那么可以通過定義枚舉類型的方式來實(shí)現(xiàn)。定義枚舉類型需要使用enum關(guān)鍵字。enumSeason{spring,summer,fall,winter}public
classSeasons{
public
static
voidmain(String[]args) { Seasons1=Season.fall; System.out.println(s1.ordinal()); System.out.println(()); }}2fall1.3.7 數(shù)組1.數(shù)組相關(guān)概念2.數(shù)組的創(chuàng)建和使用3.訪問數(shù)組中的元素4.對(duì)象數(shù)組1.3.7 數(shù)組1.數(shù)組相關(guān)概念數(shù)組可以管理一堆相同類型的元素。如果數(shù)組的元素的類型是T。則數(shù)組的類型就是T[]。所有的數(shù)組對(duì)象都會(huì)有一個(gè)成員變量(字段):length。是int類型。該字段的值是創(chuàng)建數(shù)組類的對(duì)象時(shí)候指定的。2.數(shù)組的創(chuàng)建和使用int[]a=new
int[11];創(chuàng)建了一個(gè)int[]類型的數(shù)組,實(shí)質(zhì)是創(chuàng)建了一個(gè)數(shù)組對(duì)象,這個(gè)數(shù)組對(duì)象可以存儲(chǔ)int型的數(shù)據(jù),11是指定這個(gè)數(shù)組對(duì)象可以存儲(chǔ)11個(gè)int數(shù)據(jù),也即是我們常說的數(shù)組的長度為11。int[]a={1,2};此處隱式指定了數(shù)組的長度為2,且數(shù)組對(duì)象中的兩個(gè)int型的數(shù)據(jù)的值分別為1和2。3.訪問數(shù)組中的元素
public
classTestArray{
public
static
voidmain(String[]args){
int[]a=new
int[10];
int[]b=a; System.out.println("個(gè)數(shù)為:"+a.length);
for(inti=0;i<b.length;i++) { a[i]=i*10; }
for(inti=0;i<a.length;i++) { System.out.println(a[i]); } }}運(yùn)行結(jié)果為:個(gè)數(shù)為:1001020304050607080900102030405060708090ab引用一種特別的for循環(huán)public
classTestArray{
public
static
voidmain(String[]args) {
intcount=(int)(Math.random()*10);
inta[]=new
int[count]; System.out.println("個(gè)數(shù)為:"+a.length);
for(inti=0;i<a.length;i++) { a[i]=(int)(Math.random()*100); }
for(intvalue:a) { System.out.println(value); } }}個(gè)數(shù)為:8212954171216356返回帶正號(hào)的double
值,該值大于等于0.0
且小于1.0
212954171216356a4.對(duì)象數(shù)組在程序運(yùn)行時(shí),數(shù)組是作為一個(gè)對(duì)象存在的,對(duì)象數(shù)組指這個(gè)數(shù)組中管理的元素本身是一個(gè)個(gè)的對(duì)象,這些對(duì)象屬于某個(gè)類。classValue{
inti;
public
intGetMultiple() {returni*i;}}public
classTestArray{
public
static
voidmain(String[]args) {
intcount=(int)(Math.random()*10); Value[]av=newValue[count+1];
for(inti=0;i<av.length;i++) { av[i]=newValue(); av[i].i=(int)(Math.random()*100); }
for(Valueval:av) { System.out.println("val="+val.i+"Multipale="+val.GetMultiple()); } }}val=83Multipale=6889val=35Multipale=1225val=63Multipale=3969val=77Multipale=5929val=73Multipale=5329val=40Multipale=1600val=86Multipale=739683356377734086av第2章類和對(duì)象本章目錄2.1 定義Java的類2.2 創(chuàng)建對(duì)象2.3 方法調(diào)用2.4 訪問數(shù)據(jù)成員2.5 包的概念2.1 定義Java的類2.1.1 類的基本結(jié)構(gòu)2.1.2 定義初始化2.1.3 構(gòu)造方法2.1.4 方法重載2.1.1 類的基本結(jié)構(gòu)一個(gè)Java類形式上包括兩個(gè)部分:類首說明和類體類首說明形式為:[修飾符]class類名[extends父類名][implements接口名列表]類體則可以包含構(gòu)造方法、數(shù)據(jù)成員、方法成員等。Pro2_2:
classPoint {
private
intx,y; Point(intx,inty) {
this.x=x;
this.y=y; }
public
intGetX() {
returnx; }
public
voidSetX(intxvalue) { x=xvalue; } }例如:Pro2_1:classSimple{inti;}2.1.2 定義初始化定義初始化是指當(dāng)類的任何對(duì)象被創(chuàng)建的時(shí)候,一定會(huì)執(zhí)行定義初始化語句,使得對(duì)象的數(shù)據(jù)成員可以有指定的初始值。定義初始化的形式為:數(shù)據(jù)類型變量名=初始值;對(duì)象一旦被創(chuàng)建,這些數(shù)據(jù)成員即有了初始值
定義初始化為每個(gè)新創(chuàng)建的對(duì)象的屬性值提供了一個(gè)初始值,或者叫作默認(rèn)值。
Pro2_3:classTest{inti;intj=10;}publicclassTestInit{publicstaticvoidmain(String[]args){Testd=newTest();System.out.println("i的值為:"+d.i);System.out.println("j的值為:"+d.j);}}i的值為:0j的值為:10
補(bǔ)充:classpoint{
staticpointp1=newpoint();
intx=10;
inty=20;
voidshow(){ System.out.println(p1.y); }}public
classTest{
public
static
voidmain(String[]args) { pointtemp=point.p1; temp.show(); }}2.1.3 構(gòu)造方法數(shù)據(jù)成員可以通過定義初始化來保證對(duì)象被創(chuàng)建后,屬于某對(duì)象的數(shù)據(jù)成員能夠一定設(shè)為指定的值。那么如果我們同時(shí)也希望對(duì)象被創(chuàng)建的時(shí)候,有些行為(方法)是一定能夠被執(zhí)行,則需要用到構(gòu)造方法。構(gòu)造方法一般用于確保在創(chuàng)建對(duì)象時(shí)能實(shí)施一些初始化的行為,例如判斷初始值是否合法等。2.1.3 構(gòu)造方法classFather{Father(){System.out.println("callme!");}voidspeak(){System.out.println("IamFather");}}publicclassTest{publicstaticvoidmain(String[]args){Fatherf=newFather();f.speak();}}
callme!IamFather構(gòu)造方法能確保某些行為一定被執(zhí)行構(gòu)造方法用于數(shù)據(jù)的初始化classTest{
int
i;
int
j=10; Test(intx1,intx2) { i=x1;j=x2;}}public
classTestInt{
public
static
voidmain(String[]args){ Testd=newTest(1,2); System.out.println("i的值為:"+d.i); System.out.println("j的值為:"+d.j); }}i的值為:1j的值為:2Pro2_4:public
classTestInit{
public
static
voidmain(String[]args) {
Testd=new
Test(); d.init(); System.out.println("點(diǎn)的x初始值為:"+d.p.x); }}
點(diǎn)未被正確初始化!點(diǎn)的x初始值為:-12.1.3 綜合實(shí)例classPoint{ intx=-1,y=10;}class
Test{ Pointp=newPoint();
voidinit() {
if((p.x<0)||(p.y)<0) System.out.println("點(diǎn)未被正確初始化!"); }} -110Pxyd創(chuàng)建的Test的實(shí)例創(chuàng)建的Point實(shí)例改造后的Pro2_4:public
classTestInit{
public
static
voidmain(String[]args) {
Testd=new
Test(); System.out.println("點(diǎn)的x初始值為:"+d.p.x); }}class
Test{ Pointp=newPoint();
Test() {
if((p.x<0)||(p.y)<0) System.out.println("點(diǎn)未被正確初始化!"); }} classPoint{ intx=-1,y=10;}點(diǎn)未被正確初始化!點(diǎn)的x初始值為:-12.1.4 方法重載很多時(shí)候,我們可能需要設(shè)計(jì)多個(gè)方法,它們要完成的功能相似,但接收參數(shù)的類型或個(gè)數(shù)不同。為了使設(shè)計(jì)更為合理,將每個(gè)方法取不同的名字將會(huì)給類的使用者帶來不便和混淆。所以我們可以使用方法重載的方式來進(jìn)行這些方法的設(shè)計(jì)。例如:第1組:
intgetMax(inti1,inti2)
intgetMax(int[]a)例如:第2組:voidinitCircle(pointx,intradius)voidInitCircle(intx,inty,intRadius)對(duì)于重載方法的調(diào)用i1*i2=200i1+i2=30i1*i2=200public
classTest{
public
static
voidmain(String[]args){ onet=newone(); t.calculate(10,20); t.calculate(10,20,"*"); }}classone{
voidcalculate(inti1,inti2,Stringoper) {if(oper.equals("*")) System.out.println("i1*i2="+i1*i2);}
voidcalculate(inti1,inti2){System.out.println("i1*i2="+i1*i2+"i1+i2="+(i1+i2));}}類的構(gòu)造方法的設(shè)計(jì)目標(biāo)均是為了構(gòu)建對(duì)象。待構(gòu)建的初始對(duì)象從完整性上可以存在著不同的程度??梢酝ㄟ^構(gòu)建對(duì)象時(shí)可接收的參數(shù)的類型和個(gè)數(shù)的不同,根據(jù)待構(gòu)建對(duì)象的不同程度的完整性要求,進(jìn)行不同的構(gòu)造。構(gòu)造方法的重載就是典型的方法重載概念的使用。例如:第二組:Circle(Pointx,intRadius)Circle(intx,inty,intRadius)Circle(intx,inty)Circle()請(qǐng)找出下列程序代碼的錯(cuò)誤,并修改main,使之輸出半徑的值publicclassTest{publicstaticvoidmain(String[]args){Circlec=newCircle(1,1,10);}}classCircle{intx,y;intr;Circle(intx,inty){this.x=x;this.y=y;}}。Java類庫中的大量類均提供了包括構(gòu)造方法、一般方法在內(nèi)的重載列表。程序員在使用類時(shí)候參照重載列表根據(jù)需要來使用相應(yīng)方法。
String()
初始化一個(gè)新創(chuàng)建的String
對(duì)象,使其表示一個(gè)空字符序列。String(String
original)
初始化一個(gè)新創(chuàng)建的String
對(duì)象,使其表示一個(gè)與參數(shù)相同的字符序列;換句話說,新創(chuàng)建的字符串是該參數(shù)字符串的副本。String(StringBuffer
buffer)
分配一個(gè)新的字符串,它包含字符串緩沖區(qū)參數(shù)中當(dāng)前包含的字符序列。作為類的設(shè)計(jì)者,可以將以同名的形式將功能相同或相近、但接受參數(shù)的類型或個(gè)數(shù)不同的一些方法組織在一起,使得類的功能抽象更為合理;類的使用者更為方便。
一般以方法的參數(shù)的個(gè)數(shù)、順序、參數(shù)的類型來區(qū)分重載方法
以下構(gòu)造方法的重載中,哪些不正確?
Pro2_5:classtest{ test(){} test(Strings){}
test(ints){}
test(ints2){} test(ints2,Strings3){} test(Strings3,ints2){}}Pro2_5中,劃線部分是不允許的,因?yàn)閰?shù)類型均為int,Java會(huì)認(rèn)為試圖取定義兩個(gè)同樣的方法,這是不符合語法規(guī)范的。2.2 創(chuàng)建對(duì)象2.2.1 對(duì)象的創(chuàng)建2.2.2 使用對(duì)象2.2.1 對(duì)象的創(chuàng)建類為動(dòng)態(tài)創(chuàng)建的類實(shí)例(instance)提供了定義,實(shí)例也稱為對(duì)象(object)。Java中所有的類都屬于引用類型.1.2.3中所述的基本數(shù)據(jù)類型又稱為值類型。值類型的變量中存儲(chǔ)實(shí)際的值(數(shù)據(jù)),引用類型的變量中存儲(chǔ)引用(reference),這個(gè)引用用于指向?qū)嶋H數(shù)據(jù)(對(duì)象)。所以我們?cè)趧?chuàng)建Java類的對(duì)象時(shí),會(huì)看到類似如下的語句: Pointp=newPoint();2.2.2 使用對(duì)象使用Java數(shù)據(jù)類型的值變量即是:變量定義以后可以進(jìn)一步定義圍繞該變量的操作,從而使用該變量。例如:number++;number=100;使用Java數(shù)據(jù)類型中類的變量,即是通過這個(gè)變量值-針對(duì)某對(duì)象的引用,來操作這個(gè)對(duì)象。輸出為:10classPoint{
private
intx,y; Point(intxValue,intyValue) { x=xValue; y=yValue; };
public
intGetX() {
returnx; }
public
intGetY() {
returny; } public
voidSetY(intvalue) { y=value; } public
voidSetX(intvalue) { x=value; }}public
classOperation{
public
static
voidmain(String[]args) { Pointp=newPoint(10,20); System.out.println(p.GetX()); }}1020PPro2_7:classSimple{
inti; }public
classTest{
public
static
voidmain(String[]args) { Simplei1,i2; i1=newSimple(); i1.i=20; i2=i1; i2.i=30; System.out.println(i1.i);}}輸出為:30classSimple{ inti;}publicclassTest{publicstaticvoidmain(String[]args){Simplei1,i2;i1=newSimple();i1.i=20;i2=newSimple();i2.i=30;System.out.println(i1.i);}}輸出為:20例:對(duì)象的創(chuàng)建和使用public
static
voidmain(String[]args){ Pointp1=newPoint(10,20); Pointp2=newPoint(100,200); Pointp3=p2; p2=p1; p2.setX(101); p2=p3; System.out.println(p1.getX()); System.out.println(p2.getX()); System.out.println(p3.getX()); }1011001001002001020P1P2P3例:對(duì)象的創(chuàng)建和使用public
static
voidmain(String[]args){ Pointp1=newPoint(10,20); Pointp2=newPoint(100,200); Pointp3=p2;
p2=p1; p2.setX(101);
p2=p3; System.out.println(p1.getX()); System.out.println(p2.getX()); System.out.println(p3.getX()); }1011001001002001020P1P2P310020010120P1P2P31012.3 方法調(diào)用2.3.1 方法的返回值2.3.2 實(shí)例方法的調(diào)用2.3.3 this引用2.3.4 靜態(tài)方法的調(diào)用2.3.1 方法的返回值如果在某個(gè)方法的定義中含有return語句,return后的值可以是常數(shù)、變量或者表達(dá)式。這個(gè)值的類型必須和方法的返回類型一致。Pro2_8:classQuery{intmax(inta,intb){
if(a>b)returna;else
returnb;}intmin(inta,intb){intresult=a;
if(a>b)result=b;
returnresult;}}public
classTest{public
static
voidmain(String[]args){ Queryq=newQuery();
intmax=q.max(10,20); System.out.println(max);}}2.3.2 實(shí)例方法的調(diào)用
在Pro2_8和Pro2_9中,進(jìn)行方法調(diào)用時(shí)需要以創(chuàng)建類的對(duì)象為前提,這是因?yàn)槟切┓椒ň欢x為實(shí)例方法,所以類的實(shí)例方法要能夠被調(diào)用,需要首先有這個(gè)實(shí)例存在??梢酝ㄟ^如下形式進(jìn)行方法調(diào)用:對(duì)象引用名.類的非靜態(tài)方法名([參數(shù)值1,參數(shù)值2…])
進(jìn)行方法調(diào)用時(shí)候,如果要調(diào)用的方法定義有相關(guān)參數(shù),則須連同參數(shù)值一一按序輸入,同時(shí)須類型匹配。2.3.3 this引用classPoint{
private
intx,y;
public
voidSetXValue(inta) {
this.x=a; }
public
voidSetYValue(inty) {
this.y=y; }
public
intGetXValue() {
return
this.x; }
public
voidOutputX() { System.out.println(this.GetXValue()); }}this是對(duì)當(dāng)前實(shí)例的引用。publicclassTest{publicstaticvoidmain(String[]args){Pointp=newPoint();p.SetXValue(10);p.OutputX();}}classPoint{
private
intx,y;
public
voidSetXValue(inta) { x=a; }
public
voidSetYValue(inty) {
this.y=y; }
public
intGetXValue() {
returnx; }
public
voidOutputX() { System.out.println(GetXValue()); }}方法調(diào)用的實(shí)例程序classPoint{privateintx=10;privateinty=20;publicvoidsetX(intx){this.x=x;}publicintgetX(){returnthis.x;}publicvoidsetY(inty){this.y=y;}publicintgetY(){returny;}}publicclassone{publicstaticvoidmain(String[]args){Pointp=newPoint();onetestone=newone();testone.SetPoint(p);System.out.println(p.getX());}publicvoidSetPoint(Pointp1){p1.setX(p1.getX()*100);p1.setY(p1.getY()*100);}}輸出為:10001020PthisP12.3.4 靜態(tài)方法的調(diào)用靜態(tài)方法不需要像實(shí)例方法那樣必須通過對(duì)象去調(diào)用,可以直接通過類來調(diào)用,如:類名.類靜態(tài)方法名Java類庫中很多類提供了靜態(tài)方法自定義靜態(tài)方法與應(yīng)用public
classFuncs{
public
static
intmax(inti1,inti2) {
if(i1>i2)returni1;
else
returni2; }
public
static
intgetMin(inti1,inti2) {
if(i1>i2)returni2;
else
returni1; }
public
static
voidmain(String[]args){ System.out.println(max(30,20)); }}publicclassTest{publicstaticvoidmain(String[]args){ System.out.println(Funcs.max(30,20));}}public
classFuncs{
public
static
intmax(inti1,inti2) {
if(i1>i2)returni1;
else
returni2; }
public
static
intgetMin(inti1,inti2) {
if(i1>i2)returni2;
else
returni1; }}系統(tǒng)類庫中的靜態(tài)方法與應(yīng)用java.lang包中類MathMath類包含用于執(zhí)行基本數(shù)學(xué)運(yùn)算的方法,如初等指數(shù)、對(duì)數(shù)、平方根和三角函數(shù)。static
doublesqrt(double
a)
返回正確舍入的double值的正平方根。static
doublepow(double
a,double
b)
返回第一個(gè)參數(shù)的第二個(gè)參數(shù)次冪的值。static
intmax(int
a,int
b)
返回兩個(gè)int值中較大的一個(gè)。public
classFuncs{
public
static
voidmain(String[]args){ System.out.println(Math.max(30,20)); System.out.println(Math.sqrt(9)); System.out.println(Math.pow(3,3)); }}303.027.0綜合示例Pro2_10:
classPoint {
intx,y;
publicPoint(intx,inty) {
this.x=x;this.y=y; } }
classLength {
public
static
doubleGetLen(Pointp1,Pointp2) {
return Math.sqrt(Math.pow((p2.x-p1.x),2) +Math.pow((p2.y-p1.y),2)); } }
public
classOperation {
public
static
voidmain(String[]args) { Pointp1=newPoint(2,2); Pointp2=newPoint(1,1); System.out.println(Length.GetLen(p1,p2)); } }2.4 訪問數(shù)據(jù)成員2.4.1 靜態(tài)變量和實(shí)例變量2.4.2 局部變量、全局變量、靜態(tài)變量、實(shí)例變量的區(qū)別2.4.3 final變量2.4.1 靜態(tài)變量和實(shí)例變量1.靜態(tài)變量靜態(tài)變量又稱為類變量,不論類的實(shí)例有多少個(gè),類變量的值只有一份。而實(shí)例變量的在內(nèi)存中的份數(shù)和類的實(shí)例創(chuàng)建的個(gè)數(shù)一致。2.訪問靜態(tài)變量的途徑有兩種:類的變量名.變量名類的名字.變量名.2.4.2 局部變量、全局變量、靜態(tài)變量、實(shí)例變量的區(qū)別局部變量必須賦初值;類中全局變量不賦初值,系統(tǒng)將自動(dòng)賦值為0;靜態(tài)變量的生存周期是整個(gè)程序運(yùn)行期類中實(shí)例全局變量的生存周期是對(duì)象的生存期類中方法內(nèi)局部變量的生存周期是方法的執(zhí)行期Pro2_13:classVar{
static
int
i;
intj;
public
voidlocalprint() {
intk=0;
i++; j++; k++; System.out.print("i="+i+"\t"); System.out.print("j="+j+"\t"); System.out.println("k="+k+"\t"); }
public
voidaprint() { localprint(); localprint(); }}public
classone{
public
static
voidmain(String[]args)
{ Varvar1=newVar(); var1.aprint(); Varvar2=newVar(); var2.aprint();
}}該程序的輸出結(jié)果為:i=1 j=1 k=1 i=2 j=2 k=1 i=3 j=1 k=1 i=4 j=2 k=1 應(yīng)用上述2.4.2規(guī)則,i是靜態(tài)變量,在整個(gè)程序運(yùn)行期內(nèi)存中只有一份存儲(chǔ),“i++;”語句共執(zhí)行了4次,每次都是在前述“經(jīng)過記憶”的i值的基礎(chǔ)上進(jìn)行加1;k是局部變量,只在localprint方法的執(zhí)行期內(nèi)“存活”,也即是,localprint方法執(zhí)行完畢,k的值將不再被“記憶”。j的值留給大家去分析。2.4.3 final變量使用final修飾符修飾成員變量,使得該成員變量的值不能被修改,又叫最終成員變量。final變量只能被賦值一次。classBaseClass{
public
finalStringhostName="324"; BaseClass() { hostName="234"; }}此處將出現(xiàn)錯(cuò)誤!classPoint{
static
final
int
i=100;
final
staticPointorigin=newPoint(0,0);
intx,y; Point(intx,inty) { this.x=x; this.y=y; }}public
classTest{
public
static
voidmain(String[]args) { //Point.i=Point.i+1;
//Point.origin=newPoint(20,20);
Pointp1=newPoint(10,20); p1.x=p1.x*Point.i; System.out.println(p1.x); }}//錯(cuò)誤!i是一個(gè)final字段,不能被重新賦值//錯(cuò)誤!origin是一個(gè)final字段,不能被重新賦值輸出結(jié)果為:1000classPoint{
static
final
int
i=100;
final
staticPointorigin=newPoint(0,0);
intx,y; Point(intx,inty) { this.x=x; this.y=y; }}public
classTest{ public
static
voidmain(String[]args) { Pointp1=newPoint(10,20); System.out.println(p1.x); p1.x=p1.x*Point.i; System.out.println(p1.x); Point.origin.x=Point.origin.x+2; System.out.println(Point.origin.x); }}輸出結(jié)果為:1010002origin不能再和其它對(duì)象建立關(guān)聯(lián)了,但是Point.origin.x是一個(gè)int型數(shù)據(jù),是可以被更改的2.5 包的概念2.5.1 創(chuàng)建包2.5.2 使用包2.5.3 包在類的訪問控制上的意義和用途2.5.4 類成員的缺省修飾符2.5.1 創(chuàng)建包創(chuàng)建包的形式:package包名;如果在類定義時(shí)沒有上述形式的語句,則類定義在默認(rèn)包中。classPoint{
…}packageFirstGrade;public
classOper1{ public
voidprintStr(Stringstr) { System.out.println(str); }}packageFirstGrade;publicclassPoint{
…}2.5.2 使用包如果當(dāng)前類和待使用的類不在同一個(gè)包內(nèi),則需要使用import語句進(jìn)行導(dǎo)入,才能使用。否則該類將不會(huì)被編譯器識(shí)別。通過import語句導(dǎo)入要使用的包:importFirstGrade.*;也可以使用import語句導(dǎo)入要使用的類importFirstGrade.Point;
2.5.3 包在類的訪問控制上的意義和用途修飾符為public的類可以被其它的類訪問。無修飾符的類可以被同一包中的類訪問。2.5.4 類成員的缺省修飾符如果類的成員在定義時(shí)是采用缺省修飾符,則可以被同一包內(nèi)的任何類訪問,但不能被其他包的類訪問。packageFirstGrade;public
classPoint{
int
x,y; Point() {}}package
FirstGrade;publicclassOper1{publicstaticvoidmain(String[]args){Pointp=newPoint();System.out.print(p.x);}}如果此處Point的構(gòu)造方法沒有加上publicpublic
同一包:保存在Point.java文件中。保存在Oper1.java文件中one.java文件importFirstGrade.Point;public
classone(該類在默認(rèn)包中){
public
static
voidmain(String[]args) { Pointp=newPoint(); }}
Pointp=newPoint();將會(huì)報(bào)錯(cuò):類Point是invisible的。如果Point的構(gòu)造方法沒有加上public,即使Point類被修飾為public,在所在包以外均為不可見Eclipse通過包組織程序文件packageuser.dao;publicclassUser{Stringid;privateStringname="Kate";privateStringpassword="12345";Stringsex;longregisterTime;longlastLogin;longvisitTimes;publicStringgetId(){returnid;}publicvoidsetId(Stringid){this.id=id;}publicStringgetPassword(){returnpassword;}publicvoidsetPassword(Stringpassword){this.password=password;}publicStringgetSex(){returnsex;}publicvoidsetSex(Stringsex){this.sex=sex;}publicvoidsetRegisterTime(longregisterTime){this.registerTime=registerTime;}publiclonggetLastLogin(){returnlastLogin;}publicvoidsetLastLogin(longlastLogin){this.lastLogin=lastLogin;}publiclonggetVisitTimes(){returnvisitTimes;}publicvoidsetVisitTimes(longvisitTimes){this.visitTimes=visitTimes;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){=name;}}第3章類的層次結(jié)構(gòu)本章目錄3.1 類的繼承3.2 Final類3.3 多態(tài)3.4 抽象類3.5 接口3.6 內(nèi)部類3.7 匿名類3.1 類的繼承3.1.1 使用extends繼承3.1.2 super與派生類對(duì)象的構(gòu)造3.1.3 繼承中的方法覆蓋3.1.4 super的其他用法3.1.5 super關(guān)于變量隱藏的優(yōu)勢(shì)3.1.6 final方法3.1.1 使用extends繼承繼承是面對(duì)象程序設(shè)計(jì)的重要特性,因?yàn)橛辛死^承,使得類和類之間形成了一種層次關(guān)系。如子類對(duì)象和父類對(duì)象之間是一種is-a的關(guān)系。在繼承的過程中,子類對(duì)父類的定義作出某些修改,要么改變同一方法的內(nèi)部操作;要么增加新的操作。同時(shí)因?yàn)槔^承,父類可以提供的方法,子類也因?yàn)槔^承而具備。Pro3_1:classStudent{
private
intAge;
privateStringStudentNo;
public
booleanSetAge(intvalue) {
if(value>17) { Age=value;
return
true; }
else
return
false; } public
intGetAge() {
returnAge; }public
booleanSetSno(Stringvalue){ StudentNo=value;
return
true;}publicStringGetSno(){
returnStudentNo;} }classGirlStudentextendsStudent{
private
intShapeCourseGrade;
public
booleanSetShapeCourseGrade(intvalue) {
if(value>=0) { ShapeCourseGrade=value;
return
true; }
else
return
false; }
public
intGetShapeCourseGrade() {
returnShapeCourseGrade; } }public
classtest{
public
static
voidmain(String[]args) {
GirlStudentstu=new
GirlStudent();
booleanageFlag=stu.SetAge(18);
booleangradeFlag=stu.SetShapeCourseGrade(78);
if((ageFlag)&&(gradeFlag)) { System.out.println(stu.GetAge()); System.out.println(stu.GetShapeCourseGrade()); }else
System.out.println("輸入信息不符合規(guī)范!"); }}Pro3_1中,女學(xué)生(GirlStudent)因?yàn)槔^承自學(xué)生(Student),所以學(xué)生類的所有方法,女學(xué)生都因?yàn)槔^承而具備,當(dāng)我們創(chuàng)建女學(xué)生的實(shí)例時(shí),可以使用SetAge和GetAge方法等。同時(shí)也可以使用女學(xué)生類新增的方法:SetShapeCourseGrade和GetShapeCourseGrade。所以繼承使得代碼可以得到復(fù)用。父類的數(shù)據(jù)成員也可以被子類繼承。如:classLocation{
intx,y; Location(intx,inty) {this.x=x;this.y=y;}
voidshow() {System.out.println(this.x+""+this.y);}}classPoint123extendsLocation{
boolean
visible; Point123(intx,inty,booleantf) {
super(x,y);
this.visible=tf; }
voidmoveTo(intx,inty) {
this.x=x;
this.y=y; }}輸出結(jié)果:100100public
classTestPointCircle{public
static
voidmain(String[]args){ Point123p=newPoint123(100,100,false); p.show();}}3.1.2 super與派生類對(duì)象的構(gòu)造構(gòu)造方法可以在對(duì)象創(chuàng)建的時(shí)候給對(duì)象的數(shù)據(jù)成員進(jìn)行初始賦值,也可以執(zhí)行某些行為(通過構(gòu)造方法里面的語句)。那么子類若在派生父類的基礎(chǔ)上新增了數(shù)據(jù)成員,需要進(jìn)行初始賦值或者子類有其需要在創(chuàng)建對(duì)象時(shí)就實(shí)施的某種行為,那么子類也需要定義構(gòu)造方法。此處需要考慮的問題是,父類的構(gòu)造方法如何能夠在子類的構(gòu)造方法執(zhí)行時(shí)也能夠相應(yīng)的被執(zhí)行呢?所以我們可以使用super在子類的構(gòu)造方法里面調(diào)用父類構(gòu)造方法,使得父類的構(gòu)造方法得以執(zhí)行。
classValue1{
intx,y; Value1(intx,inty) {
this.x=x;this.y=y; System.out.println("我是從Value1的構(gòu)造方法輸出的"); }
intGetX() {
returnx; }}classValue2extendsValue1{ Value2(intx,inty) {
super(x,y);
System.out.println("我是從Value2的構(gòu)造方法輸出的"); }}public
classVar{
public
static
voidmain(String[]args) {
intt; Value2v2=newValue2(10,20); t=v2.GetX()+v2.GetX(); System.out.print("add="+t); }}輸出:我是從Value1的構(gòu)造方法輸出的我是從Value2的構(gòu)造方法輸出的add=20子類對(duì)象的內(nèi)存空間里存放著父類對(duì)象的數(shù)據(jù)。如不調(diào)用父類對(duì)象的構(gòu)造方法,則表明父類對(duì)象并未構(gòu)造“完全”,也即是沒能正確構(gòu)造父類的對(duì)象,這塊父類的實(shí)際數(shù)據(jù)是不正確的,所以在創(chuàng)建子類的對(duì)象時(shí)候,必須先調(diào)用父類對(duì)象的構(gòu)造方法,再調(diào)用子類的構(gòu)造方法。子類對(duì)象的構(gòu)造方法可以針對(duì)對(duì)那些從父類繼承的成員再次設(shè)定值。classBaseClass{
privateStringhostName; BaseClass() { hostName="Amy!"; }
publicStringGetName() {returnhostName;}}classDerivedClassextendsBaseClass{}public
classTestInherit{
public
static
voidmain(String[]args) { DerivedClassd=newDerivedClass(); System.out.println(d.GetName()); }}其中BaseClass的構(gòu)造方法被調(diào)用,hostName數(shù)據(jù)成員的值為"Amy!"所以輸出為:Amy!當(dāng)父類提供了多個(gè)構(gòu)造方法的時(shí)候:一個(gè)不帶參數(shù)的構(gòu)造方法和其它帶參數(shù)的構(gòu)造方法,子類仍可以不定義任何構(gòu)造方法,因?yàn)橄到y(tǒng)會(huì)給子類提供缺省構(gòu)造方法,且在實(shí)例化子類對(duì)象的時(shí)候、會(huì)根據(jù)super的參數(shù)去選擇調(diào)用父類的哪一個(gè)構(gòu)造方法。輸出結(jié)果:Tom!輸出結(jié)果:Amy!classBaseClass{
privateStringhostName; BaseClass() { hostName="Amy!"; } BaseClass(Strings) { hostName=s; }
publicStringGetName() {returnhostName;}}classDerivedClassextendsBaseClass{ DerivedClass(Strings) { super(s); }}public
classTest{public
static
voidmain(String[]args){DerivedClassd=newDerivedClass("Tom!");System.out.println(d.GetName()); }}super();輸出結(jié)果:Amy!等價(jià)為:super();系統(tǒng)會(huì)總是默認(rèn)提供構(gòu)造方法嗎?如果父類不存在缺省構(gòu)造方法時(shí)候(當(dāng)顯示定義了帶參數(shù)的其它構(gòu)造方法時(shí))或者沒有定義不帶參數(shù)的構(gòu)造方法時(shí),則子類中必須要有super()之類的語句來調(diào)用父類的這個(gè)非缺省構(gòu)造方法。如下例:classBaseClass{
溫馨提示
- 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. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026江西撫州市樂安縣城運(yùn)建筑工程有限公司招聘施工技術(shù)管理人員1人筆試備考題庫及答案解析
- 2026山東濰坊市昌樂縣事業(yè)單位招聘30人筆試備考試題及答案解析
- 2026年濟(jì)寧嘉祥縣事業(yè)單位公開招聘初級(jí)綜合類崗位人員(34人)筆試模擬試題及答案解析
- 2025年中級(jí)經(jīng)濟(jì)師人力資源考試真題及答案解析
- 勞動(dòng)法關(guān)于轉(zhuǎn)崗培訓(xùn)制度
- 實(shí)驗(yàn)室學(xué)校培訓(xùn)制度
- 企業(yè)反恐培訓(xùn)制度
- 培訓(xùn)機(jī)構(gòu)廚房制度
- 雙胞胎培訓(xùn)淘汰制度
- 汽車噴漆工技術(shù)培訓(xùn)制度
- 數(shù)學(xué)廣角:搭配問題 課件 人教版數(shù)學(xué)三年級(jí)上冊(cè)
- 2025杭州市市級(jí)機(jī)關(guān)事業(yè)單位編外招聘考試備考試題及答案解析
- 車間電纜整改方案模板(3篇)
- 徐州村務(wù)管理辦法
- 政協(xié)機(jī)車輛管理辦法
- 食品加工助劑管理辦法
- DB50∕T 1604-2024 地質(zhì)災(zāi)害防治邊坡工程結(jié)構(gòu)可靠性設(shè)計(jì)規(guī)范
- 渝22TS02 市政排水管道附屬設(shè)施標(biāo)準(zhǔn)圖集 DJBT50-159
- 非現(xiàn)場執(zhí)法培訓(xùn)課件
- 中國電氣裝備資產(chǎn)管理有限公司招聘筆試題庫2025
- 糖尿病足的護(hù)理常規(guī)講課件
評(píng)論
0/150
提交評(píng)論