一般(非類別)沒宣告為static靜態的就必須透過建構式new 配置. 因為一般的則為動態的配置記憶體方式. 然後以物件名稱.函式方法名稱(引述列)來呼叫. 類別函式可以直接用 ...
C50108Search…2019/0801/轉職成功路途開始自學心得與此網站使用方式行事曆&課程大綱2019/0224/自我檢視雜記2018/10XX/轉職心路歷程職訓局里程碑2019012019022019032019042019052019/0501/內部網站辨識&外部DNS域名/IP+自架DNS伺服器理解2019/0502/Java語言基礎、物件導向基礎2019/0503/Asp.net泛型處理常式驗證圖片應用&第七次專題報告Usecase2017/0506/Bs_FlexBox&[email protected]+Viewbag+helper2019/0507/Java物件導向_類別+函式觀念&階段性作業三2019/0508/Asp.Net_MVC_Model_ADO.NET+Entityframework+LoginMember實作+MVC觀念2019/0509/Java物件導向(函式)_儲存型態+回傳值+多載+自制+例外處理+this參照+存取+複合20919/0510/第八次專題報告=功能DEMO2019/0514/Java_靜態類別+繼承特性2019/0515/RWDUtility+Card&MVCViewModel+CRUD(RD)2019/0516/BSform&驗證+JQ驗證&MVC_CRUD(CU)2019/0517/ASP.NETWebform介紹Masterpage主頁&Session簡介&登入login驗證&隱碼攻擊injection&工具箱程式碼片段使用2019/0520/繼承&存取權特性+java作業四+字符串格式化+多形+抽象類別2019/0521/抽象類別+介面2019/0522/BootstrapComponents元件介紹+MVCAPI概念&實作2019/0523/IISIP限制&ASP.NET部屬2019/0524/WebApi異質程式連線方式&第九次專題報告_循序圖2019/0528/BootstrapComponents元件介紹+MVC登入驗證+商品加入購物車實作2019/0529/ASP.NET_MVC購物車訂單功能完成+BootstrapComponents元件介紹2019/0530/原本是伺服器的課,但拿來做專題。
2019/0531/ASP.NET_WebformAllView物件功能清單&ListView實作&第十次專案報告(完整循序圖)2019062019/0701/最終專案報告2019/0702/結訓與家人遊台東預計0708開始找工作自學筆記應該會等工作穩定後繼續開始自學里程碑201901201902201903201904201905PoweredByGitBook2019/0509/Java物件導向(函式)_儲存型態+回傳值+多載+自制+例外處理+this參照+存取+複合https://matthung0807.blogspot.com/2018/02/java-overload.html#前期提要
函式存取方式三種公開public私有private保護protected
##函式儲存記憶體型態靜態Static
表示這個函式為靜態方法/類別函式
如果有這個宣告在編譯時就會佔有記憶體
不用透過關鍵字即可已被值接呼叫
###用法
一般(非類別)沒宣告為static靜態的就必須透過建構式new配置
因為一般的則為動態的配置記憶體方式
然後以物件名稱.函式方法名稱(引述列)來呼叫
類別函式可以直接用函式名稱(引述列)來呼叫,或已類別名稱.函式方法名稱(引述列)來呼叫
###Static函式只能存取static成員,即類別函式只能存取類別變數和類別方法函式,不能存取實例變數和實例方法函式
###Static函數只能存取static的變數使用static的方法
###動態靜態無法互相呼叫存取
##函式傳回值型別
以前沒有物件導向時就有了
函式型別
函式傳回(return)值的資料型別
Exvoidorintstring…
函式沒有回傳值則型別為void沒有回傳值
在函式內看不到return的關鍵字使用
權限記憶體配置方式函式名稱參數列參數名稱
Publicstaticvoidmain(stringstr)
##呼叫函式
函式名稱(參數,參數…)
變數=函式名稱(參數,參數…)
#函式呼叫參數狀態有兩種方式
傳值(passbyvalue
拷貝一份傳給對應參數
在函式執行過程永遠參照拷貝的那份最原本的
傳參照(passbyreference
起始參數位址傳遞給參數
如果在函式執行過程改變了那參數也會被改變
##傳值(passbyreference###範例java12_9.java(一維陣列參數reference
印a陣列印出在另一個函數改變a
Math.sqrt(靜態方法可以直接呼叫
Class一系列數學特定功能(開根號等等sqrt是裡面其中一種開根號方法
有點懶得打程式碼…
###老師的範例碼
居然可以讓
Mether跟原本庫的掛件靜態類別方法同名稱???只差在namespace不一樣
Publicstaticvoidprint(intx[]){System.out.print(x[i]+””)};packagecom.example.java;publicclassJava12_9{ publicstaticvoidmain(String[]args){ //TODO自動產生的方法Stub. inta[]={2,4,9,16,25,36,49,64,81}; print(a); sqrt(a); print(a); } publicstaticvoidprint(intx[]){ System.out.print("陣列內容為:"); for(inti=0;i=24||minute<0||minute>=60||second<0||second>=60){ thrownewIllegalArgumentException("輸入的\"小時、分鐘、秒\"超過範圍限制,發生位置(setTime.12)"); } this.hour=hour; this.minute=minute; this.second=second; } publicStringtoUniversalString(){ returnString.format("%02d:%02d:%02d",hour,minute,second); } publicStringtoString(){ returnString.format("%d:%02d:%02d%s",((hour==0||hour==12)?12:hour%12),minute,second, (hour<12?"AM":"PM")); }}
##題外話
如果不ctrl+f5清空暫存就會造成庫的版本引入錯誤
###Tien1Test.java
接著new一個剛剛新增自制類別作測試
補圖
###程式碼如下
packagecom.example.java;publicclassTime1Test{ publicstaticvoidmain(String[]args){ //TODO自動產生的方法Stub. Time1t1=newTime1(); displayTime("已建立新類別Time1",t1); t1.setTime(11,23,54); System.out.println(t1.toUniversalString()); try{ t1.setTime(20,23,54); displayTime("已設定完成時間",t1); }catch(Exceptionex){ System.out.println("錯誤發生:"+ex.getMessage()); } } privatestaticvoiddisplayTime(Stringheader,Time1t) { System.out.printf("%s%n24小時制通用時間:%s%n12小時制時間:%s%n",header,t.toUniversalString(),t.toString()); }}
除了自己建立類別與物件外
也有內建的JSE8-Date/Time物件
以下簡介內建類別與物件
在官方文件也有很清楚介紹
JavaPlatformSE8
一般在撰寫程式的時候如果標準sdk內有內建的類別與物件就不會在自己去實作
###範例MemberAccessTest.java
參數private
在除了類別內無法在外面引用與查詢看不到
###而且如果放開存取權會變成說有些在類別內的驗證程式碼會吃不到
變成值接指定=造成間接錯誤
這個好像會沒有程式碼老師把他跟上一個寫在一起
##this參照
關鍵字this
存取指向自己的參照
Thisreference
如果class沒有寫
編譯器也會自己補進去
同一個java檔案,包含多個類別檔案時會分開類別檔.class
但保護層級的class必須在同一個.class檔案內,不然也是會發生錯誤
##範例thistest.java
一個檔案兩個class
PublicclassThisTest{}
ClassSimpleTime{}
一個java檔案裡面
只有一個可以被宣告為Public
第二個class在外部無法引用public內的東西
簡單來講棕色跟藍色是不同東西
雖然都是容器,是變數
棕色是區域變數
藍色是類別變數
不寫也可以編譯器會自己加上去
House
This.minute
This.second
###thistest.java程式碼
packagecom.example.java;publicclassThisTest{ publicstaticvoidmain(String[]args){ SimpleTimet1=newSimpleTime(16,20,15); System.out.println(t1.toUniversalString()); } }classSimpleTime{ privateinthour;//0-23 privateintminute;//0-59 privateintsecond;//0-59 publicSimpleTime(inth,intm,intsecond){ if(h<0||h>=24||m<0||m>=60||second<0||second>=60){ thrownewIllegalArgumentException("輸入的\"小時、分鐘、秒\"超過範圍限制,發生位置(setTime.12)"); } hour=h; this.minute=m; this.second=second; } publicStringtoUniversalString(){ returnString.format("%02d:%02d:%02d",hour,minute,second); } publicStringtoString(){ returnString.format("%d:%02d:%02d%s",((hour==0||hour==12)?12:hour%12),minute,second, (hour<12?"AM":"PM")); }}##Time2多載overloadedconstructor建構子的案例
不同的簽名式signature塑造多種建構子
編譯器會將建構子呼叫中引述的數量、型別、順序與建構子宣告所指定的參數數量型別順序比對,呼叫正確的建構子
布林初始預設值為flase參照則為null
範例有五個最後一個比較特殊參數的本身就是他自己這個物件的型態
##建構式不會有回傳型態都是void因為是要給使用者new的
有些比較細的內容可能要回去看ppt或影片
##存取函式/方法getset
多載的設定必須利用get與set
宣告說使用者如何輸入參數與多載回傳參數
###以上基本class設計結構都在以下Time2.java裡面有範例
###Time2.java程式碼
packagecom.example.java;publicclassTime2{ privateinthour;//0-23 privateintminute;//0-59 privateintsecond;//0-59 privateintmillisecond;//0-999 publicTime2(){ this(0,0,0,0); } publicTime2(inthour){ this(hour,0,0,0); } publicTime2(inthour,intminute){ this(hour,minute,0,0); } publicTime2(inthour,intminute,intsecond){ this(hour,minute,second,0); } publicTime2(inthour,intminute,intsecond,intmillisecond){ if(hour<0||hour>=24) thrownewIllegalArgumentException("輸入的小時必須在0-23"); if(minute<0||minute>=60) thrownewIllegalArgumentException("輸入的分必須在0-59"); if(second<0||second>=60) thrownewIllegalArgumentException("輸入的秒必須在0-59"); if(millisecond<0||millisecond>=999) thrownewIllegalArgumentException("輸入的微秒必須在0-999"); this.hour=hour; this.minute=minute; this.second=second; this.millisecond=millisecond; } publicTime2(Time2t){ this(t.getHour(),t.getMinute(),t.getSecond(),t.getMillisecond()); } publicvoidsetHour(inthour){ if(hour<0||hour>=24) thrownewIllegalArgumentException("輸入的小時必須在0-23"); this.hour=hour; } publicvoidsetMinute(intminute){ if(minute<0||minute>=60) thrownewIllegalArgumentException("輸入的分必須在0-59"); this.minute=minute; } publicvoidsetSecond(intsecond){ if(second<0||second>=60) thrownewIllegalArgumentException("輸入的秒必須在0-59"); this.second=second; } publicvoidsetMillisecond(intmillisecond){ if(millisecond<0||millisecond>=999) thrownewIllegalArgumentException("輸入的微秒必須在0-999"); this.millisecond=millisecond; } publicintgetHour(){ returnthis.hour; } publicintgetMinute(){ returnthis.minute; } publicintgetSecond(){ returnthis.second; } publicintgetMillisecond(){ returnthis.millisecond; } publicStringtoUniversalString(){ returnString.format("%02d:%02d:%02d",hour,minute,second); } publicStringtoString(){ returnString.format("%d:%02d:%02d%s",((hour==0||hour==12)?12:hour%12),minute,second, (hour<12?"AM":"PM")); }}###自建類別或物件
其實就是
宣告一些變數來放值
New些物件來用
多載些不同參數型態數量的類別或物件
提供些方法讓人用
最後再加上繼承、多型
接著老師在講
物件模組化
低耦合高內聚力
減少行數的
低維護成本
降低錯誤可能性
概念
##補充概念:
Set又稱改變方法mutatormethod
Get又稱讀取方法accessormethod
看ptt補
實作getset好像和
把實體變數宣告為public沒啥兩樣
1. 因為宣告為public他會沒辦法驗證參數
2. 具有隱私性(商業邏輯可以藏在裡面
雖然getset方法提供了存取private資料的途徑,但其實還是在現制的方法下
Set方法具有有效性的檢查
但並不會宣告private就自動出現,必須自己實作
內建的
判定方法predicatemethod
例如ArrrayList的isEmpty方法
###接著Time2Test.java
實作try呼叫剛剛做的函數crath錯誤訊息物件
###程式碼
packagecom.example.java;publicclassTime2Test{ publicstaticvoidmain(String[]args){ //TODO自動產生的方法Stub. Time2t1,t2,t3,t4,t5,t6; t1=newTime2(); t2=newTime2(2); t3=newTime2(21,35); t4=newTime2(21,35,46); t5=newTime2(21,35,24,55); try{ t6=newTime2(27,35,24,55); }catch(IllegalArgumentExceptionex){ System.out.printf("錯誤發生!物件初始畫錯誤:%s%n%n",ex.getMessage()); } displayTime("t1:時、分、秒、毫秒初始化為預設值",t1); displayTime("t2:指定小時,分、秒、毫秒初始化為預設值",t2); displayTime("t3:指定小時、分,秒、毫秒初始化為預設值",t3); displayTime("t4:指定小時、分、秒,毫秒初始化為預設值",t4); displayTime("t5:指定小時、分、秒、毫秒,初始化",t5); } privatestaticvoiddisplayTime(Stringheader,Time2t){ System.out.printf("%s%n%s%n%s%n",header,t.toUniversalString(),t.toString()); }}##複合composition
類別可以包含指向其他類別物件的參照(參數),做為類別成員
擁有關係(has-arelationship
###案例Employee自訂類別表示特定員工身分包含其他類別
###檔案Date.java類別(老師之前實作了
需要紀錄時間所以指向Date物件(生日與雇用時間)
String其實也是類別型態的變數
###老師程式碼
packagecom.example.java;publicclassDate{ privateintmonth;//1-12 privateintday;//1-31basedonmonth privateintyear;//anyyear privatestaticfinalint[]daysPerMonth={0,31,28,31,30,31,30,31,31,30,31,30,31}; publicDate(intmonth,intday){ this(month,day,2019); } publicDate(intmonth,intday,intyear){ if(month<=0||month>12) thrownewIllegalArgumentException("月份錯誤("+month+")必須在1-12"); if(day<=0||(day>daysPerMonth[month]&&!(month==2&&day==29))) thrownewIllegalArgumentException("日期錯誤("+day+")超過指定年、月的正常範圍"); if(month==2&&day==29&&!(year%400==0||(year%4==0&&year%100!=0))) thrownewIllegalArgumentException("日期錯誤("+day+")超過指定年、月的正常範圍"); this.month=month; this.day=day; this.year=year; System.out.printf("Date物件初始化成功:%s%n",this); } publicStringtoString(){ returnString.format("%d/%d/%d",month,day,year); }}接著實作
###Employee.java
展示複合packagecom.example.java;publicclassEmployee{ privateStringfirstName; privateStringlastName; privateDatebirthDate; privateDatehireDate; publicEmployee(StringfirstName,StringlastName,DatebirthDate,DatehireDate){ this.firstName=firstName; this.lastName=lastName; this.birthDate=birthDate; this.hireDate=hireDate; } publicStringtoString(){ returnString.format("%s,%s-雇用日期:%s-出生日期:%s",lastName,firstName,hireDate,birthDate); }}###EmployeeTest.java展示複合packagecom.example.java;publicclassEmployeeTest{ publicstaticvoidmain(String[]args){ //TODO自動產生的方法Stub Datebirth=newDate(7,24,2005); Datehire=newDate(3,12,2016); Employeeemployee=newEmployee("連杰","李",birth,hire); System.out.println(employee); }}剛剛都是動態類別成員
##靜態類別成員static案例
某些其況下特定變數只有一個副本,供類別所有物件共用
此情況下就會使用static欄位staticfield稱為類別變數classvariable
Static變數會用來表示權類別性的資訊
呼叫方式
值接給參照(位址)
或是類別名稱加上.
該類別尚未有物件存在時便已存在執行時期因為編譯的時候就編譯了
下次設計自己的class類別繼承階層
多型(Polymorphism)是指父類別可透過子類別衍伸成多種型態,而父類別為子類別的通用型態,再透過子類別可覆寫父類別的方法來達到多型的效果,也就是同樣的方法名稱會有多種行為。
感覺下次就會講多型因為跟繼承有關沒手機照片無法拍看ppt或影片吧
有少東西要看ptt
Previous2019/0508/Asp.Net_MVC_Model_ADO.NET+Entityframework+LoginMember實作+MVC觀念Next20919/0510/第八次專題報告=功能DEMOLastmodified3yragoCopylinkOutline#前期提要
##函式儲存記憶體型態##函式傳回值型別
##呼叫函式
#函式呼叫參數狀態有兩種方式
##函式方法多載(methodoverloading)
##自制類別與物件
##自建構類別與物件的預設值
利用throw丟出例外處理IllegalArgument
##題外話
如果不ctrl+f5清空暫存就會造成庫的版本引入錯誤
##this參照
##建構式不會有回傳型態都是void因為是要給使用者new的
##存取函式/方法getset
##複合composition
下次設計自己的class類別繼承階層
感覺下次就會講多型因為跟繼承有關