在閱讀不同來源的封裝和抽象的定義時,我越來越困惑。真正難以確定哪個是正確的定義。OOP抽象vs封裝多個定義
封裝定義1
封裝:封裝是在 使場的技術領域經由公共方法
封裝定義2
類私有和提供封裝是將數據和功能 掩蓋起來的過程le單位(稱爲班級)。
抽象定義1
抽象造型是用最少的 信息的現實世界對象的一種方式。
抽象定義2
只露出所必需的方法。
請幫助我理解這些詞的正確定義與OOP有關的意思。解釋正確定義的書的來源也是優選的。
在閱讀不同來源的封裝和抽象的定義時,我越來越困惑。真正難以確定哪個是正確的定義。OOP抽象vs封裝多個定義
封裝定義1
封裝:封裝是在 使場的技術領域經由公共方法
封裝定義2
類私有和提供封裝是將數據和功能 掩蓋起來的過程le單位(稱爲班級)。
抽象定義1
抽象造型是用最少的 信息的現實世界對象的一種方式。
抽象定義2
只露出所必需的方法。
請幫助我理解這些詞的正確定義與OOP有關的意思。解釋正確定義的書的來源也是優選的。
談論代碼,抽象只是一段描述真實世界「事物」的代碼。大多數時候你無法描述整個「事物」,但是你可以描述它的主要特徵,在你的代碼中,它將被稱爲屬性。
抽象的一個例子是餐廳:你去,你要求的菜單,並選擇你想吃什麼......但你不吃紙:你選擇你想要看什麼它的抽象(菜單)......抽象可能只是說「雞蛋&培根」,但是當服務員拿到你的訂單時,它有一對雞蛋(炒蛋),兩片脆皮培根和其他東西。菜單只是真實的簡單抽象事物。
採取Bicycle example in the Java Tutorials:這輛自行車屬性:
你在的任何其他特性不感興趣(在這個例子中)自行車......所以這是一個抽象。
現在,關於封裝:在編寫代碼時,你希望你的對象的屬性只在「propper」的方式修改:如果你改變的速度(同樣的自行車例子),你可能也必須改變節奏和/或換檔。所以,你聲明的屬性private
只有通過public
方法進行更新,並且,在這些方法中,可以確保所有的屬性具有連貫值:
public class Bicycle {
private int speed, gear, cadence;
/**
* Default constructor
*/
public Bicycle() {
speed = 0;
gear = 1;
cadence = 0;
}
/**
* An example
*/
public void setSpeed(int speed) {
this.speed = speed;
/*
You can set the value of the other attributes here if you want to
*/
}
/**
* Another example
*/
public void gearUp() {
if(gear < 5)
gear++;
/*
Here you are preventing other methods to set the gear to
a value higher than 5.
*/
}
/**
* Another one
*/
public void gearDown() {
if(gear > 1)
gear--;
/*
Here you are preventing other methods to set the gear to
a value lower than 1.
*/
}
}
就拿下面的兩段代碼:
// Snippet #1
public static void Main(){
int sum = 0;
for (int i = 0; i <= 1000; i++) {
sum += i;
}
System.out.println(sum);
}
在上面的代碼片段,你的程序計算從0所有整數多達1000你可以看到計算是如何做的總和,你有超過存儲和的值的變量控制。
// Snippet #2
public class Adder {
private int sum;
public Counter(){
this.sum = 0;
}
public void add(int value){
this.sum += value;
}
public int getSum(){
this.sum;
}
}
public static void Main(){
Adder adder = new Adder();
for (int i = 0; int <= 1000; i++) {
adder.add(i);
}
System.out.println(adder.getSum());
}
上面的代碼片段執行相同的任務,但不同。有一堂課提供了你所質疑的兩個特點。它提供是一個抽象到系統添加數字,也封裝的的計算是如何做的詳細信息。換句話說,它將添加數字的問題以及它從迭代0到1000的數字(在Main函數中)的工作方式分開。
在這個例子中:
的抽象是將數字的概念,所以你將有一個不同的抽象針對每個不同類型的想法
encaptulation是實施細節與主要計劃的分離。也就是說,你可以創建同一類型的抽象類新的,但使用不同的實現(一長而不是聯合國INT,例如)。
抽象
抽象沒有與製作方式的私人或公共的事情。它與識別哪種類型的功能對於某種類型是常見的有關。
在java中的抽象類需要一個步驟進一步比的接口。在接口中,類型X的類必須做X,Y,Z。無論如何,X,Y,Z都可以實現。
一個抽象類說,X型的類必須做X,Y,Z,但一個方法標記爲抽象必須做一個特定的方式,也就是它在抽象類(抽象)實現的真實。
封裝
它只是將一件或多件事包裝在另一件事情中。簡化或隱藏代碼。爲什麼你想要這樣做的一個例子是簡化流程。如果你希望用戶能夠關閉計算機,例如,你可以既可以有一堆方法的人來顯式調用:
Util.shutdownApps();
Util.shutdownServices();
Util.shutdownScreenAndKeyboard();
Util.poweroff();
如果你想關閉以特定方式或只是讓有人更容易關閉你可以封裝它:
Util
public void shutdown(){
Util.shutdownApps();
Util.shutdownServices();
Util.shutdownScreenAndKeyboard();
Util.poweroff();
}
private shutdownApps(){...}
private shutdownServices(){...}
private shutdownScreenAndKeyboard(){...}
private poweroff(){...}
關於Barranka的回答,任何一段代碼都可以描述真實世界的事物。有一個抽象類沒有意義,如果你只有一個*類型。有人肯定會說哦,但有一個接口會更好的可測試性。但是如果你有一個爲什麼要做額外的代碼?當你發現你需要不同類似的類型時,你可以重構。 – Savan 2015-03-02 18:59:43
沒有一個正確的定義。你給出的每個版本都講述了*封裝/抽象,但是並沒有權威地定義*它。 – 2015-03-02 18:28:13
[在java中如何封裝與抽象不同作爲面向對象的概念?](http://stackoverflow.com/questions/8960918/how-encapsulation-is-different-from-abstraction-as-a-object面向概念的) – Tachyon 2015-03-02 18:30:06
由於這些都是概念,所以沒有全球接受的具體定義。例如,大多數人會在上面的問題中查看封裝的兩個定義等同於...學習使用Google和維基百科...他們是你的朋友。 – RudolphEst 2015-03-02 18:32:00