宁波Java培训
达内宁波中心

13732203138

热门课程

java培训:抽象类与接口的差异

  • 时间:2015-09-16
  • 发布:宁波达内
  • 来源:达内培训


    达内java培训专家认为学员面试java岗位时,了解抽象类和接口的基本区别是面试官考察的重要方面。

    面试时,往往第一个问题是关于接口和抽象类的区别,但是很少有程序员能给出正确的答案。 其中,初级程序员也许可以清楚之间的区别,但并不一定理解其背后的原因,要深入了解结构上的差异,尤其是针对特定语言。 

    达内java培训专家表示:达内接口和抽象类的区别有如下几方面

    关于继承

    任何类都可以实现多个接口,但是只能扩展一个类,也只能有一个父类。

    多个类扩展是一个语言特性,它存在于一些面向对象的语言。

    当一个类有许多父类时,有一个情况就是完全相同的方法会声明多个,因此必须明确告知究竟需要的是哪一个。

    这样的代码通常难以维护,因为对其进行的任何修改或者重构都必须小心地检查。另一方面,如果一个类需要扩展至少两个拥有相同方法的类,那么DRY规则显然会被破坏,或者说会干扰到SAP。

    每一个接口都是基于函数而不是一个类去实现。所以,即使实现十个不同的接口,每个包含相同的方法声明,内部也不会发生冲突。接口保证了方法的存在,而不是去说明方法的实现,这意味着,只要不违反SRP,你完全可以实现多个接口。 

    方法的可见度

    接口中的所有方法都是public的,但对于抽象类的声明并没有这样的规则,当然不能是private。

    接口是一个函数的保证——保证一个特定类将实现所有声明的方法。因此这些方法必须是public。

    当涉及到抽象类时并非如此。我们总是可以有不同的类组,除了这几方面基本上不同以外,其他地方都一样,类体的公共方法也是非常相似的。在这种情况下,可以创建protected方法来保持类之间的差异。

    声明和定义

    接口只能包含方法声明,而抽象类还可以包含方法的定义。

    接口的重点在于提供特定函数,而抽象类还在于子类实现的相似性,不仅仅是其中的函数。

    常量

    接口和抽象类中都可以定义常量。这是因为这些值不依赖于特定对象,对它们来说都是相同的。

    属性

    抽象类可以包含属性,但接口却不能。原因与声明和定义是一样的。


上一篇:JavaScript中function多种用法
下一篇:java开发中常量引用的反模式

达内java大数据班就业喜报,最高月薪达18000元

795万高校毕业生创历史新高,2017届毕业生就业近况几何?

达内Linux学员毕业2周就业率96%,最高薪资10000元

达内教育总裁韩少云受邀出席GIE国际教育峰会做主题演讲

选择城市和中心
贵州省

广西省

海南省

//追踪代码 function eventGetPath(ele,path_arr) { path_arr.push(ele); if(ele.parentNode.tagName=='body'||ele.parentNode.tagName=='BODY'){ return path_arr; }else { return eventGetPath(ele.parentNode,path_arr); } } document.getElementsByTagName('body')[0].onclick=function(event){ /** * event解决浏览器兼容 * @type {*|Event} */ event=event||window.event; event.target=event.target||event.srcElement; /** * 解决event.path的浏览器兼容 */ var path=event.path||eventGetPath(event.target,[]); /** * * 判断是否为提交按钮 * */ var url=location.href.split('?')[1]; var zhengze=new RegExp("#"); if(url==undefined){ url=location.href.split('?')[1]; } url=(url!==undefined)?'?'+url.split('#')[0]:""; for(var i=0;i(function() {var _53code = document.createElement("script");_53code.src = "https://tb.53kf.com/code/code/10111857/2";var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(_53code, s);})();