我们如何在Java中实现抽象?

4

根据定义,抽象是隐藏实现细节并仅显示功能。但是,我们隐藏什么、在哪里隐藏以及隐藏哪部分?

据我所知,以下程序是抽象的示例:

public interface ToBeImplemented { 

   public string doThis();
}

public class Myclass implements ToBeImplemented {

@override
public string doThis() {

//Implementation

 return null;
 }
}

如果我错了,这不是抽象的例子,那么什么是正确的抽象例子?


1
这是一种思考抽象化的方式。不是错误的,但也不是全部。 - duffymo
@duffymo,你能帮我理解抽象化还包括什么吗? - aspan88
2
你的机器上没有安装谷歌吗?你读了什么?你做了哪些研究? - duffymo
2
好的,我会去谷歌一下。感谢您的建议。此外,我寻求帮助,而您通过不直接给出答案来提供了帮助。人们在谷歌搜索问题时,甚至谷歌也会推荐 Stack Overflow。 - aspan88
3
我认为对象提供了封装和抽象,当你能够查看函数名称或API并理解它在不必担心它如何实现时。如果我收到一个矩阵类,我可以理解它的add()方法在不必担心作者在底层如何实现它。如果我使用java.util.List接口,我可以集中精力处理它提供的方法而不必担心它们是如何实现的。这是一种管理复杂性的方式。 - duffymo
3个回答

3
在上面的示例中,您可以编写类似以下内容的内容:
public interface ToBeImplemented { 

    public string doThis();
}

public class ImplementationA implements ToBeImplemented {

    @override
    public string doThis() {

    //ImplementationA of doThis

    return null;
    }
}

public class ImplementationB implements ToBeImplemented {

    @override
    public string doThis() {

        //ImplementationB of doThis

        return null;
    }

然后您可以创建另一个类,例如一个主方法:

class SomeClass{

    public static void main(String[] args) {

        ToBeImplemented someImplementation;

        //now you can pick an implementation, based on user input for example
        if (userInput == something) 
           someImplementation = new ImplementationA();
        else
           someImplementation = new ImplementationB();

        //do some staff

        //Regardless of the user input, main method only knows about the
        //abstract "ToBeImplemented", and so calls the .doThis() method of it
        //and the right method gets called based on the user input.
        someImplementaion.doThis();
        //at That

    }

}

抽象化的概念是您可以声明一个ToBeImplemented引用,然后将其分配给ImplementationA或ImplementationB(以及可能的任何其他实现)。但是您编写的代码针对抽象的ToBeImplemented编写,并让某些条件决定应调用ToBeImplemented的正确实现(并因此执行doThis())。


2

你对抽象的定义是正确的。而你提供的代码绝对是一种抽象形式。

为什么呢?

因为你的代码的使用者只会得到接口。使用者只会知道你的代码 doThis() 执行某项任务,但他/她不会知道代码是如何执行这个任务的。

例如:

public interface myInterface{
 public int sumTo(n);
}

public class myClass implements myInterface{
 public int sumTo(int n){
  int sum=0;
  for(int i=0; i<=n; i++){
    sum+=i;
  }
  return sum;
 }
}

在这个例子中,用户只会看到界面,所以他/她只知道你的代码可以把n相加。但是用户不会知道你使用了for循环来相加n

0

维基百科是开始学习的好地方:抽象(计算机科学)

抽象的本质是保留在给定上下文中相关的信息并忘记在该上下文中无关的信息。

John V. Guttag

将接口与实现分离是提供抽象的一种方式。

Java的集合框架是一个绝佳的例子。调用应用程序使用声明为接口的变量(引用),如ListMap,而实际上在运作的对象是真正的具体类,比如ArrayListHashMap

如果接口提供了所有所需的功能,则无需调用应用程序知道底层实现。

问题中显示的示例代码是将接口与实现分离的例子,因此是抽象的。如果该示例使用特定有意义的上下文,如BankAccount作为接口,而将SavingsAccountCheckingAccount作为实现,则可以极大地改进该示例。


1
你能提供一篇简要解释Java中如何通过抽象类和接口实现抽象的文章或写作吗?我无法将覆盖抽象方法与抽象(隐藏不必要的细节并仅提供有意义的内容)联系起来。我的理解可能不清楚。 - Soumitri Pattnaik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接