java中面向对象开发和面向接口开发的区别?

2020-09-20 08:41发布

2条回答
cc收获啦
2楼 · 2020-09-21 13:30
  • 1、面向对象编程:

  • 首先java就是面向对象编程,所谓在java中万事万物皆对象,这是因为java中所有类的调用都是new出来的,其次面向对象用到三大特性,即封装、多态、继承。

  • 2、面向接口编程:

  • 一个接口可以从三方面去考察:制定者(或者叫协调者)、实现者(或者叫生产者)、调用者(或者叫消费者),接口本质上就是由制定者来协调实现者和调用者之间的关系。

  • 所以通常说的"面向接口编程"可以理解为:只有实现者和调用者都遵循"面向接口编程"这个准则,制定者的协调目的才能达到。


快乐的一只小青蛙
3楼 · 2020-12-29 11:34

一、首先理解面向对象的三要素

    1、继承

    2、封装    

    3、多态

        个人认为,面向对象编程是站在事物对象的角度来谈论这个话题的(这的对象不是指具体的某一个类的实例,而是说组成世界的事务,就是一个一个的对象)。在系统的构建过程中,组成生态系统的对象包括森林、山川、湖泊、海洋等等。而在这些大的对象中例如森林本身就是一个更小的生态系统,这和程序设计中的微服务概念是完全相同的。

        组成世界的系统尚且如此,程序架构中也是参考了现实世界中的实现。面向对象和微服务实质上都是对代码的封装,不同的是层面上的不同。面向对象编程更倾向于程序功能的实现上,而微服务更倾向于系统架构的层面。无论是微服务还是面向对象编程,总之都是希望,代码更加利于维护和更加健壮。

        而,面向接口编程则是站在了程序实现过程中,需要依赖某个对象时的抽象过程。比如:你人生中需要找一个男朋友,但是在茫茫人海里,你并不知道具体是谁。所以你可以事先规划你的人生,预留一个男人的接口就可以了。具体到时候谁和你结婚生子,你可以先不用关心。也许这个例子并不是很贴切,我们换一个例子,比如:你要吃肉,然后你就出钱给猎人去打猎。猎人去山里,打到猪你就吃猪,打到狗你就吃狗。对于你来说你只是关心吃肉,但是不同的猎人去打猎,你就具备了不同的能力(吃猪肉和吃狗肉)。好了闲话不多扯,我们来看下嘛的代码实现

二、代码实现

    1、先定义一个接口代表你自己,提供一个吃的能力

public interface YourSelf{    //代表你能吃肉
    String eat();
}

    2、定义一个A类(这里不定以为猎人类,因为不够形象)去实现YourSelf接口

public class A implements YourSelf{    //实现YourSelf类的eat方法
    public String eat(){       return  "吃猪肉";
    }
}

    3、定义一个B类,去实现YourSelf接口

public class B implements YourSelf{    //实现YourSelf类的eat方法
    public String eat(){       return  "吃狗肉";
    }
}

        这样,不同的实现类,你就具备了不同的能力。本文不是要介绍面向对象的多态性,所以这里不做过多的赘述,以上代码也没有进行测试。今天我们要讲的是如何理解面向接口编程。

        现在,假设我们要实现你吃肉这么一个功能。那我们可以按一下的思路来实现。

            (1) 有一个你自己的对象(俗称调用类)

            (2) 要有一个吃肉的行为(俗称方法)

            (3) 你自己要具备吃肉这个行为(俗称 调用类要能够执行该方法)

        下面我们来看代码实现,

        

private YourSelf yourSelf;//实现你吃肉public static void mian(String[] args){    //1,首先由你自己(可以采用spring注入,但是spring注入需要有实现类,而我们现在就是不知道实现类是谁啊)
       yourSelf (你自己有了)     
    //2,用你自己去做吃这种行为(用你自己去掉 吃的方法)
       eat(吃的方法也在接口里面了)    
    //3,我不管了,反正我要吃肉(面向接口编程的思想精髓就在于抛开一切,不管不顾,勇敢的去做自己想做的事情)
       yourSelf.eat();(虽然启动会报错,但是我非要这么写,我的功能完成了,我只写接口不写实现类,实现类交给其他同事去写)
      
}

    

           面向接口编程的思想精髓就在于抛开一切具体实现过程,不管不顾只提供最抽象的逻辑。这就像领导和说这个系统要实现什么什么功能一样,你也可以站在领导的角度,用对象的角度来封装这些功能(这里的对象不光是指某个类的实例,也可以是某个子系统或某个模块,如支付系统,邮件系统、登录模块等等,一定要把控好对对象划分的粒度)。要想真正体会什么是面向接口编程,首先要选择好看待问题的角度和把控好对象划分的细粒度

          如果你不站在具体实现的细节不管不问,你也就很难去理解面向接口编程了。这和生活中的管理层管理的道理是不谋而合的,就好比一个董事长,他只关心公司重大问题的裁决上,公司有什么大事需要裁决。开个股东大会然后做个决定,完了。如果他非要关心公司里面某个员工上班都在做什么,完成了多少工作,有没有在偷懒。那他也不可能成为董事长。这和程序开发中一个接口或类中依赖了很多对象一样,到最后改都没办法改了。只能暗暗的心理骂一句那个同事写的代码真垃圾,然后自己也跟着同事做一些让这个代码变得更烂的行为。

     4、具体去实现某个接口

         我们说,站在对细节不管不问的角度更能够理解面向接口编程,其实就是对代码的一种抽象。也有的书会把面向对象的三大特性改为四大特性,多加了抽象这么一个概念。其实抽象的目的就是为了减少代码之间的依赖,注意,是代码之间的依赖而不是类或者对象之间的依赖。因为代码也包括了类、对象、的概念,同时也包括子系统,模块,微服务等之间的依赖了。

         当然,在系统开发设计过程中,我们可以切换角色,站在不同的角度来看问题,从而设计出更加合理的系统来。但是在编程中,我们还是逃不过具体实现这个角色。根据很多优秀的开源框架如:spring 的源码过程中也给了我们很多启示,我们可以定义一个默认的一个实现类,去实现该接口的某一种实现功能,这样启动的时候就不会报错了。当我们需要另外一种实现方式去实现该接口时,我们可以换一个类去实现接口。调用方就不用依赖于具体的实现类了,你根本不用关心是哪个类去实现的,你就调就完了。


