`

接口中定义变量必须为public static final的原因

    博客分类:
  • java
 
阅读更多
在interface里面的变量默认都是public static final 的。所以可以直接省略修饰符:

String param="ssm";//变量需要初始化



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



答:

首先接口是一种高度抽象的"模版",,而接口中的属性也就是’模版’的成员,就应当是所有实现"模版"的实现类的共有特性,所以它是public 的 ,是所有实现类共有的 .否则具体实现类不能使用该变量,则就没有了定义的意义。

static的原因是,假如可以是非static的话,因一个类可以继承多个接口,出现重名的变量,如何区分呢?所以必须定义成static的,以便区分。
例如一个类实现了两个不同的接口,这两个接口中有相同名字的变量定义,示例代码如下:
public class MultiInmpl implements InTF, InTFOther{

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
MultiInmpl m = new MultiInmpl();
//如果实现的接口中有同名的变量,则不能引用
System.out.println(m.str);//str在2个接口中都有定义

}
}
以上代码编译错误!!!
Multiple markers at this line
- The field m.str is ambiguous
- Line breakpoint:MultiInmpl [line: 11] - main(String[])



其次,接口中如果可能定义非final的变量的话,而方法又都是abstract的,这就自相矛盾了,有可变成员变量但对应的方法却无法操作这些变量,虽然可以直接修改这些静态成员变量的值,但所有实现类对应的值都被修改了,这跟抽象类有何区别? 又接口是一种更高层面的抽象,是一种规范、功能定义的声明,所有可变的东西都应该归属到实现类中,这样接口才能起到标准化、规范化的作用。所以接口中的属性必然是final的。



最后,接口只是对事物的属性和行为更高层次的抽象 。对修改关闭,对扩展(不同的实现implements)开放,接口是对开闭原则(Open-Closed Principle )的一种体现。
分享到:
评论

相关推荐

    【Java基础】Java8新特性—接口中使用default和static关键字

    接口中的变量默认类型是public static final,也是就是说是 公有静态常量 。 而方法默认是public abstract,公有抽象方法,但是事实真的是这样吗? 一.新特性 Java 1.8对接口有两个方面的增强:接口中可以添加使用...

    Java-关键字final详解(public static final)

    无法为最终变量进行赋值了。 final修饰的变量只能赋一次值。 final修饰的变量一旦赋上值就不能再重新赋值了。 (2)fina修饰的变量如果这个变量是一个”引用”会怎么样? 解析:s2里面最初分配了0x123,然而你再给...

    Java中抽象类和接口的区别

    接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。  6.抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。  7.接口中...

    1.5:接口和抽象类的区别.pdf

    5.接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。 6.抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。 7.接口中的方法...

    java继承详解

    常量的定义格式: public static final 数据类型 变量名 定义常量的时候,常量的名字要大写,如果存在两个单词组合起来的名字,要用下划线连接 public static final int AGE = 23;// public static final String ...

    Java学习笔记---15.面向对象编程10-Java中final关键字,抽象类与接口

    讲抽象类的定义必须先讲抽象方法的定义. 所谓抽象方法,是指只声明而未实现(即没有{}包围的方法体)的方法. 而含有一个或多个抽象方法的类就称为抽象类. 抽象类 = 普通类 + 抽象方法 对于抽象类,时刻需要谨记: ...

    Static和Final修饰类属性变量及初始化

    1.static修饰一个属性字段,那么这个属性字段将成为类本身的资源,public修饰为共有的,可以在类的外部通过test.a来访问此属性;在类内部任何地方可以使用.如果被修饰为private私有,那么只能在类内部使用.

    Test.java关于静态的分析

    public static final String SUCCESS="success"; public static final String FAIL="fail"; static double [] d =new double[10];//??? static{ //可以初始化静态常量 d[0]=1; d[0]=2; d[0...

    Java基础 接口.pdf

    2、接口定义的常量默认是 public static final 的。 3、一个类可以实现多个接口,实现接口使用 implements 关键字。 4、接口不能被实例化。 5、接口可以继承另外一个接口,使用 extends 关键字。 6、接口与抽象类...

    Swing 8种主流皮肤

    变量定义 public class SwingUI { static final String JTattoo = "com.jtattoo.plaf.smart.SmartLookAndFeel"; static final String Office2003 = "org.fife.plaf.Office2003.Office2003LookAndFeel"; static ...

    【05-面向对象(下)】

    •一个类实现了一个或多个接口之后,这个类必须完全实现这些接口里所定义的全部抽象方法(也就是重写这些抽 象方法); •否则,该类将保留从父接口那里继承到的抽象方法,该类也必须定义成抽象类。 接口...

    深入理解Java final变量的内存模型

     在构造函数内对一个 final 域的写,与随后把这个构造对象的引用赋值给一个变量,这两个操作之间不能重排序  初次读一个包含 final 域的对象的引用,与随后初次读这个 final 域,这两个操作之间不能重排序  举...

    java核心知识点整理

    注意:常量定义于main方法的外边,而且必须有关键字 static final; 6.字符串的子串: String str = hello”“; String str1 = str.substring(0,4); //输出hell 7.不要用==运算符来测试两个字符串是否相等,该...

    Java抽象类与接口的区别

    含有abstract修饰符的class 即为抽象类,abstract类不能创建实例对象,含有abstract的方法的类必须定义为abstract class ,abstract class 里的方法...接口中的变量是全局常量,即public static final修饰的。 看一下他

    类的使用,学习,小结 java定义一个学生类

    [public /protected /private /static /final] 数据类型 变量名称; [public /protected /private /static /final /abstract] 返回值类型 方法名字(参数){ //如果返回值类型不是void,必须有return语句 } }

    JAVA核心知识点整理.rar

    注意:常量定义于main方法的外边,而且必须有关键字 static final; 6.字符串的子串: String str = hello”“; String str1 = str.substring(0,4); //输出hell 7.不要用==运算符来测试两个字符串是否相等,该...

    JAVA基础知识精华总结 收藏

    (2) 接口中的方法均为public,在实现接口类中,实现方法必须可public关键字。 (3) 如果使用public来修饰接口,则接口必须与文件名相同。 8、 多重继承 (1) 一个类继承了一个类和接口,那么必须将类写在前面,接口...

    疯狂的java讲义源码-cosmos-tutorial:学习的点点滴滴(文档可查看:https://cosmosni.github.io/co

    接口中定义的变量被隐式指定为public static final。 接口中所有的方法不能有具体的实现。在java8中,可用default关键字在接口中实现默认方法。 接口与抽象类的区别: 抽象类中的成员变量可以是各种类型的,而接口中...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    在类体中定义的数据、变量和方法称为类的成员, 或称为实例变量和实例方法。 (7) 例如: 下例定义了一个 Point 类 ,并且声明了它的两个变量 x、y 坐标 ,同时实现 init()方法 对 x、y 赋初值 。 class Ponit { int...

    《java面向对象程序设计-继承和多态》教案.doc

    } // 定义程序使用的常量的接口 public interface myconstants { public static final double price = 1450.00; public static final int counter = 5; } 创建接口的步骤 2-2 接口使用示例 总结 封装、继承和多态是...

Global site tag (gtag.js) - Google Analytics