Java 接口将如何隐藏实现细节

Java 接口将如何隐藏实现细节,java,interface,Java,Interface,也许这是一个新手的小问题。我经常听到有人说接口会隐藏实现细节。我无法理解具体的含义。我会告诉你我理解的内容。请告诉我我的理解是否有任何错误 让我们假设,在我们的代码中有这样声明的列表接口 List ls= new ArrayList() 通过改变上面的线像 ArrayList ls= new ArrayList(); 通过按住Ctrl键并单击IDE中的方法,我可以查看ArrayList的每个实现细节 若您将ls声明为类中的私有变量,并且仅将getter赋给该变量,则将返回接口的

也许这是一个新手的小问题。我经常听到有人说接口会隐藏实现细节。我无法理解具体的含义。我会告诉你我理解的内容。请告诉我我的理解是否有任何错误

让我们假设,在我们的代码中有这样声明的
列表
接口

    List ls= new ArrayList()
通过改变上面的线像

   ArrayList ls= new ArrayList();
通过按住Ctrl键并单击IDE中的方法,我可以查看
ArrayList
的每个实现细节

若您将
ls
声明为类中的私有变量,并且仅将
getter
赋给该变量,则将返回接口的引用。这样,您就不知道引用指向的是什么对象,这样您就可以隐藏实现细节

我想还有比这更重要的事情。请给我更清楚的解释


编辑:-我知道多态性是如何通过接口工作的。我的疑问是隐藏实现细节意味着从字面上隐藏,或者它意味着最终用户不需要担心它的实现细节。

实际上,没有,但是。。。 隐藏的好处是,可以在不破坏getter的情况下通过BetterList切换列表实现(ArrayList)。内部的BetterList可以有一些特性,这些特性不应该公开。 此外,BetterList可以实现多个接口(例如List和一些“ElevatedList”)。因此,您可以针对指向同一对象但不同接口的不同用例公开两个getter

例如:

public  class MyObject {
static class BetterList extends ArrayList<String>{
     void someInternalLogic(){
        //
    }
}
private BetterList internalList1=new BetterList();
public List<String> getList1(){
    internalList1.someInternalLogic();
    return internalList1;
}


private List internalList2=new ArrayList<String>();
public List<String> getList2(){
    return internalList2;
}
公共类MyObject{
静态类BetterList扩展了ArrayList{
void someInternalLogic(){
//
}
}
private BetterList internalList1=新BetterList();
公共列表getList1(){
internalList1.someInternalLogic();
返回列表1;
}
private List internalList2=new ArrayList();
公共列表getList2(){
返回列表2;
}
}


getList1 getter对列表接口后面的外部用户隐藏someInternalLogic方法,如果应该在内部控制该方法的执行,则该方法可能很有用。getList2 getter将ArrayList类型隐藏在List接口后面,这样就可以自由地将internalList2的实现更改为f.e.LinkedList,以后可能会首选它

实际上没有,但是。。。 隐藏的好处是,可以在不破坏getter的情况下通过BetterList切换列表实现(ArrayList)。内部的BetterList可以有一些特性,这些特性不应该公开。 此外,BetterList可以实现多个接口(例如List和一些“ElevatedList”)。因此,您可以针对指向同一对象但不同接口的不同用例公开两个getter

例如:

public  class MyObject {
static class BetterList extends ArrayList<String>{
     void someInternalLogic(){
        //
    }
}
private BetterList internalList1=new BetterList();
public List<String> getList1(){
    internalList1.someInternalLogic();
    return internalList1;
}


private List internalList2=new ArrayList<String>();
public List<String> getList2(){
    return internalList2;
}
公共类MyObject{
静态类BetterList扩展了ArrayList{
void someInternalLogic(){
//
}
}
private BetterList internalList1=新BetterList();
公共列表getList1(){
internalList1.someInternalLogic();
返回列表1;
}
private List internalList2=new ArrayList();
公共列表getList2(){
返回列表2;
}
}


getList1 getter对列表接口后面的外部用户隐藏someInternalLogic方法,如果应该在内部控制该方法的执行,则该方法可能很有用。getList2 getter将ArrayList类型隐藏在List接口后面,这样就可以自由地将internalList2的实现更改为f.e.LinkedList,以后可能会首选它

这里“隐藏实现”这个概念的关键词是灵活性,因为软件开发中唯一不变的东西叫做变化。如果您被链接到一个具体的类行为,那么代码的演化就更困难了。当您对界面进行编程时,用户实际上并不关心实现细节。因此,关于在IDE中“隐藏”,您可以看到该接口的所有实现在接口名称上按ig
CTRL+T
(至少在eclipse上)。

这里的“隐藏实现”概念的关键词是灵活性,因为软件开发中唯一不变的是更改。如果您被链接到一个具体的类行为,那么代码的演化就更困难了。当您对界面进行编程时,用户实际上并不关心实现细节。因此,关于在IDE中“隐藏”,您可以看到该接口的所有实现在接口名称上按IG
CTRL+T
(至少在eclipse上).

我不是问多态性。我想知道它是否真的可以用其他方式隐藏实现细节,或者隐藏实现细节是否有不同的上下文。@udaybhaskar不,隐藏实现细节就是这个意思。您拥有外部可见的接口(或API),调用方不应该关心实现。Mikey的回答解释了它在现实生活中是如何工作的。@Mikey,你能再详细解释一下吗?我很难理解你的回答。使用一些正确的示例代码或一些到解释的链接。@udaybhaskar示例已添加。@Mikey现在我知道,实际上隐藏实现细节意味着不严格保密。只是界面将把细节放在后面,所以作者可以随时更改,用户无需为此烦恼。谢谢。我不是问多态性。我想知道它是否真的可以用其他方式隐藏实现细节,或者隐藏实现细节是否有不同的上下文。@udaybhaskar不,隐藏实现细节就是这个意思。您有一个可以从外部看到的接口(或API),而实现是调用方应该完成的