面向對象有三大特性:封裝、繼承、多態。
封裝就是將類的信息隱藏在類的內部,不允許外部程序直接訪問,而是通過該類提供的方法來實現對隱藏信息的操作和訪問。那這樣的好處是什么呢?
1. 只能通過規定的方法訪問數據
2. 隱藏類的實例細節,方便修改和實現。
我們在開汽車的時候,只用去關注如何開車,我們并不在意車子是如何實現的,這就是封裝。
如何去實現類的封裝呢?
修改屬性的可見性,在屬性的前面添加修飾符
創建 getter/setter 方法,用來讀寫屬性
在 getter/setter 方法里加入屬性的控制語句,例如我們可以加一個判斷語句,對于非法輸入給予否定。
package com.shiyanlou;public class People {//屬性(成員變量)有什么,前面添加了訪問修飾符PRivate//變成了私有屬性,必須通過方法調用 private double height; //身高//屬性已經封裝好了,如果用戶需要調用屬性//必須用getter和setter方法進行調用//getter和setter方法需要程序員自己定義 public double getHeight(){ //getter 方法命名是get關鍵字加屬性名(屬性名首字母大寫) //getter 方法一般是為了得到屬性值 return height; }//同理設置我們的setter方法//setter 方法命名是set關鍵字加屬性名(首字母大寫)//setter 方法一般是給屬性值賦值,所以有一個參數 public void setHeight(double newHeight){ height = newHeight; }}然后在我們的 main 函數里的對象,不能再直接調用屬性了,只能通過getter
和setter
方法進行調用。
package com.shiyanlou;public class LiLei { public static void main(String[] args) { // TODO Auto-generated method stub People LiLei = new People(); //創建了一個People對象LiLei //利用setter方法為屬性賦值 LiLei.setHeight(170.0); //利用getter方法取屬性值 System.out.println("LiLei的身高是"+LiLei.getHeight()); }}包
我有時候在封裝的時候會遇到這樣的問題,就是我們的類名可能是重復的。這時候我們就可以用包
的概念來解決我們的問題。
包的作用就是管理java文件,解決同名文件沖突。這和我們生活當中的管理相類似。我們的衣柜是不是有不同的隔斷和抽屜,我們將衣服分門別類地放好,是不是有利于我們管理。
我們在以前就學習過了如何定義一個包,我們使用package
關鍵字,加上我們的包名。
定義包語法:
package 包名//注意:必須放在源程序的第一行,包名可用"."號隔開例如:
//我們在定義文件夾的時候利用"/"來區分層次//包中我們用"."來分層package com.shiyanlou.Java 比如我們在游戲里會用到音樂類,在電影里我們也會用到音樂類,但是他們的類又不相同,我們就可以利用包進行區分。
不僅是我們這樣利用包名來區分類,系統也是這樣做的。

那我們怎么在不同包中使用另一個文件中的類呢?這時候就需要用到import
關鍵字。比如我們要導入實驗樓下People
這個類。import com.shiyanlou.Peole
,同時如果import com.shiyanlou.*
這是將包下的所有文件都導入進來。
這里要注意一點,包的命名規范是全小寫字母拼寫。
Java 中的訪問修飾符
訪問修飾符可以用來修飾屬性和方法的訪問范圍。

如圖所示,代表了不同的訪問修飾符的訪問范圍,比如private
修飾的屬性或者方法,只能在本類中訪問或者使用。默認是什么修飾符都不加,默認在當前類中和同一包下都可以訪問和使用。
我們可以舉一個例子,比如 money,如果我們用private
修飾代表著這是私有的,只能我自己可以使用。如果是protected
代表著我可以使用,和我有關系的人,比如兒子也可以用。如果是public
就代表了所有人都可以使用。
Java 中的 this 關鍵字
我們在書寫代碼的過程中常常會用到this
關鍵字,this
關鍵字代表當前對象。使用this.屬性
操作當前對象的屬性,this.方法
調用當前對象的方法。
當我們封裝對象屬性的時候,經常會使用this
關鍵字。
接下來我們來看看代碼中是怎么實現的吧。在上面我們講了用private
修飾的屬性,我們利用對象訪問的時候,必須定義getter和setter方法,其實在Eclipse中可以自動幫我們定義。
1、首先在菜單欄里點擊Source
也可以在左側右擊選擇Source

2、選擇Grenerate Getters and Setters

3、系統會自動幫我們檢測需要創建getter和setter方法的屬性,我們根據需要勾選就行了。
當系統幫我們創建好了getter和setter方法后,我們會發現系統創建的方法中參數名和我們的屬性名一樣。為了區分參數名和我們的屬性名,我們在屬性名前面添加了this
關鍵字。
public void setAge(int age) { this.age = age; } 此時就代表我們將一個參數的值賦給我們當前對象的屬性。同理this
關鍵字可以調用當前對象的方法。
Java 中的內部類
從字面意思我們就可以知道,內部類( Inner Class )就是定義在另外一個類里面的類,而包含內部類的類被稱為外部類。
內部類的主要作用如下:
內部類提供了更好的封裝,可以把內部類隱藏在外部類之內,不允許同一個包中的其他類訪問該類
內部類的方法可以直接訪問外部類的所有數據,包括私有的數據
內部類所實現的功能使用外部類同樣可以實現,只是有時使用內部類更方便
我們通過代碼來詳細學習一下內部類吧!
成員內部類:
package com.shiyanlou;//外部類Peoplepublic class People { private String name = "LiLei"; //外部類的私有屬性 //內部類Student public class Student { String ID = "20151234"; //內部類的成員屬性 //內部類的方法 public void stuInfo(){ System.out.println("訪問外部類中的name:" + name); System.out.println("訪問內部類中的ID:" + ID); } } //測試成員內部類 public static void main(String[] args) { People a = new People(); //創建外部類對象,對象名為a Student b = a.new Student(); //使用外部類對象創建內部類對象,對象名為b b.stuInfo(); //調用內部對象的suInfo方法 }}由此,我們可以知道,成員內部類的使用方法:
Student 類相當于 People 類的一個成員變量,所以 Student 類可以使用任意訪問修飾符
Student 類在 People 類里,所以訪問范圍在類里的所有方法均可以訪問 People 的屬性(即內部類里可以直接訪問外部類的方法和屬性,反之不行)
定義成員內部類后,必須使用外部類對象來創建內部類對象,即 內部類 對象名 = 外部類對象.new 內部類();
如果外部類和內部類具有相同的成員變量或方法,內部類默認訪問自己的成員變量或方法,如果要訪問外部類的成員變量,可以使用 this 關鍵字
靜態內部類:
package com.shiyanlou;//外部類Peoplepublic class People { private String name = "LiLei"; //外部類的私有屬性/*外部類的靜態變量。Java 中被 static 修飾的成員稱為靜態成員或類成員。它屬于整個類所有,而不是某個對象所有,即被類的所有對象所共享。靜態成員可以使用類名直接訪問,也可以使用對象名進行訪問。/* static String ID = "510xxx199X0724XXXX"; //靜態內部類Student public static class Student { String ID = "20151234"; //內部類的成員屬性 //內部類的方法 public void stuInfo(){ System.out.println("訪問外部類中的ID:" + People.ID); System.out.println("訪問內部類中的ID:" + ID); } } //測試成員內部類 public static void main(String[] args) { Student b = new Student(); //直接創建內部類對象,對象名為b b.stuInfo(); //調用內部對象的suInfo方法 }}靜態內部類是 static 修飾的內部類,這種內部類的特點是:
靜態內部類不能直接訪問外部類的非靜態成員,但可以通過 new 外部類().成員
的方式訪問
如果外部類的靜態成員與內部類的成員名稱相同,可通過類名.靜態成員
訪問外部類的靜態成員;如果外部類的靜態成員與內部類的成員名稱不相同,則可通過成員名
直接調用外部類的靜態成員
創建靜態內部類的對象時,不需要外部類的對象,可以直接創建 內部類 對象名= new 內部類();
方法內部類
方法內部類就是定義在外部類的方法中的內部類,方法內部類只在該方法的內部可見,即只在該方法內可以使用。
例如:
package com.shiyanlou;//外部類Peoplepublic class People { //外部類中的方法 public void peopleInfo() { final String sex = "man"; //外部類方法中的常量 class Student { String ID = "20151234"; //內部類中的常量 public void print() { System.out.println("訪問外部類的方法中的常量sex:" + sex); System.out.println("訪問內部類中的變量ID:" + ID); } } Student a = new Student(); //創建方法內部類的對象 a.print();//調用內部類的方法 } //測試方法內部類 public static void main(String[] args) { People b = new People(); //創建外部類的對象 b.peopleInfo(); //調用外部類的方法 }}運行結果:

新聞熱點
疑難解答