相关问题推荐

  • 回答 2

    Statement的execute(String query)方法用来执行任意的SQL查询,如果查询的结果是一个ResultSet,这个方法就返回true。如果结果不是ResultSet,比如insert或者update查询,它就会返回false。我们可以通过它的getResultSet方法来获取ResultSet,或者通过getUpda...

  • 回答 22

    忙的时候项目期肯定要加班 但是每天加班应该还不至于

  • 回答 108
    已采纳

    虽然Java人才越来越多,但是人才缺口也是很大的,我国对JAVA工程师的需求是所有软件工程师当中需求大的,达到全部需求量的60%-70%,所以Java市场在短时间内不可能饱和。其次,Java市场不断变化,人才需求也会不断增加。马云说过,未来的制造业要的不是石油,...

  • 回答 5
    已采纳

    工信部证书含金量较高。工信部是国务院的下属结构,具有发放资质、证书的资格。其所发放的证书具有较强的权威性,在全国范围内收到认可,含金量通常都比较高。 工信部证书,其含义也就是工信部颁发并承认的某项技能证书,是具有法律效力的,并且是国家认可的...

  • 回答 70
    已采纳

    学Java好不好找工作?看学完Java后能做些什么吧。一、大数据技术Hadoop以及其他大数据处理技术都是用Java或者其他,例如Apache的基于Java 的 HBase和Accumulo以及ElasticSearchas。但是Java在此领域并未占太大空间,但只要Hadoop和ElasticSearchas能够成长壮...

  • 回答 16
    已采纳

    就是java的基础知识啊,比如Java 集合框架;Java 多线程;线程的五种状态;Java 虚拟机;MySQL (InnoDB);Spring 相关;计算机网络;MQ 消息队列诸如此类

  • 回答 12

    #{}和${}这两个语法是为了动态传递参数而存在的,是Mybatis实现动态SQL的基础,总体上他们的作用是一致的(为了动态传参),但是在编译过程、是否自动加单引号、安全性、使用场景等方面有很多不同,下面详细比较两者间的区别:1.#{} 是 占位符 :动态解析 ...

  • 回答 62

    没问题的,专科学历也能学习Java开发的,主要看自己感不感兴趣,只要认真学,市面上的培训机构不少都是零基础课程,能跟得上,或是自己先找些资料学习一下。

  • 回答 4

    1、反射对单例模式的破坏采用反射的方式另辟蹊径实例了该类,导致程序中会存在不止一个实例。解决方案其思想就是采用一个全局变量,来标记是否已经实例化过了,如果已经实例化过了,第 二次实例化的时候,抛出异常2、clone()对单例模式的破坏当需要实现单例的...

  • 回答 5

     优点: 一、实例控制  单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。 二、灵活性  因为类控制了实例化过程,所以类可以灵活更改实例化过程。 缺点: 一、开销  虽然数量很少,但如果每次对象请求引用时都要...

  • 回答 4

    这个主要是看你数组的长度是多少, 比如之前写过的一个程序有个数组存的是各个客户端的ip地址:string clientIp[4]={XXX, xxx, xxx, xxx};这个时候如果想把hash值对应到上面四个地址的话,就应该对4取余,这个时候p就应该为4...

  • 回答 6

     哈希表的大小 · 关键字的分布情况 · 记录的查找频率 1.直接寻址法:取关键字或关键字的某个线性函数值为散列地址。即H(key)=key或H(key) = a·key + b,其中a和b为常数(这种散列函数叫做自身函数)。...

  • 回答 6

    哈希表的大小取决于一组质数,原因是在hash函数中,你要用这些质数来做模运算(%)。而分析发现,如果不是用质数来做模运算的话,很多生活中的数据分布,会集中在某些点上。所以这里最后采用了质数做模的除数。 因为用质数做了模的除数,自然存储空间的大小也用质数了...

  • 回答 2

    是啊,哈希函数的设计至关重要,好的哈希函数会尽可能地保证计算简单和散列地址分布均匀,但是,我们需要清楚的是,数组是一块连续的固定长度的内存空间

  • 回答 3

     解码查表优化算法,seo优化

  • 回答 5

    1.对对象元素中的关键字(对象中的特有数据),进行哈希算法的运算,并得出一个具体的算法值,这个值 称为哈希值。2.哈希值就是这个元素的位置。3.如果哈希值出现冲突,再次判断这个关键字对应的对象是否相同。如果对象相同,就不存储,因为元素重复。如果对象不同,就...

没有解决我的问题,去提问