java 小坑_关于Java子父类关系的小坑
原標題:關于Java子父類關系的小坑
學過JavaSE的都知道java類在初始化的時候,如果存在直接父類,是先初始化父類,然后才初始化子類。
子類擁有父類所有的非私有化成員,非私有的成員不僅僅包括public修飾的成員,protected修飾的(protected修飾的可以訪問其他包中子父類),不寫訪問修飾符是默認default修飾(只能訪問同一個包中的類)。
由類的加載機制可以得知,類的加載包括加載,驗證,準備,解析,初始化這幾個階段。
其中:類靜態變量初始化是在虛擬機的方法區中初始化的,類的實例變量會在類實例化時跟隨類的實例在堆內存中初始化。準備階段是正式為類變量分配內存并設置類變量初始值的階段。準備階段為類靜態變量初始化時,如果一個類靜態變量比如:pulicstaticinta=3;則在初始化階段該變量初始化值為0,而不是3,因為此時類還未被編譯。還未執行任何java方法,而給靜態變量賦值是在類實例初始化之后,存放于類構造器中的。
正由于子父類關系的存在,方便了框架公共代碼的抽取,比如在快遞項目中,所有Action類抽取父類CommonAction的時候,就是利用子父類的關系將公共代碼抽取出來,這樣再創建Action的時候就可以避免重復代碼的編寫。
在利用EasyUI和springdatajpa進行分頁查詢的時候,前臺頁面傳來兩個參數page,rows
后臺接收到參數之后封裝為pageable進行分頁查詢。如果利用抽取的思想封裝重復代碼到CommonAction中,代碼如下。
值得注意的是,如果直接寫protectedPageablepageable=newPageRequest(page-1,rows);訪問項目的時候會報頁碼不能為0的異常,這是由于雖然把公共代碼抽取到父類中,但是這行代碼在初始化子類的時候就會執行,而此時page和rows都是int類型成員的默認值0,而page-1是從0開始的,所以會報頁碼不能為0的異常。
而如果按照正確的封裝方法,由于只有在調用方法的時候才會給pageable賦予實際的值,所以會正常執行。
這個案例給我的啟發就是:
1.利用繼承的方式抽取公共代碼的時候要注意訪問修飾符,做到對自有成員的封裝和子類訪問的權衡。
2.子類訪問父類成員的時候,注意直接訪問成員和調用方法訪問的區別。
更多測試工具,請前往51Testing軟件測試網。(http://www.51testing.com)返回搜狐,查看更多
責任編輯:
總結
以上是生活随笔為你收集整理的java 小坑_关于Java子父类关系的小坑的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 优化300例_MySQL配置
- 下一篇: JAVA数据库第四章上机3_Java第二