爲何要有面向對象編程,由於萬物皆是對象。java
對象是咱們描述/建模現實世界的最佳工具。編程
面向對象是一種思想,將功能封裝進對象,強調具有了功能的對象。函數
舉個例子:小汽車是一個對象沒問題吧,這個對象有底盤,輪胎,車身,中控等屬性。
除此以外,這個對象還具有一些動做,如前進,後退,轉彎。工具
你看,用面向對象來描述世間萬物是否是特別地流暢易懂。this
說到面向對象,要澄清兩個概念,一個是「類」,一個是「實例」。code
類是具備相同特性和行爲的對象集合,是一個抽象定義。對象
好比人類就是一個類,而實例是以類爲模板,生成有意義的實體。作用域
好比你,我,他都是人類的一個實例,這麼類比應該好理解了吧。字符串
先記住類的定義怎麼寫,參考下面僞代碼:面向對象編程
class 類名{ 數據類型 屬性 ; …. public 返回值的數據類型 方法名稱(參數1,參數2…){ 程序語句 ; [return 表達式;] } }
類名告訴計算機,咱們對某一類事物進行了抽象,把共同的屬性和行爲提取出來,請看圖:
第一隻小黃貓,第二隻小奶貓沒問題吧。如今咱們把它們都抽象成貓類,都有四肢,尾巴,能跑能吃。
此後,咱們就有了貓類這個概念。若是還不能理解,請給我留言。
在src目錄右鍵,New -> Java Class
輸入Cat做爲類名
/** Cat.java 文件 * 類名,Cat * 這個類裏什麼都沒定義 */ public class Cat { }
以上代碼即定義了一個類,類名叫Cat
前面提到的黃貓,奶貓都是貓類的實例。實例不是一個抽象概念,而是一個具體的物體。
在src目錄右鍵,New -> Java Class
輸入SeventhLessonOO
public class SeventhLessonOO { public static void main(String[] args) { /** * 新建一個實例,該變量的名字叫milkCat */ Cat milkCat = new Cat(); } }
Cat.java 和 SeventhLessonOO.java 都在src目錄下
以上代碼即實例化了一隻奶貓。
Java根據構造函數來生成實例。
爲了舉例說明構造函數怎麼使用,修改Cat.java以下
public class Cat { private String name; /* (1) 爲了說明構造函數,咱們修改Cat的定義,加入name成員變量 */ /** * 這就是構造函數,這個函數沒有返回值,也不須要在public後面寫void * 記住這個語法規則 */ public Cat(String name) { this.name = name; /* this關鍵字表示當前實例自己 */ /* * 上面這句話的意思時,函數參數name的值,賦值給實例自己的name,即(1)處定義的private String name; */ } }
如何調用構造函數
public class SeventhLessonOO { public static void main(String[] args) { /** * 新建一個實例,該變量的名字叫milkCat * 因爲咱們聲明瞭構造函數,則必須使用構造函數 * 傳入一個字符串參數 * "I m milkCat 會傳遞給參數name */ Cat milkCat = new Cat("I m milkCat"); } }
以上就是調用構造函數的過程,若是還寫new Cat();會報錯。
由於咱們已經聲明瞭構造函數,那麼就要按構造函數的定義來生成實例。
咱們說過,貓這個類,有四肢,有尾巴。如今咱們再次修改類的定義
加入body成員變量
public class Cat { private String name; /* (1) 爲了說明構造函數,咱們修改Cat的定義,加入name成員變量 */ private String body; /* 新加了body成員變量 */ /** * 這就是構造函數,這個函數沒有返回值,也不須要在public後面寫void * 記住這個語法規則 * * 新加了body參數 */ public Cat(String name, String body) { this.name = name; /* this關鍵字表示當前實例自己 */ /* * 上面這句話的意思時,函數參數name的值,賦值給實例自己的name,即(1)處定義的private String name; */ this.body = body; } }
成員函數能夠類比成這個類能夠有什麼動做。貓能夠叫,能夠跑
爲了更好地直觀感覺成員函數,咱們修改Cat這個類,讓Cat這個類能夠畫一隻貓
修改Cat.java
public class Cat { private String name; /* (1) 爲了說明構造函數,咱們修改Cat的定義,加入name成員變量 */ private String body; /* 新加了body成員變量 */ /** * 這就是構造函數,這個函數沒有返回值,也不須要在public後面寫void * 記住這個語法規則 * * 新加了body參數 */ public Cat(String name, String body) { this.name = name; /* this關鍵字表示當前實例自己 */ /* * 上面這句話的意思時,函數參數name的值,賦值給實例自己的name,即(1)處定義的private String name; */ this.body = body; } /** * 定義一個成員函數 * 經過System打印地方式輸出貓的字符樣子 */ public void drawMyself() { System.out.println("Ooooo I am " + this.name); System.out.println(body); } }
修改main函數
public class SeventhLessonOO { public static void main(String[] args) { /** * 新建一個實例,該變量的名字叫milkCat * 因爲咱們聲明瞭構造函數,則必須使用構造函數 * 傳入一個字符串參數 * "I m milkCat 會傳遞給參數name */ String body = " A_A" + "\n" + " (-.-)" + "\n" + " |-|" + "\n" + " / \\" + "\n" + "| | __" + "\n" + "| || | | \\___" + "\n" + "\\_||_/_/\n"; Cat milkCat = new Cat("I m milkCat", body); /** * 這句話讓實例自己,調用成員函數,即 * 小奶貓把本身"畫"出來 */ milkCat.drawMyself(); } }
程序輸出:
Ooooo I am I m milkCat A_A (-.-) |-| / \ | | __ | || | | \___ \_||_/_/
是否是有點意思