接⼝⾥可以有变量么?
浅谈为什么Java接⼝中不允许定义变量?
它们是公共的,静态的,最终的常量。相当于全局常量。抽象类是不“完全”的类,相当于是接⼝和具体类的⼀个中间层。即满⾜接⼝的抽象,也满⾜具体的实现。
如果接⼝可以定义变量,但是接⼝中的⽅法⼜都是抽象的,在接⼝中⽆法通过⾏为来修改属性。有的⼈会说了,没有关系,可以通过实现接⼝的对象的⾏为来修改接⼝中的属性。这当然没有问题,但是考虑这样的情况。如果接⼝ A 中有⼀个public 访问权限的静态变量 a。按照Java 的语义,我们可以不通过实现接⼝的对象来访问变量 a,通过 A.a = xxx; 就可以改变接⼝中的变量 a 的值了。正如抽象类中是可以这样做的,那么实现接⼝ A 的所有对象也都会⾃动拥有这⼀改变后的 a 的值了,也就是说⼀个地⽅改变了 a,所有这些对象中 a 的值也都跟着变了。这和抽象类有什么区别呢,怎么体现接⼝更⾼的抽象级别呢,怎么体现接⼝提供的统⼀的协议呢,那还要接⼝这种抽象来做什么呢?所以接⼝中不能出现变量,如果有变量,就和接⼝提供的统⼀的抽象这种思想是抵触的。所以接⼝中的属性必然是常量,只能读不能改,这样才能为实现接⼝的对象提供⼀个统⼀的属性。
通俗的讲,你认为是要变化的东西,就放在你⾃⼰的实现中,不能放在接⼝中去,接⼝只是对⼀类事物的属性和⾏为更⾼层次的抽象。对修改关闭,对扩展(不同的实现 implements)开放,接⼝是对开闭原
则的⼀种体现。
接⼝和抽象类的区别收藏简单来说,接⼝是公开的,⾥⾯不能有私有的⽅法或变量,是⽤于让别⼈使⽤的,⽽抽象类是可以有私有⽅法或私有变量的,另外,实现接⼝的⼀定要实现接⼝⾥定义的所有⽅法,⽽实现抽象类可以有选择地重写需要⽤到的⽅法。⼀般的应⽤⾥,最顶级的是接⼝,然后是抽象类实现接⼝,最后才到具体类实现。还有,接⼝可以实现多重继承,⽽⼀个类只能继承⼀个超类,但可以通过继承多个接⼝实现多重继承,接⼝还有标识(⾥⾯没有任何⽅法,如Remote接⼝)和数据共享(⾥⾯的变量全是常量)的作⽤.
1.abstract class 在 Java 语⾔中表⽰的是⼀种继承关系,⼀个类只能使⽤⼀次继承关系。但是,⼀个类却可以实现多个interface.
2.在abstract class 中可以有⾃⼰的数据成员,也可以有⾮abstarct的成员⽅法,⽽在interface中,只能够有静态的不能被修改的数据成员(也就是必须是 static final的,不过在 interface中⼀般不定义数据成员),所有的成员⽅法都是abstract的。
3.abstract class和interface所反映出的设计理念不同。其实abstract class表⽰的是"is-a"关系,interface表⽰的是"like-a"关系。
4.实现抽象类和接⼝的类必须实现其中的所有⽅法。抽象类中可以有⾮抽象⽅法。接⼝中则不能有实现⽅法。
5.接⼝中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。
6.抽象类中的变量默认是 friendly 型,其值可以在⼦类中重新定义,也可以重新赋值。
7.接⼝中的⽅法默认都是 public,abstract 类型的。
接⼝中不能有私有成员,不能有实现⽅法,只有⽅法声明,
接⼝没有实例化,只能是
(接⼝) ITest test = new Test();实际上还是实例化了接⼝的实现类
抽象类中可以有私有成员,可以有实现⽅法
他⾃⼰都能实例化了还要断承和实现类做啥(哈哈,这是俗⼀点的说法)
有时间在⽹上看看接⼝和抽象类的区别
================================================
接⼝可以实例化
⼀般对象⽐如有个具体的类Person已定义好,要实例化它, 采取的语法是 Person objPerson = new Person();
但接⼝(如IConnection)不能这么做,其不能直接New ⾃⼰,如 IConnection objIConnection = new IConnection(),
这就是说"照例不可以⽣成接⼝的对象"的含义.
但⾯向对象都具有多态,可以向上转型, ⽐如某个类实现了该接⼝,如类Connection实现了该接⼝,则Connection类的
实例化对象可以给IConnection接⼝. 如 IConnection objIConnection = new Connection()
然后编程都基于接⼝进⾏操作,这样脱离了具体的类的实现,在某些场合就更灵活和易于扩充.
把变的东西抽象出来了,成了接⼝,反倒就让代码相对固定了,能适应变化的情况.
接⼝不能实列化,但是可能通过某些类创建接⼝的对类
==================================================
接⼝不能“直接”实例化。--msdn //没说不能“间接” “间接”实例化接⼝接⼝实例 = new 实现接⼝的类() 长见识
===================================================
===================================================
类-抽象类-接⼝总结近期通过对Java⼀些基础知识的学习,我熟悉了类抽象类以及接⼝这三个概念,先将其区别与联系总结如下! 1 三者最⼤的[color=indigo]区别在[u][/u]于类具有构造器从⽽可以来构造对象!⽽抽象类与接⼝中的⽅法都是未完全实现,他们都是⼀种抽象模型,不具备构造对象的能⼒!但是可以通过实现(implements)接⼝和继承(extends)抽象类来创建类从⽽来构造对象! 2在定义上:类的定义模式是public+class+类名[b];抽象类的定义public+abstract+clas+类名;接⼝的定义格式public+interface+类名 3在⽅法上类的⽅法必须有实现⽽抽象类的⽅法可以根据需要部分实现;⽽接⼝中的⽅法只能有其定义没有具体的实现,就是说接⼝中的⽅法都是抽象的⽅法!抽象类中可以有⾮抽象⽅法。接⼝中则不能有实现⽅法 4抽象类和接⼝在继承和实现时⼦类对⽗类中未实现的⽅法必须实现可对其进⾏重写!
5接⼝中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变!
=============================================================
抽象类,通过继承它实现多态,后期绑定,可以为将来要实现的东西做好接⼝,实现重⽤性。
InterfaceA IA = new InterfaceA();
编译器报错:Cannot instantiate the type TA 指明接⼝只能被声明,不能被实例化。
简单⼯⼚设计模式
设定⼀个Class名称是AClass,在⾯向对象编程中,⼀般⼀个Class都会继承⼀个接⼝,设定AClass的接⼝为AInterface,那么⽣成AClass
的对象⽅法如下:
AInterface a = new AClass();
java接口可以创建对象吗改写成下列⽅式: AInterface a = ate(); //代码2
Afactory的create⽅法封装了具体创建细节。解耦了创建过程和使⽤过程,系统可扩展性增强,稳定性增强。 Afactory的create⽅法代码:
public static AInterface create(){ …… return new AClass(); }
上⾯代码2这⼀⾏是使⽤Afactory的create⽅法来⽣成AInterface实例。
由于是初学者,之前⼀直对上⾯这句很困惑,前⼏天看到⼀个⽤抽象类实现接⼝的案例,为什么不直接⽤抽象类的实例的⽅法?
⽹上的解答:
接⼝是强制性的,它的所有⽅法都要实现。
但是抽象类不是,⽐如说⼀个接⼝,你只⽤到其中的⼀两个⽅法,可是如果直接实现接⼝需要实现⾥⾯的五个⽅法,这时候你可以先让抽象类实现接⼝,然后你的类继承接⼝,就不需要都实现接⼝的⽅法了⽽且接⼝的抽象层次要更⾼,是⼀种契约,抽象类是提供了很多的⽅法,
给你⽤,没有强制性。
抽象类和接⼝⽐起来,有⼀个好处,就是某些函数可以实现具体的⽅法,⽽并不⼀定是声明抽象的⽅法,⽽接⼝只能声明抽象⽅法,所以⽤⼀个抽象类来实现某个接⼝可以实现⼀些通⽤的⽅法,⽽这些具体实现的⽅法⾥还可以调⽤抽象⽅法,所以减少了⼦类中的重复代码
=======================================================
我也谈谈抽象类和接⼝的理解,它们最根本的区别是:
抽象类的⼦类是继承,⽽接⼝的⼦类是实现.唯⼀性的继承让⼦类有其⽗类除私有外的⼀切责任和义务,意味着更与⽗类有更紧密的耦合;
接⼝则不是唯⼀的,可根据需要实现或不实现,这种可选择性意味着松耦合和灵活.
所以,如果是极少变动的,或者说内置的特征,我们⽤抽象类,⽐如性别,⼀旦出⽣,性别就固定,那继承⾃male类即使⾼耦合也没什么影响.但你从事什么职业,却是很可能变动的,你今天可能是程序员,明年则可能⼲起了个体户,那implement⼀个programmer接⼝更合适.其实你也许已经注意
什么职业,却是很可能变动的,你今天可能是程序员,明年则可能⼲起了个体户,那implement⼀个programmer接⼝更合适.其实你也许已经注意到,⼀旦你继承male类,你就和male紧密的耦合了,因为你⼀辈⼦都⽣不了孩⼦,⽽不像programmer那样,你还有的选...
强烈推荐"软件开发-原则模式和实践"这本书,对提⾼编码质量,或将思维从实现提升设计层⾯,都很有帮助.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论