《Java從入門到放棄》JavaSE入門篇:面向對象語法二(入門版)

来源:http://www.cnblogs.com/yixueyuan/archive/2017/09/08/7495281.html
-Advertisement-
Play Games

想了半天,發現單獨的封裝和多態沒什麼好講的,我們就簡單說說Java裡面對應的語法吧。 相關內容如下: 一、訪問修飾符 二、getter/setter方法 三、構造方法 四、super和this 五、static關鍵字 六、final關鍵字 七、方法重寫 八、抽象類和介面 一、訪問修飾符 Java當中 ...


想了半天,發現單獨的封裝和多態沒什麼好講的,我們就簡單說說Java裡面對應的語法吧。

相關內容如下:

一、訪問修飾符

二、getter/setter方法

三、構造方法

四、super和this

五、static關鍵字

六、final關鍵字

七、方法重寫

八、抽象類和介面

 


一、訪問修飾符

    Java當中有四種情況,按其訪問範圍的順序由小到大分別是:

    priate(私有)---->default(預設)---->protected(受保護)---->public(公共)

    訪問範圍可以看下圖:

wKiom1myNxuQPLdKAAE5Kz-gujY567.png


二、getter/setter方法

    這個屬於封裝,前面例子中的女神的年齡,一般年齡肯定不能小於0吧,如果小於0了就給個預設值18,所以我們通過使用get/set方法來封裝這個屬性,就可以對屬性的取值進行限定了。

1 2 3 4 5 6 7 8 9 10 11 12 private int age;      //年齡,定義為私有 public int getAge() {     return age; } public void setAge(int age) {     if(age<=0){         this.age = 18;     }     else{         this.age = age;     } }

三、構造方法

    構造方法一般用於在初始化對象時就給對象的屬性賦值,前面我們創建一個女神對象是這樣寫的代碼:

1 2 3 4 5 6 //創建三個女神類型的對象 Goddess lin = new Goddess();    //女神對象 lin.name = "林志玲"; lin.age = 43; lin.stature = 1.73; lin.faceValue = 99;       //顏值

