Javac 为什么要使用接口使用接口

他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
为什么Java的接口不能定义构造函数?
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
非要逼死抽象类不可!
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
首先你要明白构造函数的作用,构造函数就是初始化class的属性或者方法,在new的一瞬间自动调用,那么问题来了Java和PHP的接口,都不能new 那么要构造函数干嘛呢?根本就没法调用
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
为什么国王的 王 是三横一竖?
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
接口是定义行为的,不是定义生产方式的
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
你怎么实例化咧?
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
因为接口不会有自己的实例的,所以不需要有构造函数。
为什么接口不会有自己的实例?因为接口只是定义一系列抽象的功能,使用接口的时候都是通过实现接口的类的,不会直接去用接口。直接去用,那些函数只是个定义,没法用
当然,在Java 8里面接口定义的函数可以有默认的实现,但还是不能直接用接口去调这种函数。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
接口不能实例化,如果能new出来那要接口还有什么意义?不过java8之后,接口可以有默认方法,可以直接直接调用
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
哎...越是简单的问题越不好回答,只能说java语言在设计的时候就把接口定义为一种类需要遵循的规范,是为了弥补单继承的不足而设计的。有本书《程序员的呐喊》,里面作者就喷了java的接口的设计,还写到:“高斯林说过,如果重写设计java语言的话,不会考虑接口这种方式”。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
抽象类可以。接口不能定义方法细节,只能定义其一系列行为。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
我姑且认为题主想要在接口里使用构造函数,是想在具体实现接口的class里做一些代码复用。
interface I {
public I() {
system.out.println("不管你怎么实现,我最牛逼");
"代码复用"和"接口实现分离"是有一些冲突的,各个不同的类型就是对利弊的取舍妥协。
interface选择了最少的复用、最大的分离
一般类的复用容易,但接口不分离
抽象类介于之间。
如@MaxValue所说,如果interface可以有constructor,那就和抽象类定位差不多了。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
从接口的功能来说,他是代表抽象,对问题的定义,不存在实体,自然就不需要构造函数了
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
因为Java语言规范是这么写的
A constructor is used in the creation of an object that is an instance of a class (§12.5, §15.9).
看到没有instance of a class
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。下次自动登录
现在的位置:
& 综合 & 正文
接口的定义,使用及和抽象类的区别
一、Java接口基础知识
1, Java语言不支持一个类有多个直接的父类(多继承),但可以实现(implements)多个接口,间接的实现了多继承.
2, 与Java接口相关的设计模式:
1, 定制服务模式
设计精粒度的接口,每个Java接口代表相关的一组服务,通过继承来创建复合接口
2, 适配器模式
当每个系统之间接口不匹配时,用适配器来转换接口
3, 默认适配器模式
为接口提供简单的默认实现
4, 代理模式
为Java接口的实现类创建代理类,使用者通过代理来获得实现类的服务
5, 标识类型模式
用接口来标识一种没有任何行为的抽象类型
6, 常量接口模式
在接口中定义静态常量,在其它类中通过import static语句引入这些常量
3, Java接口的特征归纳:
1, Java接口中的成员变量默认都是public,static,final类型的(都可省略),必须被显示初始化,即接口中的成员变量为常量(大写,单词之间用"_"分隔)
2, Java接口中的方法默认都是public,abstract类型的(都可省略),没有方法体,不能被实例化
public interface A
int CONST = 1; //合法,CONST默认为public,static,final类型
void method(); //合法,method()默认为public,abstract类型
public abstract void method2(); //method2()显示声明为public,abstract类型
3, Java接口中只能包含public,static,final类型的成员变量和public,abstract类型的成员方法
public interface A
//错,var是常量,必须显示初始化
void method(){...};
//错,接口中只能包含抽象方法
protected void method2(); //错,接口中的方法必须是public类型
static void method3(){...};
//错,接口中不能包含静态方法
4, 接口中没有构造方法,不能被实例化
public interface A
public A(){...}; //错,接口中不能包含构造方法
void method();
5, 一个接口不能实现(implements)另一个接口,但它可以继承多个其它的接口
public interface A
void methodA();
public interface B
void methodB();
public interface C extends A, B
//C称为复合接口
void methodC();
public interface C implements A{...}
6, Java接口必须通过类来实现它的抽象方法
public class A implements B{...}
7, 当类实现了某个Java接口时,它必须实现接口中的所有抽象方法,否则这个类必须声明为抽象的
8, 不允许创建接口的实例(实例化),但允许定义接口类型的引用变量,该引用变量引用实现了这个接口的类的实例
public class B implements A{}
A a = new B(); //引用变量a被定义为A接口类型,引用了B实例
A a = new A(); //错误,接口不允许实例化
9, 一个类只能继承一个直接的父类,但可以实现多个接口,间接的实现了多继承.
public class A extends B implements C, D{...} //B为class,C,D为interface
4, 通过接口,可以方便地对已经存在的系统进行自下而上的抽象,对于任意两个类,不管它们是否属于同一个父类,只有它们存在相同的功能,就能从中抽象出一个接口类型.对于已经存在的继承树,可以方便的从类中抽象出新的接口,但从类中抽象出新的抽象类却不那么容易,因此接口更有利于软件系统的维护与重构.对于两个系统,通过接口交互比通过抽象类交互能获得更好的松耦合.
5, 接口是构建松耦合软件系统的重要法宝,由于接口用于描述系统对外提供的所有服务,因此接口中的成员变量和方法都必须是public类型的,确保外部使用者能访问它们,接口仅仅描述系统能做什么,但不指明如何去做,所有接口中的方法都是抽象方法,接口不涉及和任何具体实例相关的细节,因此接口没有构造方法,不能被实例化,没有实例变量.
二, 比较抽象类与接口
1, 抽象类与接口都位于继承树的上层
1, 代表系统的抽象层,当一个系统使用一颗继承树上的类时,应该尽量把引用变量声明为继承树的上层抽象类型,这样可以提高两个系统之间的送耦合
2, 都不能被实例化
3, 都包含抽象方法,这些抽象方法用于描述系统能提供哪些服务,但不提供具体的实现
1, 在抽象类中可以为部分方法提供默认的实现,从而避免在子类中重复实现它们,这是抽象类的优势,但这一优势限制了多继承,而接口中只能包含抽象方法.由于在抽象类中允许加入具体方法,因此扩展抽象类的功能,即向抽象类中添加具体方法,不会对它的子类造成影响,而对于接口,一旦接口被公布,就必须非常稳定,因为随意在接口中添加抽象方法,会影响到所有的实现类,这些实现类要么实现新增的抽象方法,要么声明为抽象类
2, 一个类只能继承一个直接的父类,这个父类可能是抽象类,但一个类可以实现多个接口,这是接口的优势,但这一优势是以不允许为任何方法提供实现作为代价的
三, 为什么Java语言不允许多重继承呢?
当子类覆盖父类的实例方法或隐藏父类的成员变量及静态方法时,Java虚拟机采用不同的绑定规则,假如还允许一个类有多个直接的父类,那么会使绑定规则更加复杂,因此,为了简化系统结构设计和动态绑定机制,Java语言禁止多重继承.而接口中只有抽象方法,没有实例变量和静态方法,只有接口的实现类才会实现接口的抽象方法(接口中的抽象方法是通过类来实现的),因此,一个类即使有多个接口,也不会增加Java虚拟机进行动态绑定的复杂度.因为Java虚拟机永远不会把方法与接口绑定,而只会把方法与它的实现类绑定.
四, 使用接口和抽象类的总体原则:
1, 用接口作为系统与外界交互的窗口站在外界使用者(另一个系统)的角度,接口向使用者承诺系统能提供哪些服务,站在系统本身的角度,接口制定系统必须实现哪些服务,接口是系统中最高层次的抽象类型.通过接口交互可以提高两个系统之间的送耦合系统A通过系统B进行交互,是指系统A访问系统B时,把引用变量声明为系统B中的接口类型,该引用变量引用系统B中接口的实现类的实例。
public interface B
public class C implements B
public class A
B a = new C();
2, Java接口本身必须非常稳定,Java接口一旦制定,就不允许随遇更加,否则对外面使用者及系统本身造成影响
3, 用抽象类来定制系统中的扩展点
抽象类来完成部分实现,还要一些功能通过它的子类来实现
【上篇】【下篇】为什么 java 写 mvc 的时候,都要写个 Dao、Service 接口,然后再写个 DaoImpl、ServiceImpl?
14:34:21 +08:00 · 4205 次点击
遇到公司,基本都这么写,我感觉dao这个接口没卵用啊,就是生命一个接口里面的方法,总不会说别人给你写个dao,然后你去实现方法吧
34 回复 &| &直到
02:35:49 +08:00
& & 14:52:00 +08:00
好听点就是分层解耦,层次清晰,利于重构。难听点就是java版本的八股
& & 15:03:16 +08:00
因为你遇到的只有一个实现
& & 15:13:25 +08:00
& & 15:14:27 +08:00
为Dao写接口的确是件然并卵且蛋疼的事情。
为Service写接口还是有必要的。
比如一个调用外部资源的服务,在开发和测试时可以使用MockImpl,在生产环境里可以用ProductionImpl。
再比如当项目规模变大、需要做服务化的时候,要实现RMI,就要有接口。
& & 15:15:29 +08:00
比如数据库连接,可能有 MySQL 也可能有 Oracle 还可能是直接自己读写文本文件
每一种都是一种实现
& & 15:20:44 +08:00
如果你只有一个实现方案的话,可以不用接口啊;
但是接口还有个功能就是方便后面的人理解业务。
& & 15:21:20 +08:00
等你遇到需要多种实现的时候就知道用处了。
& & 15:51:52 +08:00
因为你接触的项目可能在起步阶段, 实现可以使用不同的数据库,另外接口可以方面以后做单元测试 mock.
另外一个比较严重的问题就是你说java mvc, DAO不属于mvc 你们有service 有 dao,所以架构上是mvc 3-tiers,不是单纯的mvc
& & 15:55:44 +08:00
我觉得有ORM框架的话,就没有必要DAO了。
至于service,其实很多人建议把service的业务逻辑写在domain model。
& & 16:35:43 +08:00
瞬间创造了无数的工作..
& & 17:01:32 +08:00
这样才有工作量嘛。。。其实如果换了数据库实现就需要dao了,毕竟orm不能完全解决我们的问题,当然大部分时候都是可以的
& & 17:14:12 +08:00
装逼用的,呵呵
& & 17:26:40 +08:00
面向接口,主要也是为了方便以后扩展
& & 17:36:34 +08:00
有多少项目,会写着写着就换了一个数据库的呢?Dao还真必要性不大
& & 17:39:09 +08:00
& & 18:21:05 +08:00
直到3年前我也以为是八股
有些事,不是你自己写上百万行代码,删上几十万行代码,别人怎么说你都不会明白的
& & 18:30:18 +08:00
这是过早优化或者是恰当优化
& & 18:53:06 +08:00 via iPhone
是因为你没见过代码崩坏的项目
& & 19:03:52 +08:00
刚在读effective java,正好讲到了interface与class,我就说说我的感受。
dao和service这些其实都是抽象你的逻辑层从而达到高内聚和低耦合的概念,便于日后的维护。举个生活中的例子,家用电源的三头插口,这是一个业界标准(接口),家电生产商不需要管这个三头插背后是怎么实现的,他们只需要知道,插上这个接口,他们的电器就会有220伏特的电能供应。Java里面的collection也是一个遵循这种设计的典范,List抽象了所有具体List(ArrayList, LinkedList)的接口,当你创建一个List的时候,根据你的需求(性能?容量?唯一性?)赋予它不同的实现,但是变量仍然是List这个类型,这样如果以后你要改动这个变量的实际类型,你就只需要改动赋值的那行,否则的话,你还要到处找到调用这个变量的地方进行修改。
说了这么多话,其实就是方便日后的维护和扩展。
& & 19:34:31 +08:00
对于 spring mvc 来说,interface 规定了方法签名,框架才能放心大胆的把各种 IoC,class 增强的黑魔法玩出花样。
& & 19:49:19 +08:00
所以说php是最好的语言,就是这么来的
& & 19:51:45 +08:00
php一样写dao 一样写service,但不用写daoimpl serviceimpl 瞬间让很多java程序员失业了
& & 20:53:22 +08:00 via Android
是一种累赘,十几年前流行的方法论,现在不入流了。
& & 22:40:49 +08:00
用了 mybatis 之后就不用写 daoimpl 了……
& & 08:38:01 +08:00 via iPhone
都说dao层抽象之后可以无缝切换数据库,什么情况下才会换数据库呢?求教
& & 09:10:02 +08:00
总结了一下答案,90%的项目不需要写,真等到重构了,用ide工具分分钟抽取出来
& & 09:32:37 +08:00
Dependency Inversion principle: Depend upon abstractions. Do not depend upon concrete classes.
& & 10:56:02 +08:00
小项目都不需要这么写了吧,数据库一般也不会切换;
& & 11:04:06 +08:00
@ 基本不会切数据库,就算切,工作量也不在这几个类那里
& & 11:35:39 +08:00
& & 14:35:22 +08:00
楼上一群人不要误导人好伐,这样提炼接口是为了使用JDK的动态代理
& & 18:56:59 +08:00
& & 14:35:17 +08:00
@ 比如什么?JDK自带的动态代理必须要接口
& & 02:35:49 +08:00 via iPhone
@ 比如事务的实现啊
& · & 776 人在线 & 最高记录 3541 & · &
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.0 · 64ms · UTC 18:35 · PVG 02:35 · LAX 10:35 · JFK 13:35? Do have faith in what you're doing.2016年1月 Java大版内专家分月排行榜第二2015年12月 Java大版内专家分月排行榜第二2015年8月 Java大版内专家分月排行榜第二2015年3月 Java大版内专家分月排行榜第二2015年1月 Java大版内专家分月排行榜第二2014年12月 Java大版内专家分月排行榜第二2014年11月 Java大版内专家分月排行榜第二2014年6月 Java大版内专家分月排行榜第二2014年4月 Java大版内专家分月排行榜第二2014年1月 Java大版内专家分月排行榜第二2013年11月 Java大版内专家分月排行榜第二
2015年9月 Java大版内专家分月排行榜第三2015年6月 Java大版内专家分月排行榜第三2015年5月 Java大版内专家分月排行榜第三2015年2月 Java大版内专家分月排行榜第三2014年3月 Java大版内专家分月排行榜第三2013年12月 Java大版内专家分月排行榜第三
匿名用户不能发表回复!|

我要回帖

更多关于 耳机usb接口怎么使用 的文章

 

随机推荐