201521123091 《Java程序设计》第3周学习总结
<!DOCTYPE html>
Java 第三周總結(jié)
Java 第三周總結(jié)
第三周的作業(yè)。
- Java 第三周總結(jié)
- 1.本章學(xué)習(xí)總結(jié)
- 2.Java Q&A
- 1.代碼閱讀
- 2.構(gòu)造函數(shù)有什么用?其編寫格式是什么?如果一個(gè)類不寫構(gòu)造函數(shù),它有構(gòu)造函數(shù)嗎?如果一個(gè)類中只有帶參的構(gòu)造函數(shù),它有沒(méi)有不帶參數(shù)的默認(rèn)構(gòu)造函數(shù)?
- 3.使用java.lang.Math類的函數(shù)時(shí),為什么不需要new?如果new Math()會(huì)產(chǎn)生什么錯(cuò)誤?
- 4.什么是重載?什么是構(gòu)造函數(shù)重載?在java.lang.Math類中舉出函數(shù)重載的例子?怎么才能區(qū)分兩個(gè)重載函數(shù)?
- 5.final修飾的變量不能改變,為什么如下代碼可以正常運(yùn)行?
- 6.閱讀代碼EmployeeTest.java,回答:
- 7.編寫函數(shù)public static boolean isMondayToFriday()
- 3.使用碼云管理Java代碼
- 4.PTA實(shí)驗(yàn)
1.本章學(xué)習(xí)總結(jié)
2.Java Q&A
1.代碼閱讀
以上代碼可否編譯通過(guò)?哪里會(huì)出錯(cuò)?為什么?嘗試改正?
如果創(chuàng)建3個(gè)Test1對(duì)象,有內(nèi)存中有幾個(gè)i,幾個(gè)j?
為了解決兩種情形,static關(guān)鍵字應(yīng)運(yùn)而生:
> 只為某特定域分配單一存儲(chǔ)空間
> 希望即使沒(méi)有創(chuàng)建對(duì)象,也能夠調(diào)用某方法
接下來(lái)回答問(wèn)題:不能編譯通過(guò),(首先Test1getj())出錯(cuò)如圖所示,即靜態(tài)方法不能調(diào)用一個(gè)非靜態(tài)的成員變量。修改的話在這個(gè)靜態(tài)方法里面創(chuàng)建其自身的對(duì)象。
那么我們來(lái)想想這是為什么。首先靜態(tài)方法可以不通過(guò)對(duì)象進(jìn)行調(diào)用,而且我們被推薦使用類名去引用static變量(或者方法),它強(qiáng)調(diào)了其static結(jié)構(gòu)。由于在用static方法前不需要?jiǎng)?chuàng)建任何對(duì)象,所以對(duì)于static方法來(lái)說(shuō),不能直接訪問(wèn)非static的成員變量或者是方法,因?yàn)樗麄兒苡锌赡芏疾淮嬖?#xff01;
如果創(chuàng)建3個(gè)Test1變量,內(nèi)存中有3個(gè)i,1個(gè)j。因?yàn)橐粋€(gè)static字段對(duì)于每個(gè)類來(lái)說(shuō)只有一份存儲(chǔ)空間,而非static字段對(duì)于每個(gè)對(duì)象都會(huì)有一個(gè)存儲(chǔ)空間。
2.構(gòu)造函數(shù)有什么用?其編寫格式是什么?如果一個(gè)類不寫構(gòu)造函數(shù),它有構(gòu)造函數(shù)嗎?如果一個(gè)類中只有帶參的構(gòu)造函數(shù),它有沒(méi)有不帶參數(shù)的默認(rèn)構(gòu)造函數(shù)?
構(gòu)造函數(shù)(Constructor)的用處:
> 提醒我們要對(duì)變量進(jìn)行初始化,C語(yǔ)言編程告訴我么一個(gè)慘痛教訓(xùn),不初始化變量而去使用它是一件相!當(dāng)!糟!糕!的事情。
> 減少重復(fù)的初始化代碼,并可以使代碼更加易于閱讀。
編寫格式:
或者是
通過(guò)上述兩個(gè)樣例,我們可以看到構(gòu)造函數(shù)的一些基本格式。比如可以帶參或者不帶參,有了形式參數(shù),我們就可以在初始化對(duì)象時(shí)提供實(shí)際參數(shù),so當(dāng)然可以帶形式參數(shù)。然后方法名和類名相同,還有,不指定返回類型。
如果我們不寫構(gòu)造函數(shù)呢?那么這個(gè)類里面會(huì)不會(huì)有構(gòu)造函數(shù)呢?顯然是應(yīng)該有的,我們剛才說(shuō)了,不初始化是一個(gè)非常不安全的行為,so肯定是要有的啦。然而我們并看不見(jiàn),不過(guò)它確實(shí)是有,它大概長(zhǎng)成這個(gè)樣子,這樣,這樣……那到底是怎樣,首先它沒(méi)有參數(shù),然后這個(gè)方法不干任何事情(??),可能是的。好像還是不大懂,那我們舉個(gè)栗子吧。
再次啟用我們的反匯編!來(lái)看看到底發(fā)生了什么?
我們可以看到編譯的時(shí)候自動(dòng)給我們加上了一個(gè)構(gòu)造函數(shù),然后確實(shí)什么都沒(méi)有干……
這在Java當(dāng)中被稱為默認(rèn)構(gòu)造器,同時(shí)它也是無(wú)參的構(gòu)造器,一般我們不寫任何構(gòu)造函數(shù)的時(shí)候,它就會(huì)在編譯的時(shí)候被自動(dòng)調(diào)用。
然后我們?cè)賮?lái)扯扯剛才的編寫格式:
①有無(wú)形式參數(shù)都可以,解釋過(guò)了;
②構(gòu)造函數(shù)與類同名,沿用C++的做法,這樣不會(huì)和類的任何成員名稱起沖突。而且我們一般在寫方法名的時(shí)候,首字母一般小寫,然而構(gòu)造函數(shù)它可管不著你這種約定俗成啦~
③不指定返回類型,連void都不可以。
……
那Rock rock = new Rock();呢?嗯……臉好疼,這個(gè)只是new表達(dá)式去返回對(duì)新建對(duì)象的引用,而不是構(gòu)造函數(shù)去返回什么。不信往下看
For purposes other than simple initialization, classes can have constructors. Constructors are blocks of statements that can be used to initialize an object before the reference to the object is returned by new. Constructors have the same name as the class they initialize. Like methods, they take zero or more arguments, but constructors are not methods and thus have no return type. Arguments, if any, are provided between the parentheses that follow the type name when the object is created with new. Constructors are invoked after the instance variables of a newly created object of the class have been assigned their default initial values and after their explicit initializers are executed.
The Java Programming Language傳送門到參考網(wǎng)站
我們可以從這段英文中看到,constructor不被當(dāng)做一個(gè)常見(jiàn)的方法,我們可以認(rèn)為它是特殊的方法。而且constructor在調(diào)用之前,對(duì)象就已經(jīng)存在了,何談是它來(lái)返回引用呢?
對(duì)于這個(gè)最后一小問(wèn),那就敲個(gè)代碼吧,就拿上面的Rock2類來(lái)看看吧!
從反匯編結(jié)果來(lái)看,編譯的時(shí)候就不會(huì)再自動(dòng)建立默認(rèn)構(gòu)造函數(shù)了。
而且你看,的確沒(méi)有無(wú)參的構(gòu)造函數(shù)給你用了。真的想用,看到第三個(gè)fix了嗎?Create constructor 'Rock2()',自己去搞一個(gè)啊!
3.使用java.lang.Math類的函數(shù)時(shí),為什么不需要new?如果new Math()會(huì)產(chǎn)生什么錯(cuò)誤?
為什么不需要要new,因?yàn)镸ath類里面的所有成員變量和成員方法都是靜態(tài)的,我們前面有說(shuō)到過(guò),這種用static修飾的都可以直接用類名去調(diào)用而且不需要任何對(duì)象在提前創(chuàng)建。
而且還不是不需要的問(wèn)題,問(wèn)題是你如果想new一個(gè),會(huì)報(bào)錯(cuò)啊!報(bào)了個(gè)啥錯(cuò)?The constructor Math() is not visible,也就是說(shuō)它根本就不讓你new一個(gè),這就很尷尬了,所以讓我們來(lái)看看Math類的源碼。
說(shuō)的很明確了,根本就不想讓你去實(shí)例化,死心吧。
如何正確的去看待Math類的這個(gè)做法,即只是把類當(dāng)做一個(gè)名字空間而已,滿足我們上面所說(shuō)的,方法的調(diào)用和對(duì)象是否創(chuàng)建不需要建立聯(lián)系。
4.什么是重載?什么是構(gòu)造函數(shù)重載?在java.lang.Math類中舉出函數(shù)重載的例子?怎么才能區(qū)分兩個(gè)重載函數(shù)?
重載在英文維基中是個(gè)多義詞,其中和計(jì)算機(jī)科學(xué)相關(guān)的就有:
我們這邊就來(lái)談?wù)劮椒ǖ闹剌d!
方法重載在英文wiki中的定義:
In some programming languages, function overloading or method overloading is the ability to create multiple methods of the same name with different implementations.Function overloading
就是創(chuàng)建同名的但是有不同實(shí)現(xiàn)的多個(gè)方法就是重載!
我們?nèi)粘I钪幸部梢噪S處看到重載的影子,比如學(xué)習(xí)!學(xué)習(xí)語(yǔ)文、學(xué)習(xí)數(shù)學(xué)、學(xué)習(xí)英語(yǔ)、學(xué)習(xí)dota……
但是像下面這樣說(shuō),別人會(huì)覺(jué)得很蠢
“以學(xué)習(xí)語(yǔ)文的方法學(xué)習(xí)語(yǔ)文”;
“以學(xué)習(xí)數(shù)學(xué)的方法學(xué)習(xí)數(shù)學(xué)”
……
很顯然,我即使做一點(diǎn)省略,意思還是能夠很好的表達(dá)出來(lái)。相反我要是完整地進(jìn)行表述,就會(huì)讓別人覺(jué)得很冗余。
構(gòu)造函數(shù)重載,就是允許方法名相同而形式參數(shù)不同的構(gòu)造器同時(shí)存在。因?yàn)樵诓煌那榫诚?#xff0c;我可能需要用不同的方式去初始化一個(gè)類,但是類名只有一個(gè),而構(gòu)造函數(shù)的名字只能是類名,所以構(gòu)造函數(shù)也需要函數(shù)的重載!
Math類中函數(shù)重載的例子下面就有,寫了四個(gè)abs,針對(duì)四個(gè)類型,double、float、int、 long:
怎樣才能區(qū)分兩個(gè)重載函數(shù),這兩個(gè)函數(shù)都具有相同的名字,Java如何知道我到底指的是哪一個(gè)嘞?
答案是參數(shù)列表!
不僅是參數(shù)類型的差異,而且參數(shù)順序的不同都可以區(qū)分出不同的方法。
那么返回值可不可以,比如:
void f() {}
int f() {return 1;}
那這樣怎么區(qū)分呢,或許可以搞一個(gè)int x = f();這樣。那如果有賦值那就是第二個(gè),沒(méi)有賦值的就是第一個(gè)。可是我們經(jīng)常會(huì)這么編程:即使是一個(gè)返回值不為void,我們可能也不會(huì)把這個(gè)方法的返回值賦給任何變量,就像f(); 這樣做沒(méi)有任何毛病,如果它本身只是一個(gè)返回值類型為int的函數(shù),那最多編譯器就是給個(gè)warning而已。那么如果我們寫了這么兩個(gè)重載函數(shù),那Java到底該如何確定用哪一個(gè)函數(shù)呢?(能怎么辦呢,我也很絕望啊!)所以根據(jù)返回值類型來(lái)區(qū)分重載方法顯然是不行的。
5.final修飾的變量不能改變,為什么如下代碼可以正常運(yùn)行?
這邊貼出一段話來(lái)回答
當(dāng)對(duì)對(duì)象引用而不是基本類型運(yùn)用final時(shí),其含義會(huì)有一點(diǎn)令人迷惑。對(duì)于基本類型final使數(shù)值恒定不變;而用于對(duì)象引用,final使引用恒定不變。一旦引用被初始化指向一個(gè)對(duì)象,就無(wú)法再把它改為指向另一個(gè)對(duì)象。然而,對(duì)象其自身卻是可以被修改的,Java并未提供使任何對(duì)象恒定不變的途徑(但可以自己編寫類以取得使對(duì)象恒定不變的效果)。這一限制同樣適用數(shù)組,它也是對(duì)象。
——《Java編程思想》
這邊舉個(gè)栗子來(lái)類比一下
——“無(wú)論她將來(lái)是富有還是貧窮,或無(wú)論她將來(lái)身體健康或不適,你都愿意和她永遠(yuǎn)在一起嗎?”
——“是的,我愿意。”
大概就是這么個(gè)感覺(jué)。
6.閱讀代碼EmployeeTest.java,回答:
1. 為什么其屬性均為private?這樣設(shè)計(jì)有什么好處?
2. 為Employee類增加一個(gè)無(wú)參構(gòu)造函數(shù),調(diào)用其有參構(gòu)造函數(shù),設(shè)置name為雇員1, salary為3000, hireDay的年月日為2017年3月5日。(粘貼代碼)
3. 為Employee類再增加一個(gè)有參構(gòu)造函數(shù),參數(shù)只有name與salary,hideDay為當(dāng)前日期。(粘貼代碼)
再增加一個(gè)有參構(gòu)造函數(shù)
7.編寫函數(shù)public static boolean isMondayToFriday()
功能:判斷今天如果是周一到周五,直接輸出如“上班時(shí)間”并返回true,否則輸出“休息時(shí)間”。
提示:使用LocalDateTime, DayOfWeek
3.使用碼云管理Java代碼
4.PTA實(shí)驗(yàn)
- 第一題:
- this關(guān)鍵字是為了在方法的內(nèi)部獲得對(duì)當(dāng)前對(duì)象的引用。表示對(duì)調(diào)用方法的那個(gè)對(duì)象的引用。如果在方法內(nèi)部調(diào)用同一個(gè)類中的另一個(gè)方法,則不需要使用this。
- toString()方法是用字符串來(lái)表示對(duì)象的一種方法,這個(gè)方法就是會(huì)返回一個(gè)用文本方式表達(dá)對(duì)象的字符串。推薦在所有的子類里面重載toString()方法。如果我們什么都不寫,那么默認(rèn)就會(huì)返回這么一個(gè)字符串getClass().getName() + '@' + Integer.toHexString(hashCode())
- setter/getter,設(shè)置器和訪問(wèn)器。我們之前說(shuō)到了,通常將成員變量聲明為private,是為了防止直接訪問(wèn)成員變量而引起的惡意操作。但是,這并不是不允許訪問(wèn),我們可以通過(guò)setter和getter方法來(lái)完成。Eclipse可以自動(dòng)生成getter和setter方法,在左上角Source菜單欄里。
- this關(guān)鍵字是為了在方法的內(nèi)部獲得對(duì)當(dāng)前對(duì)象的引用。表示對(duì)調(diào)用方法的那個(gè)對(duì)象的引用。如果在方法內(nèi)部調(diào)用同一個(gè)類中的另一個(gè)方法,則不需要使用this。
- 第二題
- 這道題希望每一個(gè)雇員都有個(gè)不同的ID,那么我們可以設(shè)置在Person類里面設(shè)置一個(gè)靜態(tài)變量,然后每招來(lái)一個(gè)雇員,我們都把當(dāng)前這個(gè)靜態(tài)變量的值賦給這個(gè)雇員,然后靜態(tài)變量再自增1。因?yàn)檫@個(gè)靜態(tài)變量是這個(gè)類所持有的,而不屬于任何一個(gè)雇員,作用其實(shí)就相當(dāng)于全局變量。
- 如果有些事情要在.class加載后執(zhí)行,那么就可以定義static塊,這樣只要.class加載進(jìn)JVM中,默認(rèn)就會(huì)執(zhí)行該static塊。
- 這道題希望每一個(gè)雇員都有個(gè)不同的ID,那么我們可以設(shè)置在Person類里面設(shè)置一個(gè)靜態(tài)變量,然后每招來(lái)一個(gè)雇員,我們都把當(dāng)前這個(gè)靜態(tài)變量的值賦給這個(gè)雇員,然后靜態(tài)變量再自增1。因?yàn)檫@個(gè)靜態(tài)變量是這個(gè)類所持有的,而不屬于任何一個(gè)雇員,作用其實(shí)就相當(dāng)于全局變量。
第三題,這邊就簡(jiǎn)要地講兩點(diǎn)
toString()和deepToString()的區(qū)別
Returns a string representation of the contents of the specified array.If the array contains other arrays as elements, they are converted to strings by the {@link Object#toString} method inherited from Object, which describes their identities rather than their contents.
toString()的實(shí)現(xiàn)
測(cè)試代碼:
然后運(yùn)行結(jié)果是這樣的:
[[I@15db9742, [I@6d06d69c]
[1, 2]
對(duì)于一維數(shù)組打印出了我們所希望得到的東西,而對(duì)于一個(gè)多維數(shù)組(這邊是二維數(shù)組),我們也如注釋中所說(shuō)的打印了從相應(yīng)的類里所繼承的toString()方法,那么我們之前也說(shuō)了,默認(rèn)就是getClass().getName() + '@' + Integer.toHexString(hashCode())這樣的格式,那這邊也是。
為了解決這樣的問(wèn)題,另一個(gè)方法應(yīng)運(yùn)而生,它叫做deepToString()方法,方法如其名,它可以一直深入這個(gè)(多維)數(shù)組的內(nèi)部,即便其維度會(huì)很高。
Returns a string representation of the "deep contents" of the specified array. If the array contains other arrays as elements, the string representation contains their contents and so on. This method is designed for converting multidimensional arrays to strings.
deepToString()的實(shí)現(xiàn)
測(cè)試代碼:
然后運(yùn)行結(jié)果是這樣的:
[[I@15db9742, [I@6d06d69c]
[[1, 2], [2, 3]]
當(dāng)然就不一樣咯,deepToString()方法專門針對(duì)多維數(shù)組的。
回到頂部
要不我試試直接貼html的代碼?
Runnable jar
import java.time.LocalDate;public class Main {public static boolean isMondayToFriday(String string) {String[] strings = string.split("-");int year = Integer.valueOf(strings[0]);int month = Integer.valueOf(strings[1]);int dayOfMonth = Integer.valueOf(strings[2]);LocalDate localDate = LocalDate.of(year, month, dayOfMonth);int day = localDate.getDayOfWeek().getValue();if (day >= 1 && day <= 5) {return true;}return false; }public static void main(String[] args) {if (args.length > 0) {String string = args[0];if (isMondayToFriday(string)) {System.out.println("上班時(shí)間");} else {System.out.println("休息時(shí)間");}}} }import java.time.LocalDate;public class Main {public static boolean isMondayToFriday(String string) {String[] strings = string.split("-");int year = Integer.valueOf(strings[0]);int month = Integer.valueOf(strings[1]);int dayOfMonth = Integer.valueOf(strings[2]);LocalDate localDate = LocalDate.of(year, month, dayOfMonth);int day = localDate.getDayOfWeek().getValue();if (day >= 1 && day <= 5) {return true;}return false; }public static void main(String[] args) {if (args.length > 0) {String string = args[0];if (isMondayToFriday(string)) {System.out.println("上班時(shí)間");} else {System.out.println("休息時(shí)間");}}} }運(yùn)行結(jié)果如截圖所示:
轉(zhuǎn)載于:https://www.cnblogs.com/ljl36/p/6518945.html
總結(jié)
以上是生活随笔為你收集整理的201521123091 《Java程序设计》第3周学习总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ProtoBuffer由.proto文件
- 下一篇: HTTP错误代码对应