[英]JAVA - Abstraction
我對Java中的抽象感到困惑。
我檢查了許多頁面,指出抽象是數據隱藏(隱藏實現)。
我對抽象的理解是“部分實現”。 只需在抽象類/接口中定義所需的內容,然后擴展/實現它們並添加您自己的功能即可。
我不明白這是如何隱藏數據的? 實現類/接口后,您將可以訪問代碼,並將根據需要對其進行修改。
我已經檢查了很多問題,關於此的文章,但對此仍然感到困惑。
任何幫助表示贊賞。 謝謝。
您正在將抽象 (編程模式)與Java語言的abstract關鍵字混淆。 盡管有相似之處,但它們在語義上只是很不相關。
抽象意味着您從使用類或方法的代碼中隱藏實現細節。 使用您的方法的代碼不需要知道您正在使用數組或動態指針或文件系統中的嵌入式數據庫或文件來實現列表。
abstract用於標記具有僅聲明且未實現的方法的類。 在無法實例化它們的意義上,這是“抽象的”,您不能從這些類中創建任何實例(但是可以從其具體子類中創建它們)。
也許有一個例子可以幫助您更好。 假設您要實現一個Graph類,它可能具有鄰接表或鄰接矩陣來表示其節點。 因此,抽象地,您至少要對該圖“ addNode”“ addEdge”:
public abstract class Graph
{
public abstract int addNode();
public abstract void addEdge(int from, int to);
}
現在您可以擴展兩個類:
public class GraphAdjList extends Graph
{
private Map<Integer,ArrayList<Integer>> adjListsMap;
public int addNode()
{
//list based implementation
}
public void addEdge(int from, int to)
{
//list based implementation
}
}
public class GraphAdjMatrix extends Graph
{
private int[][] adjMatrix;
public int addNode()
{
//matrix based implementation
}
public void addEdge(int from, int to)
{
//matrix based implementation
}
}
當您從這兩個類中調用addEdge中的任何一個時,您不必擔心其背后的數據結構,您只知道可以得到所需的結果,例如:
Graph g1,g2;
g1 = new GraphAdjList();
g2 = new GraphAdjMatrix();
g1.addEdge(1,2);
g2.addEdge(1,2);
通過多態,您調用了兩個不同的函數,但得到的結果與Graph的客戶端相同。
現實生活中的另一個例子是汽車制動器。 作為汽車客戶,制造商會在不知道后端制動器的實現方式的情況下為您提供踩踏板的機會。 背面可以是鼓式制動器或盤式制動器。 您只需要踩剎車!
數據隱藏是指您在不閱讀文檔的情況下無法了解如何在內部使用API(例如ArrayList
)的情況。 API創建者不提供對位於其下的數組的任何訪問。
您將向使用它的用戶隱藏API實現。 他們不必擔心它在內部如何工作,只對提供給他們的功能感興趣。
有一篇很好的文章 。
我不確定這是否能回答您的問題,但是如果您一般來說是在談論抽象類,那么它們是在為子類提供功能來擴展子類,而子類不必知道或處理抽象類的所有細節。實現(對子類的用戶隱藏)。
讓我們以汽車為例:
public abstract class Vehicle {
protected int _numberOfWheels;
public Vehicle() {
this._numberOfWheels = 4;
}
}
public class Truck extends Vehicle {
public int carryingLoad;
public Truck() {
this.carryingLoad = 4000; // kg or something
}
}
因此,車輛是車輛對象的抽象實例,並且已經具有與之關聯的某些功能,例如車輪數。 這是一種受保護的方法,因此,如果我創建了新的truck實例:
// Inside main
Truck truck = new Truck();
但是,如果要在以下類中為卡車編寫函數,則無法更改車輪數量:
// Inside the Truck class
public void addSpareTire() {
this._numberOfWheels++;
}
這樣我可以這樣稱呼:
// Inside main
truck.addSpareTire();
我仍然可以與某些變量進行交互,但是只能通過擴展抽象類的類中的功能進行。 我可以通過調用addSpareTire()
一次添加一個輪胎,但是我永遠無法在使用 Truck
對象的主函數中直接與_numberOfWheels
進行交互,但是我可以在Truck
類聲明中進行交互。 對於卡車對象的用戶 ,該信息是隱藏的 。
我不知道這是否是您要的。 希望這可以幫助。
在面向對象的程序設計中, 抽象是向用戶隱藏實現細節的過程 ,僅將功能提供給用戶。 換句話說,用戶將獲得有關對象做什么而不是對象如何做的信息。
請查看以下鏈接以獲取更多詳細信息: http : //www.visionsdeveloper.com/tutorial/java/java-abstraction.jsp
實現類/接口后,您將可以訪問代碼,並將根據需要對其進行修改。
我猜您對語言給您的概念像“ Abstraction
感到困惑。 您始終可以訪問自己的代碼,但是諸如Abstraction
或多Polymorphism
類的東西為您提供了必須的理想方式。 因此,在Abstraction
您只是說我知道會有一種行為以someThing
作為抽象方法,但是現在您不知道它的行為,實現者將告訴我們它的行為。 請參閱以下代碼。
abstract class Game{
public abstract void play();
}
class Football extends Game{
@Override
public abstract void play(){
// write how football play
}
}
class Cricket extends Game{
@Override
public abstract void play(){
// write how Cricket play
}
}
我在這里給你一個問題。
Why you are making class level attributes public/protected/private although you have access to the code when you implement?
我認為您對兩件事感到困惑
Java中的抽象類
摘要:有一個稱為摘要的OOP概念。 在這里,用戶可以捕獲對象的必要特征。 這個抽象概念在Java中實現為類和對象。 因此,當您以類的形式捕獲對象的重要特征時,就會遇到問題,即數據隱藏,這些特征只能由其自己的類的對象訪問。 在這里,您正在從類/世界之外隱藏類的所有功能。 因此,這稱為數據隱藏
抽象類:這是Java實現的功能。 如果您不知道完整的實現,則可以選擇Java的抽象類。
希望這可以幫助您了解一些
謝謝
它不是向您隱藏信息,而是向您的抽象客戶端隱藏信息。 看一下這個例子。
public class Demo {
Client client = new Client(new Implementation());
}
public interface Abtraction {
void doWork();
}
public class Implementation implements Abtraction{
@Override
public void doWork() {
//doingTheWork
}
}
public class Client{
private Abtraction theAbstraction;
public Client(Abstraction theAbstraction){
this.theAbstraction = theAbstraction;
}
}
Client
類不了解Abstraction
的實現,這意味着Demo
類可以提供不同的Abstraction
實現,而不會弄亂Client
。
數據隱藏基本上是隱藏有關某個類的內部數據成員的詳細信息,並且僅排他地給予有關的類訪問它的權限。
因此,它避免了來自應用程序中其他類或任何其他應用程序的不必要的滲透,這意味着其他類無法直接訪問私有成員變量。
這樣,您就可以抽象出相關類的內部細節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.