Java开发知识之Java面相对象
Java開發(fā)知識(shí)之Java面相對(duì)象上
一丶什么是面相對(duì)象
了解什么什么是面相對(duì)象.那么首先要了解什么是面相過程. 面相過程的意思就是. 什么事情都親力親為. 比如上一講的排序算法. 我們自己寫的. 這個(gè)就是面相過程. 而使用面相對(duì)象的話.我們直接調(diào)用別人寫好的sort()方法即可.
面相過程的比喻:? 你想吃東西. 買東西. 切菜. 下鍋. 做好了. 吃飯.
面相對(duì)象:? 直接商店買了. 直接吃.? 你省去了買東西. 切菜 下鍋. 自己做的步驟. 這個(gè)就是面相對(duì)象.
?
1.1對(duì)象的理解
現(xiàn)實(shí)世界中.隨處可見的就是對(duì)象. 對(duì)象就是實(shí)體.
比如我們?nèi)司褪且粋€(gè)對(duì)象. 都有各自的腦袋 鼻子 嘴巴. 等等.
?
1.2 類的理解
上面說了.人就是一個(gè)對(duì)象. 人是屬于人類的. 對(duì)象是人類的一個(gè)實(shí)體. 類只是用來描述人該有的一些列信息的.
比如人有頭 手 五官? 腿 等等. 我們的對(duì)象就是基于這些描述來創(chuàng)造出來的.
1.3 面相對(duì)象的核心 封裝繼承.多態(tài).
封裝.就是指將對(duì)象的屬性跟行為.封裝起來.封裝成一個(gè)類. 類就是對(duì)別人隱藏實(shí)現(xiàn)細(xì)節(jié). 這個(gè)就是封裝.什么意思; 意思就是比如人. 人的各種行為.屬性. 我把它看做是
一個(gè)人類. 我們使用的時(shí)候只需要?jiǎng)?chuàng)造一個(gè)人類即可. 而不用管 人的器官怎么構(gòu)成的.
繼承: 繼承就是類跟類之間的關(guān)系. 比如父親跟孩子. 就是有關(guān)系的. 孩子可以繼承父親的家產(chǎn). 就是說孩子如果繼承了父親.那么就能使用父親的東西.
當(dāng)然.父親不可能所有的東西都會(huì)被孩子繼承.也就是說.父親的特有的東西孩子不能繼承.比如.你們懂得. 所以就有權(quán)限一說.
private? protected public 分別是私有 保護(hù) 跟公共. 父親私有了,那么你就不能繼承這個(gè)了. 保護(hù)的話就是只有跟自己有關(guān)系的才能繼承. 比如有兒子 跟女兒. 兩個(gè)都可以繼承. 公共的就是所有人都可以使用.
多態(tài): 多態(tài)不難.但是理解起來有點(diǎn)難. 多態(tài)就是指.類跟類之間有關(guān)系了. 那么父類指向子類.? 父類可以使用子類共有的方法.
多態(tài)的意思就是指. 同一種操作.有不同的代碼展示.
比如 兩個(gè)類中都有eat方法.? B繼承A? 父類eat輸出就是父類吃. 子類輸出就是子類吃
A a = new B();? a.eat();
輸出結(jié)果 子類吃. 為什么是這樣的結(jié)果.我們明明是父類在前邊? 這個(gè)就是多態(tài). 父類調(diào)用子類行為. 這樣的話.如果有很多子類都繼承了這個(gè)父類.那么我們只需要更換子類.就可以調(diào)用子類的特有的方法了.
多態(tài)總結(jié)就是:? 父類指向子類,? 運(yùn)行時(shí)調(diào)用子類.? PS: 子類必須跟父類的方法是一樣的.次可以實(shí)現(xiàn)多態(tài).
二丶面相對(duì)象之Java中類的編寫
1.類編寫
上面我們說了一大堆概念,那么我們要講一下應(yīng)用到編程中該怎么編寫.
首先上面說了. 類有自己的屬性跟行為. 在編程中就叫做? 成員變量 與方法.? 成元變量就是屬性. 行為就是 方法.
語法如下:
權(quán)限修飾符 class 類名 {權(quán)限修飾符 數(shù)據(jù)類型 成員變量;權(quán)限修飾符 數(shù)據(jù)類型 成員變量;.....權(quán)限修飾符 返回值 成員你方法(){.....} .... }?
public class Anmail {public int hand; 屬性,成員變量public void eat() { 行為,成員方法System.out.println("父類吃");} }上面就定義了一個(gè)類. 屬性就是 hand(手) 方法就是 eat
我們這個(gè)類描述了. 一個(gè)動(dòng)物類. 屬性就是有手. 都會(huì)吃東西.?
2.權(quán)限修飾符
權(quán)限修飾符就是指 private public protected 我們上面也簡(jiǎn)單說過作用. 其實(shí)就是為這個(gè)類加權(quán)限.如果成員變量是hand. 那么外部不能使用.我們必須提供公共方法去修改才可以. 如果是public. 外面可以直接使用.這樣設(shè)計(jì)就會(huì)出現(xiàn)問題. 自己私有的東西.別人如果能隨便訪問.那么不久出事了.
3.局部變量
局部變量就是在方法內(nèi)部定義的變量. 作用域除了方法就沒用了. 也就是方法的{}里面除了{(lán)}就不可以使用了. 注意局部變量如果跟成員變量重名.那么你要進(jìn)行區(qū)分.區(qū)分就是加上this關(guān)鍵字.
this.hand = hand;? hand = 局部變量? this.hand就是成員變量.
this關(guān)鍵字代表的就是本類的引用. 可以理解為就是自己這個(gè)類. 我指定自己這個(gè)類的成員變量.?
4.構(gòu)造方法
構(gòu)造方法是一種特殊的方法.跟成員方法不同.構(gòu)造方法的作用就是.當(dāng)對(duì)象創(chuàng)建的時(shí)候.會(huì)首次調(diào)用.也就是說自動(dòng)調(diào)用. 如果我們沒有寫.那么就是默認(rèn)給我們加了一個(gè)空構(gòu)造.
構(gòu)造方法跟成員方法的區(qū)別就是沒有返回值. 普通成員方法沒有返回值.是需要加上 void 返回值說明了. 而構(gòu)造方法不需要. 構(gòu)造方法的名字必須跟類名一致.
語法: 權(quán)限修飾符 類名() public class Anmail {public Anmail() {} 構(gòu)造方法,沒有返回值public int hand;public void eat() { 普通成員方法,要加voidSystem.out.println("父類吃");} }構(gòu)造方法可以進(jìn)行重載. 意思就是說無參數(shù)構(gòu)造就是沒有參數(shù). 如果有參數(shù) 就是有參構(gòu)造.
而且this另一個(gè)作用就是可以在構(gòu)造中調(diào)用其他構(gòu)造方法.注意加紅了. 可以在無參構(gòu)造中使用.也可以在有殘構(gòu)造中使用.而且必須放在首行代碼
public class Anmail {public Anmail() {this("11111111"); //this的另一種使用System.out.println("無參數(shù)構(gòu)造方法");}public Anmail(String s) {System.out.println("輸入的字符串 = " +s);System.out.println("有參數(shù)構(gòu)造方法");}public int hand;public void eat() {System.out.println("父類吃");} }Anmail a = new Anmail();
輸出結(jié)果
?
二丶面相對(duì)象中的static關(guān)鍵字
1.static關(guān)鍵字以及作用
static 表示靜態(tài)的意思. 可以修飾常量. 變量 以及成員方法.
修飾之后就成了靜態(tài)常量. 靜態(tài)變量. 以及靜態(tài)成員方法.
static關(guān)鍵字修飾可以直接類名調(diào)用. 比如我們以前說的Arrays類.? 我們可以直接 類名.變量/方法/常量 去使用.
static關(guān)鍵字主要的作用將就是內(nèi)存共享了.
如上圖所示 PI 代表的是3.1415926. 我們需要進(jìn)行內(nèi)存共享.?
?static代碼塊:
static代碼塊是寫在類中的.作用就是用于做初始化的.只會(huì)執(zhí)行一次
static {
?
...
}
static修飾需要注意的問題, 如果修飾成員方法. 那么就是靜態(tài)成員方法.其內(nèi)部不可以訪問非靜態(tài)(成員變量.成員常量.成員方法) 因?yàn)轭惒恍枰獎(jiǎng)?chuàng)建對(duì)象.就可以存在了.而你訪問非靜態(tài)的時(shí)候.并沒有.因?yàn)闆]有創(chuàng)建對(duì)象.
public class Anmail {public Anmail() {this("11111111");System.out.println("無參數(shù)構(gòu)造方法");}public Anmail(String s) {System.out.println("輸入的字符串 = " +s);System.out.println("有參數(shù)構(gòu)造方法");}public static final int PI = 3; //靜態(tài)常量public static int value1; //靜態(tài)成員變量 public static void run() {System.out.println("跑");}public int hand;public void eat() {System.out.println("父類吃");} }定義了靜態(tài)常量(注意,定義的時(shí)候要進(jìn)行初始化) 靜態(tài)成員變量. 靜態(tài)方法.
使用:
當(dāng)我們直接? 類名.的時(shí)候.會(huì)出現(xiàn)靜態(tài)可以調(diào)用的值. 比如PI value 以及run方法.
靜態(tài)方法不能使用 this 以及 非靜態(tài)成員變量 方法 常量
我們調(diào)用eat方法. 而eat并不是靜態(tài)成員方法. 所以標(biāo)紅了.代表出錯(cuò)了.eclipse還會(huì)提示你修改成靜態(tài)修飾才可以調(diào)用.
在靜態(tài)方法中還不能使用 靜態(tài)關(guān)鍵字進(jìn)行定義局部變量
靜態(tài)代碼塊的編寫
static {System.out.println("靜態(tài)代碼塊執(zhí)行了");}?
當(dāng)我們刁穎run方法.他都會(huì)先執(zhí)行靜態(tài)代碼塊進(jìn)行初始化
2.主方法入口點(diǎn)
? 可能有人發(fā)現(xiàn)了. 我們的main方法就是static修飾的.
如果是static修飾的那么就需要注意了
1.主方法調(diào)用的其他成員方法必須是靜態(tài)的.
2.主方法沒有返回值
3.主方法的參數(shù)是一個(gè)數(shù)組.可以使用數(shù)組.length來獲取大小.
三丶對(duì)象的創(chuàng)建
1.對(duì)象的創(chuàng)建
上面我們講了類. 類就是用來描述的.我們真正有用的是對(duì)象. 那么對(duì)象怎么生成那
類名 變量名 = new 類名(); 后面括號(hào)里面可以填寫內(nèi)容 里面可以填寫參數(shù).填寫的參數(shù)就是指定調(diào)用類中的有參構(gòu)造方法.
Anmail A = new Anmail("1111"); new Anmail創(chuàng)建的對(duì)象.使用A來代替. A.eat(); ,直接使用A來訪問了.執(zhí)行結(jié)果
?
?首先靜態(tài)代碼塊先執(zhí)行. 而后我們創(chuàng)建對(duì)象的時(shí)候使用的有參構(gòu)造所以有參構(gòu)造中首先輸出我們輸入的字符串.然后在輸出有參構(gòu)造方法. 最后我們調(diào)用了eat方法.就執(zhí)行了這個(gè)對(duì)象的行為.
需要注意的問題:? 我們可以創(chuàng)建多個(gè)對(duì)象. A B C. 但是他們?nèi)齻€(gè)的內(nèi)存是相互獨(dú)立的.互不影響. B成員變量的修改.不會(huì)影響到 A C. 如果有靜態(tài)修飾的成員變量. 或者常量. 那么他們?nèi)齻€(gè)是共享了.
?
上面我們使用的對(duì)象進(jìn)行訪問成員方法. 那么我們也可以訪問成員變量. 成員變量如果是 public修飾. 那么可以直接 對(duì)象.成員變量 進(jìn)行訪問. 如果是Private 那么我們就要專門提供Set Get 方法來對(duì)成員變量進(jìn)行訪問.
也就是說提供了接口. 這樣使我們的程序安全性大大增加.
2.對(duì)象的引用
上面我們說了創(chuàng)建對(duì)象如何創(chuàng)建? 類名 對(duì)象名 = new 類名();
那么引用是什么?
引用就是上面所說的對(duì)象名? 我們可以直接定義對(duì)象.然后在new? 類名 引用名稱;? 引用名稱 = new....
那么引用有什么意思那??
引用可以看成是一個(gè)變量. new 類名() 其實(shí)是在內(nèi)存中的堆空間申請(qǐng)了內(nèi)存. 這塊內(nèi)存的首地址給 對(duì)象名(引用)來保存. 那么我們直接就可以通過引用名來訪問
對(duì)象名.xxxx
當(dāng)然我們也可以不給名字.那么沒人保存內(nèi)存的地址.就成了無名對(duì)象.只能使用一次了.
new 類名(). 成員變量 = 10;? ?
new 類名().成員方法();;??
3.引用的比較(對(duì)象的比較)
上面我們簡(jiǎn)單的說了一下. 對(duì)象其實(shí)就是保存了內(nèi)存的地址. 這塊地址中有我們的成員變量等各種屬性. 那么我們兩個(gè)對(duì)象可以用來比較.
==比較. 如果==比較就是內(nèi)存地址跟內(nèi)存地址進(jìn)行比較了. 因?yàn)閮蓚€(gè)對(duì)象的內(nèi)存地址肯定起始位置不同.進(jìn)而地址比較就會(huì)不同.
而我們程序中.會(huì)默認(rèn)繼承一個(gè)父類.也就是object類.會(huì)繼承他的成員方法. equals. 就是進(jìn)行比較的.我們可以重寫這個(gè)方法.表示如果調(diào)用了這個(gè)方法.是比較什么.
我們首先使用String類創(chuàng)建的對(duì)象做演示
public static void main(String[] args) {// TODO 自動(dòng)生成的方法存根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" );}}運(yùn)行結(jié)果:
我們使用== 比較的是地址.地址肯定不會(huì)相同.所以就不打印. 而是用equals. equals是String內(nèi)部重寫的.他比較的是字符串. 如果字符串相同就是相同了.
4.垃圾回收機(jī)制
在C++中.創(chuàng)建對(duì)象使用 new 銷毀對(duì)象使用delete 所以有的構(gòu)造跟析構(gòu)函數(shù). 但是Java中有垃圾回收機(jī)制.所以自然而言就不需要析構(gòu)函數(shù)了.只需要構(gòu)造函數(shù)即可.
垃圾回收機(jī)制就是我們不用管內(nèi)存的釋放.他會(huì)自己釋放這塊內(nèi)存.但是自動(dòng)是由前提的.必須觸發(fā)兩個(gè)條件
1.對(duì)象超過其作用域? 也就是說我們?cè)谝粋€(gè)塊語句中生成的對(duì)象.超過作用域就會(huì)進(jìn)行銷毀
2.對(duì)象指向地址為NULL .我們知道對(duì)象是內(nèi)存地址的別稱. 如果不指向任何內(nèi)存地址.那么說明我們申請(qǐng)的哪塊地址沒人指向了也就沒人使用了.Java會(huì)把哪塊內(nèi)存給我們釋放.
Java中強(qiáng)制進(jìn)行垃圾回收可以使用System.gc()方法.?
四丶面相對(duì)象總結(jié)
?通過本博客可以學(xué)習(xí)到
1.什么是對(duì)象
對(duì)象就是基于類生成的一個(gè)實(shí)體.
2.什么是類
類就是描述行為跟屬性的一個(gè)模版
3.什么是多態(tài)
父類可以指向子類.調(diào)用子類跟父類共有的方法
4.什么是權(quán)限修飾符以及作用
public private protected 分別是公共 私有 保護(hù). 進(jìn)行修飾的成員變量則 子類會(huì)有不同的繼承狀態(tài).
private修飾:? 子類繼承父類.則不能繼承,且外部不可以調(diào)用這個(gè)成員方法
public修飾: 子類可以繼承父類所有的public修飾的成員(變量/方法) 外部可以直接使用
protected: 子類繼承父類. 只能是繼承關(guān)系才可以繼承.子類繼承父類. 其他類不能繼承父類.沒有關(guān)系.
5.怎么寫一個(gè)類模版
使用關(guān)鍵字 class 即可寫一個(gè)
權(quán)限修飾符 class 類名{權(quán)限修飾符 類型 成員變量權(quán)限修飾符 返回值 方法名(參數(shù)) {} }
?
6.類中的成員變量 成員 方法. 有參數(shù)無參數(shù)構(gòu)造
成員變量的定義:
權(quán)限修飾符 類型 變量名;
成員方法的定義
權(quán)限修飾符 返回值 方法名(參數(shù)){}
構(gòu)造方法:
權(quán)限修飾符 類名(參數(shù))// 有參構(gòu)造
權(quán)限修飾符 類名()'; // 無參構(gòu)造
?
7.this關(guān)鍵字的作用
1.可以區(qū)分成員變另以及局部變量 this.name = name;
2.可以在構(gòu)造中調(diào)用其他構(gòu)造 this()調(diào)用空構(gòu)造? this("123"); 調(diào)用有參數(shù)構(gòu)造
8.static關(guān)鍵字在類中的作用
靜態(tài)常量:
權(quán)限修飾符 static final 類型 變量名 = 值;
權(quán)限修飾符 final static 類型 變量名 = 值; //兩者都可以
靜態(tài)成員變量
權(quán)限修飾符 static 類型 變量名;
靜態(tài)成員方法
權(quán)限修飾符 static 返回值 方法名 (參數(shù)){}
靜態(tài)代碼塊:
static{....}
需要了解的知識(shí)點(diǎn):
1.靜態(tài)常量定義的時(shí)候需要進(jìn)行賦值
2.靜態(tài)方法不能調(diào)用非靜態(tài)方法.不能使用this關(guān)鍵
3.靜態(tài)代碼塊只會(huì)執(zhí)行一次.且會(huì)第一次執(zhí)行.常用與進(jìn)行初始化
9.對(duì)象的引用,比較.以及無名對(duì)象
1.對(duì)象的引用就是一個(gè)對(duì)象名. 對(duì)象名存儲(chǔ)著new出來的堆內(nèi)存.
2.無名對(duì)象就是不需要對(duì)象名去保存首地址了.只需要調(diào)用一次.
3.對(duì)象直接的地址比較可以使用== 如果比較對(duì)象中某一成員的值.可以使用 equals.你自己重寫equals即可.比較什么你自己寫.
String類是比較字符串. 你可以重寫.比如比較你類中的某一個(gè)值
?
轉(zhuǎn)載于:https://www.cnblogs.com/iBinary/p/9758443.html
總結(jié)
以上是生活随笔為你收集整理的Java开发知识之Java面相对象的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [No000017F]如何监控注册表的修
- 下一篇: api权限管理系统与前后端分离实践