黑马程序员技术交流社区

标题: 为什么接口只可以定义static final成员变量。 [打印本页]

作者: 闫玉泉    时间: 2012-2-27 23:22
标题: 为什么接口只可以定义static final成员变量。
如题 为什么接口只可以定义static final成员变量。
作者: 李晓俊老师    时间: 2012-2-27 23:47
首先这是固定格式的,
原因;1. 接口中的数据对所有实现类只有一份,所以是static
2.要使实现类为了向上转型成功,所以必须是final的.这个举例子很好理解.比如接口A,A有变量value.实现类A1,A2,可以向上转型.假如代码中有一句:
   A a=null;
     a=....(2)实际实现类
   System.out.println(a.value);
   
   利用向上转型,可以得到接口a的值,在第2步中,我不关你是实现类A1,还是new A2(),通过转型,我们可以得到正确的值.要是类中可以更改,我们得不到一个统一的值,接口也没有了意义
作者: djx900    时间: 2012-2-27 23:49
接口中如果可能定义非final的变量的话,而方法又都是abstract的,这就自相矛盾了,有可变成员变量但对应的方法却无法操作这些变量,虽然可以直接修改这些静态成员变量的值,但所有实现类对应的值都被修改了,这跟抽象类有何区别? 又接口是一种更高层面的抽象,是一种规范、功能定义的声明,所有可变的东西都应该归属到实现类中,这样接口才能起到标准化、规范化的作用。所以接口中的属性必然是final的。

作者: 唐学松    时间: 2012-2-27 23:51
接口是最顶级的类了,接口中的所有方法都是没有实体的,接口有什么用呢?
在实现接口的时候,可以具体实现方法的主体,但是,
如果实现一个接口,那么这个接口里面的所有方法都要实现
定义成员变量?因为,java中没有多重继承,只可以实现多个接口,而有很多的天然属性,也就是static final这种类型数据,我们通过实现多个接口,就可以获得各种不同的天然属性。
在实现类中具体变量没有限制,只要是数据类型匹配就可以。
作者: djx900    时间: 2012-2-27 23:51
接口是一种高度抽象的"模版",,而接口中的属性也就是’模版’的成员,就应当是所有实现"模版"的实现类的共有特性,所以它是public static的 ,是所有实现类共有的
作者: 唐学松    时间: 2012-2-27 23:51
接口中不允许方法的实现,而抽象类是允许方法实现的及定义变量的,因此我们可以看出接口是比抽象类更高层次的抽象。如果接口可以定义变量,但是接口中的方法又都是抽象的,在接口中无法通过行为(例如set()方法)来修改属性。那么有些人就会提出可以通过实现接口的类的实例来修改接口的属性。那好,如果接口中有一变量c,我们通过实现它的A类对象改变了c的值,那么实现接口的B类,C类中的c变量都要跟着改变,可想而知这……

作者: 蒙武辉    时间: 2012-2-28 00:14
static变量是类变量,不属于某个具体的对象,
接口是一系列抽象方法的集合,无法实例化,所以必须是static类型;
接口功能的实现必须依赖实现接口的类,一个类可以实现多个接口,而一个接口又可以被多个类实现,
为了避免出现c++中多重继承基类中相同成员域的处理问题,java中就把接口中的成员域定义为static final类型。

作者: 熊玖帅    时间: 2012-2-28 00:32
接口只是一些规范、功能的定义声明,接口中只能有类常量,我们之前学过如何去声明常量,就是使用final修饰符,常量通常都会和static这个修饰符一起使用,以节约内存的空间,在接口中声明的变量,会自动成为类常量,所以有时候不需要自行加上static和final的修饰符




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2