接口里可以有变量么?

浅谈为什么Java接口中不允许定义变量?

它们是公共的,静态的,最终的常量。相当于全局常量。抽象类是不“完全”的类,相当于是接口和具体类的一个中间层。即满足接口的抽象,也满足具体的实现。

如果接口可以定义变量,但是接口中的方法又都是抽象的,在接口中无法通过行为来修改属性。有的人会说了,没有关系,可以通过实现接口的对象的行为来修改接口中的属性。这当然没有问题,但是考虑这样的情况。如果接口 A 中有一个public 访问权限的静态变量 a。按照 Java 的语义,我们可以不通过实现接口的对象来访问变量 a,通过 A.a = xxx; 就可以改变接口中的变量 a 的值了。正如抽象类中是可以这样做的,那么实现接口 A 的所有对象也都会自动拥有这一改变后的 a 的值了,也就是说一个地方改变了 a,所有这些对象中 a 的值也都跟着变了。这和抽象类有什么区别呢,怎么体现接口更高的抽象级别呢,怎么体现接口提供的统一的协议呢,那还要接口这种抽象来做什么呢?所以接口中不能出现变量,如果有变量,就和接口提供的统一的抽象这种思想是抵触的。所以接口中的属性必然是常量,只能读不能改,这样才能为实现接口的对象提供一个统一的属性。

通俗的讲,你认为是要变化的东西,就放在你自己的实现中,不能放在接口中去,接口只是对一类事物的属性和行为更高层次的抽象。对修改关闭,对扩展(不同的实现 implements)开放,接口是对开闭原则的一种体现。

本文转自http://developer.51cto.com/art/200906/130093.htm

