JAVA抽象

JAVA抽象,java,interface,abstract-class,abstraction,data-hiding,Java,Interface,Abstract Class,Abstraction,Data Hiding,我对java中的抽象有点困惑 我已经检查了很多页面,说明抽象就是数据隐藏(隐藏实现) 我对抽象的理解是它是“部分实现”。只需在抽象类/接口中定义您需要的内容,然后扩展/实现它们并添加您自己的功能 我不明白的是,这是一个怎样的数据隐藏?一旦实现了类/接口,您就可以访问代码,并将根据需要对其进行修改 我检查了很多关于这方面的问题和文章,但仍然对此感到困惑 感谢您的帮助。 谢谢。数据隐藏是指不阅读文档就无法理解如何在内部使用API(例如,ArrayList)。API创建者不提供对其基础阵列的任何访问

我对java中的抽象有点困惑

我已经检查了很多页面,说明抽象就是数据隐藏(隐藏实现)

我对抽象的理解是它是“部分实现”。只需在抽象类/接口中定义您需要的内容,然后扩展/实现它们并添加您自己的功能

我不明白的是,这是一个怎样的数据隐藏?一旦实现了类/接口,您就可以访问代码,并将根据需要对其进行修改

我检查了很多关于这方面的问题和文章,但仍然对此感到困惑

感谢您的帮助。
谢谢。

数据隐藏是指不阅读文档就无法理解如何在内部使用API(例如,
ArrayList
)。API创建者不提供对其基础阵列的任何访问

您对将使用它的用户隐藏API实现。他们不应该担心它在内部是如何工作的,他们只对提供给他们的功能感兴趣

这是有道理的。

您将抽象(编程模式)与Java语言的抽象关键字混淆了。尽管有相似之处,但它们在语义上的关联却很小

  • 抽象意味着对使用类或方法的代码隐藏实现细节。使用您的方法的代码不需要知道您正在使用数组或动态指针、嵌入式数据库或文件系统中的文件实现列表

  • 抽象用于标记具有仅声明而未实现的方法的类。它是“抽象的”,因为它们不能被实例化,您不能从这些类中创建任何实例(但您可以从它们的具体子类中创建它们)


    • 它不是对您隐藏信息,而是对您抽象的客户隐藏信息。看看这个例子

      public class Demo {
          Client client = new Client(new Implementation());
      }
      
      public interface Abtraction {
          void doWork();
      }
      
      public class Implementation implements Abtraction{
          @Override
          public void doWork() {
              //doingTheWork
          }
      }
      
      public class Client{
          private Abtraction theAbstraction;
      
          public Client(Abstraction theAbstraction){
              this.theAbstraction = theAbstraction;
          }
      }
      

      客户端
      不知道
      抽象的实现
      ,这意味着
      演示
      类可以提供不同的
      抽象实现
      ,而不会弄乱
      客户端

      数据隐藏基本上是隐藏类的内部数据成员的详细信息,只独占地让相关类访问它

      因此,它避免了来自应用程序中其他类或任何其他应用程序的不必要的渗透,这意味着其他类无法直接访问私有成员变量


      因此,通过这种方式,您可以抽象出相关类的内部细节。

      我不确定这是否回答了您的问题,但如果您所说的是一般的抽象类,它们是为子类提供功能的,该子类可以扩展它,而子类不必知道或处理实现的所有细节(它对子类的用户是隐藏的)

      以汽车为例:

      public abstract class Vehicle {
          protected int _numberOfWheels;
          public Vehicle() {
              this._numberOfWheels = 4;
          }
      }
      
      public class Truck extends Vehicle {
          public int carryingLoad;
          public Truck() {
              this.carryingLoad = 4000; // kg or something
          }
      }
      
      Graph g1,g2;
      g1 = new GraphAdjList();
      g2 = new GraphAdjMatrix();
      
      g1.addEdge(1,2);
      g2.addEdge(1,2);
      
      因此,vehicle是vehicle对象的抽象实例,并且已经具有一些与之相关的功能,例如车轮的数量。这是一个受保护的方法,因此如果我创建一个新的truck实例:

      // Inside main
      Truck truck = new Truck();
      
      但是,如果我要在类中为truck编写一个函数,如:

      // Inside the Truck class
      public void addSpareTire() {
          this._numberOfWheels++;
      }
      
      所以我可以这样称呼它:

      // Inside main
      truck.addSpareTire();
      
      我仍然可以与一些变量进行交互,但只能深入扩展抽象类的类中的函数。我可以通过调用
      addSpareTire()
      一次添加一个轮胎,但我无法从使用
      Truck
      对象的主函数直接与
      \u numberOfWheels
      交互,但我可以从
      Truck
      类声明内部进行交互。对于卡车对象的用户,该信息是隐藏的


      我不知道这是不是你想要的。希望这会有所帮助。

      在面向对象编程中,抽象是一个向用户隐藏实现细节的过程,只有功能才会提供给用户。换言之,用户将获得有关对象做什么而不是如何做的信息

      有关详细信息,请查看以下链接:

      也许一个例子可以帮助你更好。假设您想要实现一个图形类,它可能具有邻接列表或邻接矩阵来表示其节点。因此,抽象地说,您至少要将“addNode”“addEdge”添加到此图中:

      public abstract class Graph
      {
          public abstract int addNode();
          public abstract void addEdge(int from, int to);
      }
      
      现在可以扩展两个类:

      public class GraphAdjList extends Graph
      {
          private Map<Integer,ArrayList<Integer>> adjListsMap;
          public int addNode()
          {
              //list based implementation 
          }
          public void addEdge(int from, int to)
          {
              //list based implementation
          }
      }
      
      public class GraphAdjMatrix extends Graph
      {
          private int[][] adjMatrix;
          public int addNode()
          {
              //matrix based implementation 
          }
          public void addEdge(int from, int to)
          {
              //matrix based implementation
          }
      }
      
      通过多态性调用两个不同的函数,但得到的结果与图的客户机相同

      另一个真实的例子是汽车制动器。作为一个汽车客户,制造商给你一个踏板来推动,而不知道后端的制动器是如何实现的。它可以是后面的鼓式制动器或盘式制动器。你所需要的就是踩刹车

      一旦实现了类/接口,您就可以访问代码,并将根据需要对其进行修改

      我猜你对语言给你的概念有点困惑,比如这里的
      抽象
      。您总是可以访问自己的代码,但是像
      抽象
      多态性
      这样的东西为您提供了理想的方式,让您可以使用这些东西。所以在
      Abstraction
      中,你只是说我知道会有一种行为,它的名字是
      someThing
      ,作为抽象方法,但现在你不知道它将如何表现,实现者会告诉我们这将是怎样的。请参阅下面的代码

      abstract class Game{
       public abstract void play();
      }
      
      class Football extends Game{
        @Override
        public abstract void play(){
            // write how football play
        }
      }
      
      class Cricket extends Game{
        @Override
        public abstract void play(){
            // write how Cricket play
        }
      }
      
      我在这里给你留下一个问题


      尽管在实现时可以访问代码,但为什么要将类级属性设置为public/protected/private?

      我认为您对两件事感到困惑

    • 面向对象的抽象概念及其Java实现
    • 抽象类