Java中的抽象和数据隐藏

时间:2018-02-15 11:14:57

标签: java oop abstraction data-hiding


我试图理解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()方法。

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

请向我解释这个概念。

如果你有很好的例子,也请加入。

5 个答案:

答案 0 :(得分:1)

Java中的

Abstraction与我们在软件工程术语中使用的不同。

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

  • 系统支持的所有操作是什么?

  • 系统的用途是什么?

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

你关心的只是

  1. pop() - >返回顶部元素
  2. push() - >添加元素
  3. 您根本不关心实施细节。所以你的java类以同样的方式被抽象出来。

答案 1 :(得分:1)

抽象不只是仅显示来自用户的“相关”数据和“隐藏”对象的不必要细节。

数据抽象是一种属性,凭借该属性,仅向用户显示基本细节。不向用户显示普通或非必需单元。 例如:汽车被视为汽车而不是其各个组件。

  

在java中,抽象是通过接口和抽象类实现的。我们可以使用接口实现100%抽象。

您在示例中解释的那个就是它的一种形式。

在你的Animal类的例子中,如果sound()方法不是一个抽象方法,并且你在该类中有一些随机的抽象方法,想象一下有人编写了Animal类并且你在Dog类中扩展它的情况。无论Actual Animal类中的实现如何,您都可以在当前类中编写代码。

想象一下,你没有覆盖Dog类中的sound()方法,如果你调用`

  

狗d =新狗(); d.sound();

`会得到Animal sound()的代码。[给定:sound()方法不是抽象的]。将执行Animal类的代码。 Dog对象甚至不知道sound()方法在其中有什么......但它仍然可以使用它。这个不知道但正在使用某事的过程实际上是抽象的

正如Yati Sawhney所提到的,pop()和push()方法都是非常好的例子。

其他,

  

你可以从Object类获得 hascode() equals()方法,   没有人知道计算是如何完成的,但你最终会得到一个   数字并分别比较参考文献。

数据隐藏/封装:

数据隐藏与抽象不同。不要混淆另一个。

  

抽象是从其他对象/用户隐藏代码实现   而数据隐藏是通过POJO类封装实现的。

     

数据隐藏与决定的实例变量有关   对象的状态。使用setter()和隐藏其内容   Getter()方法是Data Hiding / Encapsulation。

你可能想知道,getter()方法是如何隐藏数据的,而它只是返回我们请求的数据,但是有一个关于getter / setter方法的无数故事。

示例: 请参阅以下代码中的getName()方法

public class Person  {


    private  int age;
    private  String name;



    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
       // can restrict the code without displaying data to user
         if(condition)//restricted user check
            return null;//returning null because the user is not supposed to view the data

        return name;
    }

}

答案 2 :(得分:1)

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

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

在这里,您不知道Animal a所指的是哪种类型,但您仍然可以发出两次声音。

更新

我正在添加此类,因为类Demo并不隐藏太多:它需要了解类Dog,因为它会创建它的实例。另一方面,课程OutsideWorld并不是:它只知道课程Animal和课程Animal。它甚至不知道班级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

答案 3 :(得分:0)

抽象意味着 - 不提供/具有实施细节。想象一下,您有权决定汽车必须具备哪些部件。您将列出这些功能作为抽象方法。

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

答案 4 :(得分:0)

抽象

实现抽象的方法 在java中有两种实现抽象的方法

  1. 抽象类(0到100%)
  2. 界面(100%)
  3. 基本知识: 抽象方法和类

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

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

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

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

    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

    答案: 我不明白的是,这有助于数据隐藏和查看必要的数据。

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

    我希望我能提供帮助:)