如果使用構造方法,需在要對應的內中寫一個沒有返回值類型的方法,並且方法名與類名相同,同時,為了保證還能創建空白對象,我們還要編寫一個無參的構造方法,代碼如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 public class Goddess extends Woman {     public int faceValue;     //顏值           public int getFaceValue() {         return faceValue;     }     public void setFaceValue(int faceValue) {         this.faceValue = faceValue;     }           public Goddess() {}    //為了保證以後還能初始化空白的對象,保留無參的構造方法     public Goddess(String name,int age, double stature, int faceValue){         this.setName(name);         this.setAge(age);         this.setStature(stature);         this.setFaceValue(faceValue);     } }

創建對象的代碼就簡單很多了:

1 Goddess lin = new Goddess("林志玲"431.7399);  //女神對象

四、super和this

    觀察仔細的人應該發現,上面的代碼中出現了“this”關鍵字,這個表示“當前對象”,另外一個“super”表示父類對象。

    上面的代碼可以做如下修改,如果父類也有構造方法,子類可以使用“super”來調用:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 //父類中的構造方法代碼 public class Woman(){     public Woman(String name,int age, double stature){         this.setName(name);         this.setAge(age);         this.setStature(stature);     } } //子類中的構造方法代碼 public class Goddess extends Woman {     public Goddess(String name,int age, double stature, int faceValue){         super(name, age, stature);         this.setFaceValue(faceValue);     } }

註意:調用父類的構造方法super(),必須寫在第一行。

wKioL1myShXA9_RQAAQrgMywefs597.png


五、static關鍵字

    被static修飾的東西,我們稱之為靜態的。比較常用的有靜態變數,靜態方法,靜態代碼塊。

    5.1 靜態變數

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 //在女神類中添加一個靜態變數     public static int count = 0;       //女神總數       //測試代碼 public static void main(String[] args) {     //創建三個女神類型的對象     Goddess lin = new Goddess("林志玲"431.7399);  //女神對象     lin.count++;     Goddess wang = new Goddess();   //女神對象     wang.count++;     wang.setName("王祖賢");     Goddess li = new Goddess(); //女神對象     li.setName("李冰冰");     li.count++;           System.out.println(lin.count);  //結果為3 }

最終的列印結果為3,也就是說count是整個女神群體所共用的一個屬性。改變了A的count屬性的值為250,那麼B和C的count屬性值也變成了250。

    5.2靜態方法

    靜態方法和靜態變數的用法類似,也是整個群體共用的方法,就定義成靜態的,靜態方法還有個好處,可以直接通過類名來訪問,而不用創建對象。

1 2 3 4 5 6 7 8 //女神類中添加靜態方法 public static void haha(){     System.out.println("我是女神!"); } //測試代碼 public static void main(String[] args) {     Goddess.haha();    //通過類名調用方法 }

    5.3靜態代碼塊

    這個東西就比較好玩的,它只會在JVM載入類時執行一次。

1 2 3 static{     System.out.println("我是靜態代碼塊!"); }

Java代碼的執行順序:

靜態變數初始化→靜態代碼塊→初始化靜態方法→初始化實例變數→代碼塊→構造方法


六、final關鍵字

    可以用來修飾屬性、方法和類。

    放在屬性前,表示這個屬性是個常量,必須在定義的時候賦值,並且以後不能修改其值。

    放在方法前,表示這個方法不能被子類重寫(下一點會講到方法重寫)。

    放在類前,表示這個類不允許被繼承。

    代碼我就不演示了,這個比較簡單,小伙們自行試試就OK了。


七、方法重寫

    方法重寫的目標,子類要改寫父類某個方法的實現。說直白點就是老子是礦工,有挖礦的方法,用鐵鍬來挖礦,兒子是挖礦師,繼承了礦工的方法,只不過他是用挖掘機來挖礦。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 //礦工類(父類) public class Miner {     public void mining(){         System.out.println("用鐵鍬一鍬一鍬的挖礦!");     } } //挖礦員(子類) public class DigMember extends Miner {         //重寫了父類的挖礦方法     public void mining(){         System.out.println("用挖掘機挖礦!");     } } //測試代碼 public static void main(String[] args) {     Miner miner = new DigMember();      //創建礦工的子類對象挖礦員     miner.mining();         //調用挖礦方法 }

結果:

wKioL1myTI_DVQinAAAa_9fMuE8175.png

通過結果可以發現,雖然定義的是父類變數,但new的是子類對象,所以調用的是子類的方法。如果是new的父類對象,那麼調用結果就是父類的方法。


八、抽象類和介面

    抽象類(abstract):就是個抽象的類......,它最大的特征就是不能直接實例化,必須先有個子類(非抽象類),然後可以new子類對象。把剛纔的礦工改成抽象類:

1 2 3 4 5 public abstract class Miner {     public void mining(){         System.out.println("用鐵鍬一鍬一鍬的挖礦!");     } }

    如果現在創建一個礦工對象,會報語法錯誤:

wKioL1myTbWBZinUAAAdpAIIIRw707.png

    但創建子類(子類不能是抽象類)對象是可以的:

wKioL1myTe7RKYbOAAAgDMg4m5I785.png

為什麼要使用抽象類呢?因為有些類就是抽象的啊!!!j_0025.gif

比如動物,請問,動物是什麼顏色?有幾條腿?怎麼移動的?有幾隻翅膀?

是不是都不知道!!!

不知道就對了,因為動物就是個抽象的概念,像什麼貓、狗、人、日本人等等都是動物的一個子類。你能在現實生活中找出一個原生態的動物,它既不是貓也不是狗更不是任何其他動物的子類嗎?

如果能的話··········,請收下我的膝蓋!!!j_0004.gif

    介面(interface):介面是什麼呢?拿出你的U盤看看,再插到電腦的USB介面試試,如果你的滑鼠是USB介面的,請看看滑鼠的介面和U盤的介面有沒有什麼不一樣?

    聰明的各位應該已經發現了吧,這兩個的介面是一模一樣的!!!j_0036.gif

    介面一般只是定義一個標準,它沒有具體的功能(看看你的電腦上的USB介面,請告訴我它是乾什麼的?可以加熱食物麽?可以冷藏飲料麽?可以看電影麽?都不行!)。

    但我們可以實現這個標準介面的工具,比如實現了該介面的U盤,就可以通過這個介面來保存數據,實現了該介面的鍵盤,就可以通過這個介面往電腦里輸入數據。

    如果上面例子中的挖礦員會開車,而礦工不會,並且以後還會有另外一個單獨的司機類也可以開車,那麼,我們就可以把開車定義成一個介面。需要會開車的類,去實現這個介面就行了。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 //定義開車的介面 //開車介面 public interface IDrive {     //開車方法     void drive(); } //挖礦員類實現開車介面 public class DigMember extends Miner implements IDrive {     public void mining(){         System.out.println("用挖掘機挖礦!");     }       public void drive() {         // TODO Auto-generated method stub         System.out.println("我會開挖掘機!!!");     }   }

最後:抽象類和介面有什麼區別呢?

抽象類側重於一個群體,而介面側重於功能。

大家實現下麵這個案例就知道區別了:

創建一個集合(或數組)保存所有參加動物賽跑比賽的選手(有兔子、烏龜、小雞、獅子),再創建一個集合(或數組)保存所有參加飛行比賽的選手(飛機,老鷹,超人,擎天柱)。註意這些選手都會飛,但不一定有同一個父類。

 

今天的內容就到這兒吧,都只講了些基礎語法,有很多使用上的細節,大家可以拿些項目中的例子,我們一起來分析哈!

 

“軟體思維”博客地址:51CTO博客園,感興趣的小伙伴可以去看相關的其它博文。  

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 問題描述:給定一個字元串,找出這個字元串中最長的不重覆串。 比如:對於字元串"abba",那麼返回的結果應該是"ab"或者"ba"(返回一個即可);對於字元串"acbba",返回的應是"acb" 思路一:利用HaspMap,map的key存儲的是字元,value存儲的是字元當前的位置 1、如果當前字 ...
  • 經歷無數苦難,好不容易,網站終於上線了。=。=內牛滿面ing。chengmingwei.top就是本員工管理系統的主頁啦。是的,很簡陋,但是畢竟是第一次嘛,所以慢慢來嘛。 如上次所說的(網站簡介,見:http://www.cnblogs.com/mingwei-cheng/p/7458269.htm ...
  • 1 #!/usr/bin/env python 2 # _author: bruce 3 # @DATe : 2017-09-08 4 5 proud_list = [ 6 ('iphone6s',6800), 7 ('ipad',3000), 8 ('mac book',9800) 9 ] 10 ... ...
  • 安裝JDK/安裝JRE以及配置java環境變數對於java初學者來說是一件比較頭疼的事情,這邊分享一個簡單的批處理命令,助大家一步完成JDK或者單獨安裝JRK的需求。 關鍵步驟: 1.新建一個.txt文檔,複製附件一/附件二到文檔中; 2.修改文檔中的內容: 附件一:start /WAIT jdk- ...
  • 輸出結果 有時候,輸出結果是: 測試結果: 1 WaitForAll 不會阻塞主線程。 2 100 個 TTask 不會創建100個線程,不用寫代碼就可得到 【線程池】 一樣的功能! 3 無法判斷 Task 全部結束?? 4 線程中涉及到 【介面】時要多註意! 測試環境: win10 + delph ...
  • 今天做了個實現驗證碼功能的小demo,但驗證碼無法輸出到訪問頁面,報錯如下: 圖片寫入response.getOutputStream代碼如下: 隨後百度了一下,將 改為 就可以正常顯示了 _(:з」∠)_ 。。。 ...
  • ``` def test(a, b, c=3): print(locals()) # 混用兩種,確保順序命名在前 test(c = 30, 1, 2) SyntaxError: positional argument follows keyword argument ``` ...
  • 每次我發佈軟體工程師的崗位工作要求 ,各種求職申請就會紛至沓來,接踵而至 。但每每讓我困惑的是, 似乎總有那麼幾位應聘者完全不明白所謂“編程”的意思。 當然,他們另有想法。 而我認為,如果你應聘的是“Web 前端開發”崗位,那麼你只懂jQuery也可以勝任,那麼,“軟體工程師”是不是就意味著會HTM ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...