Java接口和抽象类的区别 收藏 简单来说, 接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的,另外,实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法。 一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。 还有,接口可以实现多重继承,而一个类只能继承一个超类,但可以通过继承多个接口实现多重继承,接口还有标识(里面没有任何方法,如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();

改写成下列方式: AInterface  a = Afactory.create();    //代码2

Afactory的create方法封装了具体创建细节。解耦了创建过程和使用过程,系统可扩展性增强,稳定性增强。 Afactory的create方法代码:     public static AInterface create(){          ……         return new AClass();    }

上面代码2这一行是使用Afactory的create方法来生成AInterface实例。

由于是初学者,之前一直对上面这句很困惑,前几天看到一个用抽象类实现接口的案例,为什么不直接用抽象类的实例的方法?

网上的解答:

接口是强制性的,它的所有方法都要实现。

但是抽象类不是,比如说一个接口,你只用到其中的一两个方法,可是如果直接实现接口需要实现里面的五个方法,这时候你可以先让抽象类实现接口,然后你的类继承接口,就不需要都实现接口的方法了而且接口的抽象层次要更高,是一种契约,抽象类是提供了很多的方法,给你用,没有强制性。

抽象类和接口比起来,有一个好处,就是某些函数可以实现具体的方法,而并不一定是声明抽象的方法,而接口只能声明抽象方法,所以用一个抽象类来实现某个接口可以实现一些通用的方法,而这些具体实现的方法里还可以调用抽象方法,所以减少了子类中的重复代码

=======================================================

我也谈谈抽象类和接口的理解,它们最根本的区别是:

  • 抽象类的子类是继承,而接口的子类是实现.唯一性的继承让子类有其父类除私有外的一切责任和义务,意味着更与父类有更紧密的耦合;接口则不是唯一的,可根据需要实现或不实现,这种可选择性意味着松耦合和灵活.

所以,如果是极少变动的,或者说内置的特征,我们用抽象类,比如性别,一旦出生,性别就固定,那继承自male类即使高耦合也没什么影响.但你从事什么职业,却是很可能变动的,你今天可能是程序员,明年则可能干起了个体户,那implement一个programmer接口更合适.其实你也许已经注意到,一旦你继承male类,你就和male紧密的耦合了,因为你一辈子都生不了孩子,而不像programmer那样,你还有的选...

强烈推荐"敏捷软件开发-原则模式和实践"这本书,对提高编码质量,或将思维从实现提升设计层面,都很有帮助.

时间: 2024-10-24 19:51:27

接口里可以有变量么?的相关文章

Java接口里定义成员变量 说明

首先你要弄清接口的含义.接口就是提供一种统一的'协议',而接口中的属性也属于'协议'中的成员.它们是公共的,静态的,最终的常量.相当于全局常量. 在interface里面的变量都是public static final 的.所以你可以这样写: public static final int i=10; 或则 int i=10;(可以省略掉一部分,在接口里的成员变量默认就是public static final) 注意在声明的时候要给变量赋予初值 解释: 首先你要弄清接口的含义.接口就是提供一种统

阿里巴巴Java开发手册剖析-01.尽量不要在接口里定义变量

[推荐]接口类中的方法和属性不要加任何修饰符号(public 也不要加) ,保持代码的简洁性,并加上有效的 Javadoc 注释.尽量不要在接口里定义变量,如果一定要定义变量,肯定是与接口方法相关,并且是整个应用的基础常量. 在effective java中文版第2版中第19条:接口只用于定义类型 当类实现接口时,接口就充当可以引用这个类的实例的类型(type).因此.类实现了接口,就表明客户端可以对这个类的实例实施某些动作.为了任何其他目的而定义接口是不恰当的. 有一种接口被称为常量接口,它不

Java中接口里定义的成员变量

首先你要弄清接口的含义.接口就是提供一种统一的'协议',而接口中的属性也属于'协议'中的成员.它们是公共的,静态的,最终的常量.相当于全局常量. 在interface里面的变量都是public static final 的.所以你可以这样写: public static final int i=10; 或则 int i=10;(可以省略掉一部分) 注意在声明的时候要给变量赋予初值 解释: 首先你要弄清接口的含义.接口就是提供一种统一的'协议',而接口中的属性也属于'协议'中的成员.它们是公共的,

F#新Bug,小心! module 里的泛型变量。

原则上,.Net不支持静态泛型变量,但是 F# 的语法支持,如: module Mithra = let Empty<'T> = Seq.empty <'T> 但是,这只是个语法糖而已.把这 F# 代码块编译成一个库,在C#里调用,即可看到,没有 Empty 变量,只有 Empty 函数.也就是说,这个“Empty”在 F# 里面,只是看起来像变量,实际上是在执行一个函数. 这有什么关系呢?答:有关系. 参照老赵的<逆泛型执行器>,如果有泛型变量的话.F# 下,实现逆泛

为什么接口要规定成员变量必须是public static final的呢?(转)

在interface里面的变量默认都是public static final 的.所以可以直接省略修饰符: String param="ssm"://变量需要初始化 为什么接口要规定成员变量必须是public static final的呢? 答: 首先接口是一种高度抽象的"模版",,而接口中的属性也就是’模版’的成员,就应当是所有实现"模版"的实现类的共有特性,所以它是public static的 ,是所有实现类共有的 .假如可以是非static

Java接口中的成员变量的意义

转自:http://blog.csdn.net/ameyume/article/details/6189749 在interface里面的变量都是public static final 的.所以你可以这样写:public static final int i=10;或则int i=10:(可以省略掉一部分) 注意在声明的时候要给变量赋予初值 解释: 首先你要弄清接口的含义.接口就是提供一种统一的'协议',而接口中的属性也属于'协议'中的成员.它们是公共的,静态的,最终的常量.相当于全局常量.抽象

Eclipse里选中一个变量后,这个类里的该变量不变色了?

Eclipse里选一个变量后,这个类里的该变量不变色了. 1.使用“Alt+Shift+O”对该提示功能的开/关切换 2.可以在以下设置选中后的文本提示颜色  window--> Preferences--> General--> Editors--> Text Editors--> Annotations Eclipse里选中一个变量后,这个类里的该变量不变色了?

java 在接口里函数不能重载?

项目里使用hession远程调用serviceRemote接口,而serviceRemote接口里有两个save方法,参数分别是CpCredential对象和List,但运行发现会报莫名其妙的错. 后来同事提醒,将接口方法名分别改为save 和saveList两个不同方法名后就正常了. 难道是java bug? java -version java version "1.7.0_55"Java(TM) SE Runtime Environment (build 1.7.0_55-b13

[转]在Linux里设置环境变量的方法

在Linux里设置环境变量的方法(export PATH) 一般来说,配置交叉编译工具链的时候需要指定编译工具的路径,此时就需要设置环境变量.例如我的mips-linux-gcc编译器在“/opt/au1200_rm/build_tools/bin”目录下,build_tools就是我的编译工具,则有如下三种方法来设置环境变量: 1.直接用export命令:#export PATH=$PATH:/opt/au1200_rm/build_tools/bin查看是否已经设好,可用命令export查看