3


我试图理解java中抽象的概念。当我浏览一些教程时,他们说抽象是一个只显示“相关”数据并“隐藏”用户不必要的对象细节的过程。


这是抽象类如何工作的一个简单示例。

public class Demo {

    public static void main(String[] args) {
       Animal a = new Dog();
        a.sound();
    }
}

abstract class Animal {
    abstract void sound();
}

class Dog extends Animal {
    @Override
    public void sound() {
        System.out.println("woof");
    }
}

我知道虽然抽象类我们可以在子类中实现通用方法,如sound()方法。

我不明白的是,这对隐藏数据和仅查看必要数据有何帮助。

请向我解释这个概念。

如果你有很好的例子,请也包括在内。

4

5 回答 5

1

在您的示例中,您创建 aDog然后将其用作动物。在这种情况下,抽象不是很有用,因为您知道变量a总是指的是一只狗。现在让我们说在其他一些类中你有一个方法soundTwice

class OutsideWorld {
    static void soundTwice(Animal a) {
        a.sound();
        a.sound();
    }
}

在这里你不知道Animal a指的是什么类型,但你仍然可以发出两次声音。

更新

我添加这个类是因为这个类Demo没有隐藏太多:它需要知道类Dog,因为它创建了一个实例。OutsideWorld另一方面,类不知道:它只知道类AnimalAnimal暴露的类。它甚至不知道这个类的Dog存在。

我们现在可以Cat使用不同的方法实现sound(“meow”)编写一个类,并且我们仍然可以将相同的soundTwice方法与Cat.

然后我们可以重写这个Demo类:

public class Demo {
    public static void main(String[] args) {
        Animal a = new Dog();
        OutsideWorld.soundTwice(a);
        a = new Cat();
        OutsideWorld.soundTwice(a);
    }
}

当然,这会产生输出:

woof
woof
meow
meow
于 2018-02-15T12:08:25.660 回答
1

Java 中的抽象与我们在软件工程术语中使用的抽象没有什么不同。

抽象通常回答问题陈述的一部分。

  • 系统将支持哪​​些所有操作?

  • 该系统的用途是什么?

考虑抽象数据类型:示例Stack

你关心的只是

  1. pop() --> 返回顶部元素
  2. push() --> 添加元素

您根本不关心实现细节。所以你的java类以同样的方式抽象。

于 2018-02-15T11:43:00.060 回答
1
于 2018-02-15T12:01:01.427 回答
0

抽象

实现抽象的方式 java实现 抽象有两种方式

  1. 抽象类(0 到 100%)
  2. 接口 (100%)

基本知识: 抽象方法和类

抽象类是被声明为抽象的类——它可能包含也可能不包含抽象方法。抽象类不能被实例化,但它们可以被子类化。

    public abstract class ClassName{
       // declare fields
      // declare nonabstract methods
      abstract void methodName();
    }

当抽象类被子类化时,子类通常为其父类中的所有抽象方法提供实现。但是,如果不是,则子类也必须声明为抽象的。

抽象方法是在没有实现的情况下声明的方法(没有大括号,后跟分号),如下所示:

abstract void methodName(Parameter List);

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

了解抽象类的真实场景:

考虑制作一个函数来获取任何学校的学生实力的情况。

现在我们将创建一个抽象类和抽象函数 getStrength()。

然后每所学校(政府或私立)都可以使用这种抽象方法并提供实现。

//Consider this Code


package stackoverflow;

abstract class StudentStrength {

    abstract int getStrength();
}

class GovtSchool extends StudentStrength {

    @Override
    int getStrength() {
        return 100;

    }
}

class PrivateSchool extends StudentStrength {

    @Override
    int getStrength() {
        return 200;

    }
}

public class GetInfo {
    public static void main(String args[]) {

        StudentStrength ss;

        // referring abstract class and creating object of child class
        ss = new GovtSchool();
        System.out.println("Student strength in Govt School : "+ ss.getStrength());
        // output of above : 100
        ss = new PrivateSchool();
        System.out.println("Student strength in Private School : "+ ss.getStrength());
        // output of above : 200
    }
}

解释:

在此示例中,StudentStrength 是抽象类,其实现由 GovtSchool 和 PrivateSchool 类提供。

大多数情况下,我们不知道实现类(即对最终用户隐藏),实现类的对象由工厂方法提供。

在此示例中,如果您创建 GovtSchool 类的实例,则会调用 GovtSchool 类的 getStrength() 方法。

文件:GetInfo.java

公立学校学生人数:100 私立学校学生人数:200

回答: 我不明白的是这如何帮助隐藏数据和仅查看必要的数据。

如上面代码所示,我们指的是抽象类并使用子类的功能对最终用户隐藏子类的工作。

我希望我有帮助:)

于 2018-02-15T13:24:05.597 回答
0

抽象意味着 - 不提供/拥有实现细节。想象一下,您有权决定汽车必须配备哪些零件。您将把这些功能列为抽象方法。

稍后您将把这个(合同)抽象模板分享给 Hundai、Ford 等,让他们有自己的实现来制作完整的汽车。

于 2018-02-15T11:52:19.207 回答