面向?qū)ο蟮膬?yōu)點(diǎn)是:不造重復(fù)的輪子,也就是說不干重復(fù)的活。

創(chuàng)新互聯(lián)公司專注于鳳翔企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,成都做商城網(wǎng)站。鳳翔網(wǎng)站建設(shè)公司,為鳳翔等地區(qū)提供建站服務(wù)。全流程按需搭建網(wǎng)站,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)
java中把具有相同共性的一類事物抽象為一個(gè)類,而對象是這個(gè)類的其中一個(gè)實(shí)體。
例如:人是一個(gè)類(有共同的屬性,有頭發(fā)、眼睛、鼻子.....),張三、李四、王五是三個(gè)實(shí)體對象,而每個(gè)對象的屬性又是不同的,例如張三是黑頭發(fā),李四是黃頭發(fā)、王五是紅頭發(fā)。
這樣復(fù)用性比較好。
一.面向?qū)ο螅?/p>
1.何謂對象:在面向?qū)ο蟪绦蛟O(shè)計(jì)中,我們將問題空間中的元素以及他們在方案空間中的的表示物稱作對象(object)
Alan Kay總結(jié)了smalltalk中對象的5大基本特征:
所有的東西都是對象。
程序是一大堆對象的集合,他們通過消息傳遞,各個(gè)對象之間知道要做些什么。
每個(gè)對象都分配有自己的存儲空間,可容納其他對象。
每個(gè)對象都有一個(gè)類型。
同一類的所有對象能接收相同的消息。
-----而所有的編程語言的最終目的是提供一種抽象方法----
2.對象的接口:我們向?qū)ο蟀l(fā)出請求是通過它的接口定義的,對象的類型決定了它的接口形式。
3.OOP中唯一關(guān)心的:就是接口是什么,就像汽車的發(fā)動機(jī)一樣,我們不必要知道它的結(jié)構(gòu)是什么,只要它能工作就行了。所有的程序是由一定的屬性(數(shù)據(jù))和行為(方法)組成的,不同的對象訪問通過函數(shù)調(diào)用來完成,對象間的所有交流都是通過方法調(diào)用,通過對封裝數(shù)據(jù)對象,很大程度上提高復(fù)用率。
4.對象的3個(gè)主要特征:
behavior—說明這個(gè)對象能做什么。
State—當(dāng)對象施加方法時(shí)對象的反映。
Identity---與其他相似行為對象的區(qū)分標(biāo)志,每一個(gè)對象有唯一的indentity, 而這3者是相互影響的。
5.面向?qū)ο笾凶钪匾乃枷刖褪穷悾愂悄0迨撬{(lán)圖,從類中構(gòu)造一個(gè)對象,即創(chuàng)建了一個(gè)類的實(shí)例。(類好比一個(gè)建材市場,其中有許多子類--各種各樣的裝飾材料,而我們裝修自己的房子就要選擇我們需要的材料,(為了建立我們自己的程序,我們必須選 擇我們需要的類)這個(gè)比喻可以很形象的解釋類是什么。
6.類之間的關(guān)系:
依賴關(guān)系:use-a A類中的一個(gè)方法操作了另一個(gè)類中的對象。
聚合關(guān)系:has-a A類中的對象包含B類的對象。
繼承關(guān)系:is-a A繼承了B類,此時(shí)A類不僅有了B類的方法,還加入了自己的方法。以便我們創(chuàng)建我們自己需要的對象。
Java中定義的每一個(gè)類都必須繼承另一個(gè)類,使用關(guān)鍵字extends,如果一個(gè)類在定義中不現(xiàn)實(shí)使用關(guān)鍵字extends,這個(gè)類就會隱式繼承Object類。Object類又叫根超類,或基類。,我們從根超類繼承來的叫子類。Java中每個(gè)類都是根超類的子類。
8.接口(interface)規(guī)定了可對特定的對象發(fā)出哪些請求。
9.繼承=重新使用接口:創(chuàng)建出一個(gè)數(shù)據(jù)類型后,當(dāng)需要新建立一個(gè)數(shù)據(jù)類型去實(shí)現(xiàn)相同的功能,是很沒有意義的一件事,此時(shí)對其克隆后,再根據(jù)情況改進(jìn)實(shí)現(xiàn)自己的目的就是繼承。
10.封裝:就是把數(shù)據(jù)和行為結(jié)合在一起在一個(gè)包中,并對對象使用者隱藏?cái)?shù)據(jù)的實(shí)現(xiàn)過程。Java用3個(gè)關(guān)鍵字來設(shè)置邊界,從而進(jìn)行對數(shù)據(jù)的隱藏。Public(共有)的定義任何人都可使用.private(私有)意味著除你自己,類型創(chuàng)建者及那個(gè)類型的內(nèi)部函數(shù)成員可以訪問外其他任何人使用都會產(chǎn)生錯(cuò)誤。Friendly(友好)
意味在包(package)中是可以訪問的。(以上過程也可叫方案隱藏)
11.引用(Handle)操控對象:
當(dāng)創(chuàng)建一個(gè)引用時(shí)必須要對其進(jìn)行初始化
例: String s=”happy”(未建立連接)
String s=new string(“happy”)與一個(gè)新的對象連接使用new 。此句建立了一個(gè)引用,并且連接引用并初始化對象 賦值字符串“happy”.
12.對象的創(chuàng)建及存在時(shí)間:數(shù)據(jù)存放的地點(diǎn)
1:寄存器-速度快,數(shù)量少,在cpu內(nèi)部,我們對寄存器沒有控制權(quán)。
2:堆棧:駐留長規(guī)內(nèi)存中,堆棧指針下移建立新的內(nèi)存,上移釋放內(nèi)存。
3:堆:常用內(nèi)存池,保存對象,有極大的靈活性,java的數(shù)據(jù)就存放在此,但是要以時(shí)間及效率為代價(jià)。Java的對象建立是在程序運(yùn)行時(shí)才決定。而c++是在設(shè)計(jì)時(shí)建立對象。
對象的生存時(shí)間(lifetime)java提出的垃圾收集器可以很好的發(fā)現(xiàn)無須再用的對象,使用GC(grabage collector)垃圾收集器。清除對象,釋放內(nèi)存。
為此我們就要付出一定的運(yùn)行期的開銷。
13.在此我們就會有這樣一個(gè)印象,一個(gè)程序只是一系列對象的集合,他們的方法將其他對象作為自己的變量使用.
14.主要類型: java的主要類型有:boolean,char,byte,short,int,long,float,double,void.這些主類型的大小都不隨機(jī)器的結(jié)構(gòu)變化而變化,提供了java很好的可移植性.
15.字段方法:字段又叫數(shù)據(jù)成員,成員函數(shù)又叫方法,java的全部工作就是定義類,制作累得對象及發(fā)送消息.
16.一個(gè)程序只是一系列對象的集合,他們的方法將其他的對象作為自己的變量使用,而且將消息發(fā)給那些對象.
17.名字的可見性:為了使名字不重復(fù),作者可以定義自己的庫,一般用自己域名的倒寫形式 如: COM.:Leeak.utility.foidles
18.static關(guān)鍵字:即使沒有創(chuàng)建對象,也需要一愕能調(diào)用的方法,此時(shí)可以使用static
19.java.lang默認(rèn)自動的導(dǎo)入每個(gè)java程序中
20.OOP中對象使對屬性和方法的封裝,對象具有信息的隱蔽的性質(zhì),對細(xì)節(jié)的隱藏,對象只需要知道去這樣做,而不知道如何做的細(xì)節(jié),類的方法應(yīng)謹(jǐn)慎控制對java數(shù)據(jù)的訪問,可以用get讀取方法,用set修改方法.
21:pakage:Java API中每個(gè)類和接口屬于一個(gè)特定的包,包實(shí)際上市對類和接口進(jìn)行組織的目錄結(jié)構(gòu),提供了一種軟件復(fù)用機(jī)制.
22.創(chuàng)建可復(fù)用的類得步驟:1.定義一個(gè)public類
2.選擇一個(gè)包名,并把pakage語句加到可復(fù)用的類的源碼中.
3.編譯這個(gè)類.
4.把可復(fù)用的類導(dǎo)入其他程序中即可.
23.java中提出在類定義的括號外的僅有2個(gè)語句,pakage和import.
24.軟件的復(fù)用性,軟件的復(fù)用性就是利用紫的已有的,定義良好的的經(jīng)過仔細(xì)測試的文檔清晰的可移植的易于獲得的軟件構(gòu)件開發(fā)新的軟件.
以上就是java面向?qū)ο蟮囊恍┗拘g(shù)語的概述,其中的有些部分可以擴(kuò)展的更深,看過think in java的 朋友就會有此種感覺.此文章向?qū)Τ鯇W(xué)者闡述了面向?qū)ο蟮幕靖拍?對已是java程序員的朋友可以對他們的基本知識做以回顧.
代碼如下:
class?Person?{
protected?String?name;
protected?int?age;
protected?String?address;
public?Person(String?name,?int?age,?String?address)?{
this.name?=?name;
this.age?=?age;
this.address?=?address;
}
public?void?sayHi()?{
System.out.println(this.name?+?","?+?this.age?+?","?+?this.address);
}
}
class?Student?extends?Person?{
private?String?stuId;
public?Student(String?stuId,?String?name,?int?age,?String?address)?{
super(name,?age,?address);
this.stuId?=?stuId;
}
public?void?sayHi()?{
System.out.println(this.stuId?+?","?+?this.name?+?","?+?this.age?+?","?+?this.address);
}
}
class?Teacher?extends?Person?{
private?float?salary;
public?Teacher(String?name,?int?age,?String?address,?float?salary)?{
super(name,?age,?address);
this.salary?=?salary;
}
public?void?sayHi()?{
System.out.println(this.name?+?","?+?this.age?+?","?+?this.address?+?","?+?this.salary);
}
}
class?Doctor?extends?Person?{
private?String?level;
public?Doctor(String?name,?int?age,?String?address,?String?level)?{
super(name,?age,?address);
this.level?=?level;
}
public?void?sayHi()?{
System.out.println(this.name?+?","?+?this.age?+?","?+?this.address?+?","?+?this.level);
}
}
public?class?Test?{
public?static?void?main(String[]?args)?{
Student[]?students?=?new?Student[2];
students[0]?=?new?Student("201803010001",?"小明",?20,?"廣東深圳");
students[1]?=?new?Student("201803010002",?"小王",?22,?"上海");
for(Student?student?:?students)?{
student.sayHi();
}
Teacher[]?teachers?=?new?Teacher[2];
teachers[0]?=?new?Teacher("張三",?30,?"廣東廣州",?5000);
teachers[1]?=?new?Teacher("李四",?35,?"廣東廣州",?6000);
for(Teacher?teacher?:?teachers)?{
teacher.sayHi();
}
Doctor[]?doctors?=?new?Doctor[2];
doctors[0]?=?new?Doctor("張三",?30,?"北京",?"主治醫(yī)師");
doctors[1]?=?new?Doctor("李四",?35,?"上海",?"主任醫(yī)師");
for(Doctor?doctor?:?doctors)?{
doctor.sayHi();
}
}
}
第一次寫插入排序的,寫得有點(diǎn)亂,但是加了注釋后應(yīng)該是比較容易理解的:
public class InsertSort {
public static void main(String[] args){
int[] nums={15, 5, 56, 8, 2};
sort(nums,0);
}
public static int[] sort(int[] nums,int start){
//定義新的數(shù)組,用來存儲每一次排序后的結(jié)果
int[] result=new int[nums.length];
//如果開始的下標(biāo)大于0,則先把之前已排序好的元素拷貝進(jìn)來
if(start0){
for(int i=0;istart;i++){
result[i]=nums[i];
}
}
int tag=start;//定義用來存儲該次最小元素的下標(biāo)
int min=nums;
//從當(dāng)前下標(biāo)開始,查找數(shù)組中的最小元素,并更新下標(biāo)
for(int i=start;inums.length;i++){
for(int j=i+1;jnums.length;j++){
if(minnums[j]){
min=nums[j];
tag=j;
}
}
}
//將該次排序后最小的元素存儲在開始下標(biāo)處的位置
result=min;
for(int i=start;itag;i++){
result[i+1]=nums[i];
}
//將從當(dāng)前開始下標(biāo)處到最后的所有元素原樣保存到新數(shù)組
for(int i=tag+1;inums.length;i++){
result[i]=nums[i];
}
//-----------遍歷每一次排序后的數(shù)組----------
String split="";
for(int i=0;iresult.length;i++){
System.out.print(split+result[i]);
split=",";
}
System.out.println();
//---------遍歷結(jié)束------------
//將這一次開始的下標(biāo)自加,作為下一個(gè)排序要開始的下標(biāo)
start++;
//如果當(dāng)前開始的下標(biāo)已經(jīng)達(dá)到最大值,則返回結(jié)果數(shù)組,否則將該次排序后的數(shù)組遞歸排序
if(start==nums.length-1){
return result;
}else{
return sort(result,start);
}
}
}
順便說一下,一樓的,你寫的不是插入法排序的啊,而且你也沒有輸出每一次的排序結(jié)果。
優(yōu)點(diǎn)
1、抽象:抽象就是忽略一個(gè)主題中與當(dāng)前目標(biāo)無關(guān)的那些方面,以便更充分地注意與當(dāng)前目標(biāo)有關(guān)的方面。抽象并不打算了解全部問題,而只是選擇其中的一部分,暫時(shí)不用部分細(xì)節(jié)。抽象包括兩個(gè)方面,一是過程抽象,二是數(shù)據(jù)抽象。
2、繼承:繼承是一種聯(lián)結(jié)類的層次模型,并且允許和鼓勵類的重用,它提供了一種明確表述共性的方法。對象的一個(gè)新類可以從現(xiàn)有的類中派生,這個(gè)過程稱為類繼承。新類繼承了原始類的特性,新類稱為原始類的派生類(子類),而原始類稱為新類的基類(父類)。派生類可以從它的基類那里繼承方法和實(shí)例變量,并且類可以修改或增加新的方法使之更適合特殊的需要。
3、封裝:封裝是把過程和數(shù)據(jù)包圍起來,對數(shù)據(jù)的訪問只能通過已定義的界面。面向?qū)ο笥?jì)算始于這個(gè)基本概念,即現(xiàn)實(shí)世界可以被描繪成一系列完全自治、封裝的對象,這些對象通過一個(gè)受保護(hù)的接口訪問其他對象。
4、多態(tài):多態(tài)性是指允許不同類的對象對同一消息作出響應(yīng)。多態(tài)性包括參數(shù)化多態(tài)性和包含多態(tài)性。多態(tài)性語言具有靈活、抽象、行為共享、代碼共享的優(yōu)勢,很好的解決了應(yīng)用程序函數(shù)同名問題。
缺點(diǎn)
1、過度封裝:使用OOP時(shí),會把一些復(fù)雜的問題分拆抽象成較簡單的獨(dú)立對象,通過對象的互相調(diào)用去實(shí)現(xiàn)方案。但是,由于對象包含自己封裝的數(shù)據(jù),一個(gè)問題的數(shù)據(jù)集會被分散在不同的內(nèi)存區(qū)域。互相調(diào)用時(shí)很可能會出現(xiàn)數(shù)據(jù)的cache miss的情況。
2、多態(tài):在C++的一般的多態(tài)實(shí)現(xiàn)中,會使用到虛函數(shù)表。虛函數(shù)表是通過加入一次間接層來實(shí)現(xiàn)動態(tài)派送。但在調(diào)用的時(shí)候需要讀取虛函數(shù)表,增加cache miss的可能性。基本上要支持動態(tài)派送,無論用虛函數(shù)表、函數(shù)指針都會形成這個(gè)問題,但如果類的數(shù)目極多,把函數(shù)指針如果和數(shù)據(jù)放在一起有時(shí)候可放緩問題。
java 開發(fā)是近幾年流行的比較熱門的編程語言,但是很多從事java語言的技術(shù)員,及java編程愛好者,都只是了解java 優(yōu)勢,很少人知道java的劣勢,今天就聽西安java專業(yè)培訓(xùn)老師給大家講述,java 的優(yōu)點(diǎn)和風(fēng)險(xiǎn)。
一、好處并發(fā)編程之所以讓人迷惑是因?yàn)橛胁恢挂环N問題的解決需要使用并發(fā),也有不止一種方法去實(shí)現(xiàn)并發(fā),而且他們之間也沒有清晰的映射。
使用并發(fā)編程來解決的問題可以劃分為兩類,即“speed”和“designmanageability”。
1、速度優(yōu)勢:
多處理器:多處理器上面并發(fā)變成無疑會讓程序運(yùn)行很快。
單處理器:如果是單處理器的機(jī)器,那么并發(fā)編程可能相對于順序編程沒有什么變化。但是,如果其中某一個(gè)任務(wù)也許會發(fā)生阻塞的話,那么即使是單處理器,使用并發(fā)編程也會帶來很大的好處,這樣,某個(gè)任務(wù)阻塞的時(shí)候,其他任務(wù)也可以繼續(xù)運(yùn)行了。
反應(yīng)靈敏的用戶界面:在單處理器上面性能提升典型的列子就是“事件驅(qū)動的編程”,比如創(chuàng)建一個(gè)有反應(yīng)的用戶界面,其中有個(gè)按鈕,如果我們不使用并發(fā)編程,那么我們需要在我們編寫的每一個(gè)代碼片段中都要有對用戶輸入的檢測,如果我們使用并發(fā)編程,我們只需要重新開啟一個(gè)線程去用戶的輸入即可。
并發(fā)的實(shí)現(xiàn):實(shí)現(xiàn)并發(fā)的直接的方式是在操作系統(tǒng)級別,使用進(jìn)程,進(jìn)程一種自包含的程序,使用自己的地址空間,操作系統(tǒng)會讓進(jìn)程之間相互隔離,所以進(jìn)程編程相對容易一些,不需要考慮共享資源的同步等問題。但是在Java中的并發(fā)編程,由于線程之間共享相同的memory或者IO等資源,所以Java多線程編程中需要考慮共享資源的同步問題。
進(jìn)程和Java線程之間的選擇:進(jìn)程的確是一種實(shí)現(xiàn)并發(fā)的方式,butunfortunately there are generally quantity and overhead limitations toprocesses that prevent their applicability across the concurrency spectrum.
2、設(shè)計(jì)上的優(yōu)勢:
一般來說,線程使得你能夠創(chuàng)建更加松耦合的設(shè)計(jì)。
單處理器:盡管單處理器上面的并發(fā)編程在同一時(shí)刻處理器仍然只能做一件事情,但是帶來一個(gè)組織上面的重要優(yōu)勢:就是你的設(shè)計(jì)(design)會極大地簡化。比如。
二、風(fēng)險(xiǎn)1、安全性問題
主要是多個(gè)線程共享數(shù)據(jù)時(shí)可能會產(chǎn)生于期望不相符的結(jié)果
2、活躍性問題(liveness)
當(dāng)某個(gè)操作無法繼續(xù)進(jìn)行下去時(shí),就會發(fā)生活躍性問題。比如死鎖、饑餓、活鎖等問題。
3 性能問題
a.線程過多時(shí)會使得CPU頻繁切換,花在調(diào)度上時(shí)間太多。
b.多線程環(huán)境必須使用同步機(jī)制,導(dǎo)致很多編譯器想做的優(yōu)化被抑制。
任何東西都有自己的優(yōu)點(diǎn)和劣勢,所以我們在學(xué)習(xí)的時(shí)候就要有針對的,理解性的學(xué)習(xí),才能學(xué)的更深入,更透徹,更多專業(yè)知識,歡迎咨詢:西安java專業(yè)培訓(xùn)老師,免費(fèi)為您詳解。
請聯(lián)系網(wǎng)站客服,了解詳細(xì)的優(yōu)惠課程信息~
優(yōu)質(zhì)、便捷、省心
網(wǎng)頁題目:java面對對象代碼優(yōu)化,java代碼優(yōu)化的方法
網(wǎng)址分享:http://www.chinadenli.net/article26/heopcg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)、自適應(yīng)網(wǎng)站、全網(wǎng)營銷推廣、網(wǎng)站策劃、營銷型網(wǎng)站建設(shè)、企業(yè)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)