Java開發知識之Java面相對象上
一丶什么是面相對象
了解什么什么是面相對象.那么首先要了解什么是面相過程. 面相過程的意思就是. 什么事情都親力親為. 比如上一講的排序算法. 我們自己寫的. 這個就是面相過程. 而使用面相對象的話.我們直接調用別人寫好的sort()方法即可.
面相過程的比喻: 你想吃東西. 買東西. 切菜. 下鍋. 做好了. 吃飯.
面相對象: 直接商店買了. 直接吃. 你省去了買東西. 切菜 下鍋. 自己做的步驟. 這個就是面相對象.
1.1對象的理解
現實世界中.隨處可見的就是對象. 對象就是實體.
比如我們人就是一個對象. 都有各自的腦袋 鼻子 嘴巴. 等等.
1.2 類的理解
上面說了.人就是一個對象. 人是屬於人類的. 對象是人類的一個實體. 類只是用來描述人該有的一些列信息的.
比如人有頭 手 五官 腿 等等. 我們的對象就是基於這些描述來創造出來的.
1.3 面相對象的核心 封裝繼承.多態.
封裝.就是指將對象的屬性跟行為.封裝起來.封裝成一個類. 類就是對別人隱藏實現細節. 這個就是封裝.什么意思; 意思就是比如人. 人的各種行為.屬性. 我把它看做是
一個人類. 我們使用的時候只需要創造一個人類即可. 而不用管 人的器官怎么構成的.
繼承: 繼承就是類跟類之間的關系. 比如父親跟孩子. 就是有關系的. 孩子可以繼承父親的家產. 就是說孩子如果繼承了父親.那么就能使用父親的東西.
當然.父親不可能所有的東西都會被孩子繼承.也就是說.父親的特有的東西孩子不能繼承.比如.你們懂得. 所以就有權限一說.
private protected public 分別是私有 保護 跟公共. 父親私有了,那么你就不能繼承這個了. 保護的話就是只有跟自己有關系的才能繼承. 比如有兒子 跟女兒. 兩個都可以繼承. 公共的就是所有人都可以使用.
多態: 多態不難.但是理解起來有點難. 多態就是指.類跟類之間有關系了. 那么父類指向子類. 父類可以使用子類共有的方法.
多態的意思就是指. 同一種操作.有不同的代碼展示.
比如 兩個類中都有eat方法. B繼承A 父類eat輸出就是父類吃. 子類輸出就是子類吃
A a = new B(); a.eat();
輸出結果 子類吃. 為什么是這樣的結果.我們明明是父類在前邊? 這個就是多態. 父類調用子類行為. 這樣的話.如果有很多子類都繼承了這個父類.那么我們只需要更換子類.就可以調用子類的特有的方法了.
多態總結就是: 父類指向子類, 運行時調用子類. PS: 子類必須跟父類的方法是一樣的.次可以實現多態.
二丶面相對象之Java中類的編寫
1.類編寫
上面我們說了一大堆概念,那么我們要講一下應用到編程中該怎么編寫.
首先上面說了. 類有自己的屬性跟行為. 在編程中就叫做 成員變量 與方法. 成元變量就是屬性. 行為就是 方法.
語法如下:
權限修飾符 class 類名 { 權限修飾符 數據類型 成員變量; 權限修飾符 數據類型 成員變量; ..... 權限修飾符 返回值 成員你方法(){ ..... } .... }
public class Anmail { public int hand; 屬性,成員變量 public void eat() { 行為,成員方法 System.out.println("父類吃"); } }
上面就定義了一個類. 屬性就是 hand(手) 方法就是 eat
我們這個類描述了. 一個動物類. 屬性就是有手. 都會吃東西.
2.權限修飾符
權限修飾符就是指 private public protected 我們上面也簡單說過作用. 其實就是為這個類加權限.如果成員變量是hand. 那么外部不能使用.我們必須提供公共方法去修改才可以. 如果是public. 外面可以直接使用.這樣設計就會出現問題. 自己私有的東西.別人如果能隨便訪問.那么不久出事了.
3.局部變量
局部變量就是在方法內部定義的變量. 作用域除了方法就沒用了. 也就是方法的{}里面除了{}就不可以使用了. 注意局部變量如果跟成員變量重名.那么你要進行區分.區分就是加上this關鍵字.
this.hand = hand; hand = 局部變量 this.hand就是成員變量.
this關鍵字代表的就是本類的引用. 可以理解為就是自己這個類. 我指定自己這個類的成員變量.
4.構造方法
構造方法是一種特殊的方法.跟成員方法不同.構造方法的作用就是.當對象創建的時候.會首次調用.也就是說自動調用. 如果我們沒有寫.那么就是默認給我們加了一個空構造.
構造方法跟成員方法的區別就是沒有返回值. 普通成員方法沒有返回值.是需要加上 void 返回值說明了. 而構造方法不需要. 構造方法的名字必須跟類名一致.
語法: 權限修飾符 類名() public class Anmail { public Anmail() {} 構造方法,沒有返回值 public int hand; public void eat() { 普通成員方法,要加void System.out.println("父類吃"); } }
構造方法可以進行重載. 意思就是說無參數構造就是沒有參數. 如果有參數 就是有參構造.
而且this另一個作用就是可以在構造中調用其他構造方法.注意加紅了. 可以在無參構造中使用.也可以在有殘構造中使用.而且必須放在首行代碼
public class Anmail { public Anmail() { this("11111111"); //this的另一種使用 System.out.println("無參數構造方法"); } public Anmail(String s) { System.out.println("輸入的字符串 = " +s); System.out.println("有參數構造方法"); } public int hand; public void eat() { System.out.println("父類吃"); } }
Anmail a = new Anmail();
輸出結果
二丶面相對象中的static關鍵字
1.static關鍵字以及作用
static 表示靜態的意思. 可以修飾常量. 變量 以及成員方法.
修飾之后就成了靜態常量. 靜態變量. 以及靜態成員方法.
static關鍵字修飾可以直接類名調用. 比如我們以前說的Arrays類. 我們可以直接 類名.變量/方法/常量 去使用.
static關鍵字主要的作用將就是內存共享了.
如上圖所示 PI 代表的是3.1415926. 我們需要進行內存共享.
static代碼塊:
static代碼塊是寫在類中的.作用就是用於做初始化的.只會執行一次
static {
...
}
static修飾需要注意的問題, 如果修飾成員方法. 那么就是靜態成員方法.其內部不可以訪問非靜態(成員變量.成員常量.成員方法) 因為類不需要創建對象.就可以存在了.而你訪問非靜態的時候.並沒有.因為沒有創建對象.
public class Anmail { public Anmail() { this("11111111"); System.out.println("無參數構造方法"); } public Anmail(String s) { System.out.println("輸入的字符串 = " +s); System.out.println("有參數構造方法"); } public static final int PI = 3; //靜態常量 public static int value1; //靜態成員變量 public static void run() { System.out.println("跑"); } public int hand; public void eat() { System.out.println("父類吃"); } }
定義了靜態常量(注意,定義的時候要進行初始化) 靜態成員變量. 靜態方法.
使用:
當我們直接 類名.的時候.會出現靜態可以調用的值. 比如PI value 以及run方法.
靜態方法不能使用 this 以及 非靜態成員變量 方法 常量
我們調用eat方法. 而eat並不是靜態成員方法. 所以標紅了.代表出錯了.eclipse還會提示你修改成靜態修飾才可以調用.
在靜態方法中還不能使用 靜態關鍵字進行定義局部變量
靜態代碼塊的編寫
static { System.out.println("靜態代碼塊執行了"); }
當我們刁穎run方法.他都會先執行靜態代碼塊進行初始化
2.主方法入口點
可能有人發現了. 我們的main方法就是static修飾的.
如果是static修飾的那么就需要注意了
1.主方法調用的其他成員方法必須是靜態的.
2.主方法沒有返回值
3.主方法的參數是一個數組.可以使用數組.length來獲取大小.
三丶對象的創建
1.對象的創建
上面我們講了類. 類就是用來描述的.我們真正有用的是對象. 那么對象怎么生成那
類名 變量名 = new 類名(); 后面括號里面可以填寫內容 里面可以填寫參數.填寫的參數就是指定調用類中的有參構造方法.
Anmail A = new Anmail("1111"); new Anmail創建的對象.使用A來代替. A.eat(); ,直接使用A來訪問了.
執行結果
首先靜態代碼塊先執行. 而后我們創建對象的時候使用的有參構造所以有參構造中首先輸出我們輸入的字符串.然后在輸出有參構造方法. 最后我們調用了eat方法.就執行了這個對象的行為.
需要注意的問題: 我們可以創建多個對象. A B C. 但是他們三個的內存是相互獨立的.互不影響. B成員變量的修改.不會影響到 A C. 如果有靜態修飾的成員變量. 或者常量. 那么他們三個是共享了.
上面我們使用的對象進行訪問成員方法. 那么我們也可以訪問成員變量. 成員變量如果是 public修飾. 那么可以直接 對象.成員變量 進行訪問. 如果是Private 那么我們就要專門提供Set Get 方法來對成員變量進行訪問.
也就是說提供了接口. 這樣使我們的程序安全性大大增加.
2.對象的引用
上面我們說了創建對象如何創建 類名 對象名 = new 類名();
那么引用是什么?
引用就是上面所說的對象名 我們可以直接定義對象.然后在new 類名 引用名稱; 引用名稱 = new....
那么引用有什么意思那?
引用可以看成是一個變量. new 類名() 其實是在內存中的堆空間申請了內存. 這塊內存的首地址給 對象名(引用)來保存. 那么我們直接就可以通過引用名來訪問
對象名.xxxx
當然我們也可以不給名字.那么沒人保存內存的地址.就成了無名對象.只能使用一次了.
new 類名(). 成員變量 = 10;
new 類名().成員方法();;
3.引用的比較(對象的比較)
上面我們簡單的說了一下. 對象其實就是保存了內存的地址. 這塊地址中有我們的成員變量等各種屬性. 那么我們兩個對象可以用來比較.
==比較. 如果==比較就是內存地址跟內存地址進行比較了. 因為兩個對象的內存地址肯定起始位置不同.進而地址比較就會不同.
而我們程序中.會默認繼承一個父類.也就是object類.會繼承他的成員方法. equals. 就是進行比較的.我們可以重寫這個方法.表示如果調用了這個方法.是比較什么.
我們首先使用String類創建的對象做演示
public static void main(String[] args) { // TODO 自動生成的方法存根 String A = new String("123"); String B = new String("123"); if (A == B) { System.out.println(" == 比較 A == B" ); } if(A.equals(B)) { System.out.println(" equals 比較 A == B" ); } }
運行結果:
我們使用== 比較的是地址.地址肯定不會相同.所以就不打印. 而是用equals. equals是String內部重寫的.他比較的是字符串. 如果字符串相同就是相同了.
4.垃圾回收機制
在C++中.創建對象使用 new 銷毀對象使用delete 所以有的構造跟析構函數. 但是Java中有垃圾回收機制.所以自然而言就不需要析構函數了.只需要構造函數即可.
垃圾回收機制就是我們不用管內存的釋放.他會自己釋放這塊內存.但是自動是由前提的.必須觸發兩個條件
1.對象超過其作用域 也就是說我們在一個塊語句中生成的對象.超過作用域就會進行銷毀
2.對象指向地址為NULL .我們知道對象是內存地址的別稱. 如果不指向任何內存地址.那么說明我們申請的哪塊地址沒人指向了也就沒人使用了.Java會把哪塊內存給我們釋放.
Java中強制進行垃圾回收可以使用System.gc()方法.
四丶面相對象總結
通過本博客可以學習到
1.什么是對象
對象就是基於類生成的一個實體.
2.什么是類
類就是描述行為跟屬性的一個模版
3.什么是多態
父類可以指向子類.調用子類跟父類共有的方法
4.什么是權限修飾符以及作用
public private protected 分別是公共 私有 保護. 進行修飾的成員變量則 子類會有不同的繼承狀態.
private修飾: 子類繼承父類.則不能繼承,且外部不可以調用這個成員方法
public修飾: 子類可以繼承父類所有的public修飾的成員(變量/方法) 外部可以直接使用
protected: 子類繼承父類. 只能是繼承關系才可以繼承.子類繼承父類. 其他類不能繼承父類.沒有關系.
5.怎么寫一個類模版
使用關鍵字 class 即可寫一個
權限修飾符 class 類名{ 權限修飾符 類型 成員變量 權限修飾符 返回值 方法名(參數) {} }
6.類中的成員變量 成員 方法. 有參數無參數構造
成員變量的定義:
權限修飾符 類型 變量名;
成員方法的定義
權限修飾符 返回值 方法名(參數){}
構造方法:
權限修飾符 類名(參數)// 有參構造
權限修飾符 類名()'; // 無參構造
7.this關鍵字的作用
1.可以區分成員變另以及局部變量 this.name = name;
2.可以在構造中調用其他構造 this()調用空構造 this("123"); 調用有參數構造
8.static關鍵字在類中的作用
靜態常量:
權限修飾符 static final 類型 變量名 = 值;
權限修飾符 final static 類型 變量名 = 值; //兩者都可以
靜態成員變量
權限修飾符 static 類型 變量名;
靜態成員方法
權限修飾符 static 返回值 方法名 (參數){}
靜態代碼塊:
static{....}
需要了解的知識點:
1.靜態常量定義的時候需要進行賦值
2.靜態方法不能調用非靜態方法.不能使用this關鍵
3.靜態代碼塊只會執行一次.且會第一次執行.常用與進行初始化
9.對象的引用,比較.以及無名對象
1.對象的引用就是一個對象名. 對象名存儲着new出來的堆內存.
2.無名對象就是不需要對象名去保存首地址了.只需要調用一次.
3.對象直接的地址比較可以使用== 如果比較對象中某一成員的值.可以使用 equals.你自己重寫equals即可.比較什么你自己寫.
String類是比較字符串. 你可以重寫.比如比較你類中的某一個值