【问题标题】:How does abstraction help in hiding the implementation details in Java?抽象如何帮助隐藏 Java 中的实现细节?
【发布时间】:2018-02-12 22:28:58
【问题描述】:

抽象是隐藏实现细节并仅向用户显示功能的过程。

另一种方式,它只向用户显示重要的东西并隐藏内部细节。 下面是一个创建抽象类并重写抽象方法的示例。但我不明白的是它是如何隐藏实现细节的?

abstract class Bank
{    
   abstract int getRateOfInterest();    
} 

class SBI extends Bank
{    
 int getRateOfInterest()
  {
   return 7;
   }    
  }

class PNB extends Bank  
{    
 int getRateOfInterest()
   { 
    return 8;
   }    
 }    

class TestBank{    
public static void main(String args[])
{    
 Bank b;   
 b=new SBI();  
 System.out.println("Rate of Interest is: "+b.getRateOfInterest()+" %");    
 b=new PNB();  
 System.out.println("Rate of Interest is: "+b.getRateOfInterest()+" %");    
 }
 }     

【问题讨论】:

标签: java abstract-class abstraction


【解决方案1】:

代码中的抽象就是抽象类本身:

abstract class Bank {    
   abstract int getRateOfInterest();    
} 

剩下的就是实现(以及实现细节),具体来说:类PNBSBI

但我不明白的是它是如何隐藏实现细节的?

假设您有一个银行比较引擎,它由BankComparisonEngine 类表示。它只需要 Bankabstract 类)作为参数,然后获取其利率并将其保存到其内部数据库,如下所示:

class BankComparisonEngine {
  public void saveInterestRateOf(Bank bank) {
    int rate = bank.getRateOfInterest();
    // Save it somwehere to reuse later 
  }
}

具体实施细节是如何隐藏的?好吧,BankComparisonEngine 不知道Bank 的具体实现的getRateOfInterest() 方法是如何工作的(即:PNB.getRateOfInterest()SBI.getRateOfInterest() 是如何实现的)。它只知道这是一个返回 int 的方法(并且它应该返回一个利率)。 实现细节隐藏在扩展abstract class Bank的具体类中。

【讨论】:

  • 另外,当我们使用导入的库对象及其方法时,我们不必担心这些方法的实现,我们只是得到了可以使用的功能。因此,通过 OOP,我们得到了重要的东西而没有内部细节。这就是抽象!
  • 所以就像用户知道有一个名为 getRateOfInterest() 的功能,但他不知道它的实现。但我在这里有一个疑问。即使一个普通的类说 PNB 银行已经被单独声明,但没有派生抽象类但在其中定义了相同的功能 getRateOfInterest() 并且当用户通过创建类的对象来使用该方法时,它也足以隐藏函数的实现。那么为什么我们需要一个抽象类/抽象呢?
【解决方案2】:

当客户必须使用您的对象时,客户无需导入您的类或在其 jar 中包含您的类定义,他/她只需导入抽象类或接口并接受您的对象作为参数,如在银行的例子。因此客户端仍然可以使用您的对象与父引用,但实际上无法看到(或需要)该类的功能实现。希望这能消除您的疑虑。

【讨论】:

    猜你喜欢
    • 2017-03-20
    • 2018-11-23
    • 1970-01-01
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    相关资源
    最近更新 更多