我试图理解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()
方法。
我不明白的是,这有助于数据隐藏和查看必要的数据。
请向我解释这个概念。
如果你有很好的例子,也请加入。
答案 0 :(得分:1)
Abstraction与我们在软件工程术语中使用的不同。
抽象通常会回答问题陈述的 WHAT 部分。
系统支持的所有操作是什么?
系统的用途是什么?
考虑抽象数据类型:
示例Stack
你关心的只是
pop
() - >返回顶部元素push
() - >添加元素您根本不关心实施细节。所以你的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中有两种实现抽象的方法
基本知识: 抽象方法和类
抽象类是一个声明为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
答案: 我不明白的是,这有助于数据隐藏和查看必要的数据。
如上面的代码所示,我们引用了抽象类,并使用子类的功能隐藏了最终用户的子类的工作。
我希望我能提供帮助:)