java - java中的抽象和数据隐藏

标签 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() 方法。

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

请向我解释一下这个概念。

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

最佳答案

在您的示例中,您创建了一只,然后将其用作动物。在这种情况下,抽象不是很有用,因为您知道变量 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

关于java - java中的抽象和数据隐藏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48805899/

相关文章:

java - 只让用户输入正整数(不能输入小数或字符串)?

c++ - 是否可以在成员例程中使用 const_cast 来避免重复代码

c++ - 复制多态对象

oop - 有没有办法将 Trait 实现和防御拆分到不同的模块中?

java - 如何在 Travis CI 中测试 Java 8?

java - 谷歌应用引擎: how to add information to the connect/disconnect channel "ping"s?

java - 如何在java中创建函数描述/定义

c++ - C++ 中的 C# 样式枚举

c# - 抽象类中嵌套抽象类及其实现方式

oop - 抽象和多态有什么区别