`
shaomeng95
  • 浏览: 219481 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Java接口中的成员变量为什么必须是public static final?

阅读更多

在interface里面的变量默认都是public static final 的。所以可以直接省略修饰符:

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

 

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

 

答:

首先接口是一种高度抽象的"模版",,而接口中的属性也就是’模版’的成员,就应当是所有实现"模版"的实现类的共有特性,所以它是public static的 ,是所有实现类共有的 .假如可以是非static的话,因一个类可以继承多个接口,出现重名的变量,如何区分呢?

 

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

 

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

 

不知道大家能否认同?请畅所欲言!

 

分享到:
评论
19 楼 IWSo 2014-03-04  
楼主分析的深刻。谢
18 楼 lancelotly 2011-04-15  
s929498110 写道
不内涵。
搞java里面相当一部分人都是思维懒惰的机器人
只知道how、 而不想知道why

什么事情有果就有因、 只知道果的人永远都是傀儡

java规范不是天朝制度, 不是不能剖析里面的原理

LZ这篇帖子很简约而不简单
只不过太多人侧重于炫耀知识而不是探索知识,所以也出现那么多的人投隐藏票了、或许他们认为不投隐藏或者新手对不起“他们丰富的开发经验和熟练的java使用技巧”

引用兄台的话,这帖子确实简约而不简单。这样的帖子最有意思。
既然事情是这个道理,就要知道为什么是这个道理,做事要知因果。
投隐的人除非你确实是超级大牛,在那里装清高,要么就是一群半桶水装深沉。
17 楼 micheel37 2011-04-14  
接口==协议
16 楼 kongruxi 2011-04-14  
s929498110 写道
不内涵。
搞java里面相当一部分人都是思维懒惰的机器人
只知道how、 而不想知道why

什么事情有果就有因、 只知道果的人永远都是傀儡

java规范不是天朝制度, 不是不能剖析里面的原理

LZ这篇帖子很简约而不简单
只不过太多人侧重于炫耀知识而不是探索知识,所以也出现那么多的人投隐藏票了、或许他们认为不投隐藏或者新手对不起“他们丰富的开发经验和熟练的java使用技巧”


就是:知其然,但不知其所以然
15 楼 s929498110 2011-04-14  
不内涵。
搞java里面相当一部分人都是思维懒惰的机器人
只知道how、 而不想知道why

什么事情有果就有因、 只知道果的人永远都是傀儡

java规范不是天朝制度, 不是不能剖析里面的原理

LZ这篇帖子很简约而不简单
只不过太多人侧重于炫耀知识而不是探索知识,所以也出现那么多的人投隐藏票了、或许他们认为不投隐藏或者新手对不起“他们丰富的开发经验和熟练的java使用技巧”
14 楼 shaomeng95 2011-04-14  
kuaileqingfeng 写道
引用

首先接口是一种高度抽象的"模版",,而接口中的属性也就是’模版’的成员,就应当是所有实现"模版"的实现类的共有特性,所以它是public static的 ,是所有实现类共有的 .假如可以是非static的话,因一个类可以继承多个接口,出现重名的变量,如何区分呢?

对于楼主的这点,我不能认同,接口中的属性是static的,是因为接口不能实例化,所以如果要引用接口中的属性,只能通过接口去引用,和引用类中的静态变量的方式一样,例如:BigDecimal.ZERO

我说的是:假如可以是非static的话,怎么区分? 不知道你是否能理解我的意思 呵呵,共同讨论
13 楼 kuaileqingfeng 2011-04-14  
补充一下,并不会出现重名变量无法区分的问题
12 楼 kuaileqingfeng 2011-04-14  
引用

首先接口是一种高度抽象的"模版",,而接口中的属性也就是’模版’的成员,就应当是所有实现"模版"的实现类的共有特性,所以它是public static的 ,是所有实现类共有的 .假如可以是非static的话,因一个类可以继承多个接口,出现重名的变量,如何区分呢?

对于楼主的这点,我不能认同,接口中的属性是static的,是因为接口不能实例化,所以如果要引用接口中的属性,只能通过接口去引用,和引用类中的静态变量的方式一样,例如:BigDecimal.ZERO
11 楼 shaomeng95 2011-04-14  
cjh_ubuntu 写道
我不知道有人投隐的原因。

我也纳闷了,高手可以略过,为啥非要隐藏呢。
10 楼 shaomeng95 2011-04-14  
dwbin 写道
楼主想多了。static是为了开始的时候初始化,final是为了编译期间的优化,怎么也没有觉得太高深的东西。

你说的这是语法层面的,我是从接口为什么要这样设计来分析的,仅仅是大家讨论交流而已。
9 楼 dwbin 2011-04-14  
楼主想多了。static是为了开始的时候初始化,final是为了编译期间的优化,怎么也没有觉得太高深的东西。
8 楼 稍纵即逝 2011-04-14  
这是java的规范,没为什么,不需要为什么。。王八的屁股,龟腚~
7 楼 optimism_best 2011-04-13  
接口是一种抽象化,起到标准化、规范化的作用。赞同
6 楼 咖啡豆子 2011-04-13  
cjh_ubuntu 写道
我不知道有人投隐的原因。

说句不好听的话,很多投隐的人其实自己本身也就是个半罐水,技术讨论本来就不应该分层次,恰恰我认为现在很多人最缺的就是扎实的基础。
5 楼 kjj 2011-04-13  
接口就像标准,不开放定义这破玩意有啥用处.........................
4 楼 dengyuan 2011-04-13  
要怎么样才能投贴呢??
3 楼 cjh_ubuntu 2011-04-13  
我不知道有人投隐的原因。
2 楼 Crusader 2011-04-13  
看接口的定义就知道了
接口本来就是实现封装的一种手段,它的目的就是将类的使用说明与类的实现相分离

如果接口中出现实例变量,那接口就变驴子了
1 楼 sling2007 2011-04-12  
你说的都对
接口可以理解成一个高度抽象化的约定,凡是实现该接口的都要遵循这个约定,如果约定中的内容随便改,那怎么通信呢......

相关推荐

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

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

    static、this、super、final的JAVA用法

    Java 中 static、this、super、final 的用法 静态方法(static method)是一种特殊的方法,它可以在不需要创建对象的情况下被调用。Java 中的静态方法使用 static 关键字来修饰,例如 public static void main...

    Test.java关于静态的分析

    package a;... //静态方法不能调用成员变量 什么时候必须用成员方法 ? 实例化 =初始化成员变量 //类中不需要记录状态的时候,都可以是静态方法 public static void print(){ } }

    Java中抽象类和接口的区别

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

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

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

    java中public、protected、默认、private关键字

    Java 中的访问修饰符是 Java 语言中一种基本概念,用于控制类、方法、变量、构造方法等成员的访问权限。 Java 中有四种访问修饰符:public、protected、默认(default)和 private。这四种修饰符的作用域从大到小...

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

    在Java中, 可以使用final关键字修饰类、方法以及成员变量。 (1).final标记的类不能被继承; (2).final标记的方法不能被子类复写; (3).final标记的变量即成为常量,只能被赋值一次. 注意: 如果使用final来...

    Java基础 接口.pdf

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

    java继承详解

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

    my_java_study

    8.接口中为什么只有常量,没有变量? 9.接口中的常量为什么是public static final的? 10.接口中的方法为什么是public static的? 11.接口中的方法怎么调用? 12.静态属性和方法可以被继承吗? 子类只能从被扩展的...

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

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

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

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

    java面试宝典

    68、java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类? 17 69、文件读写的基本类 17 70、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 17 71、启动一个...

    JAVA基础知识精华总结 收藏

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

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

    (5) implements 子句用于说明类中将实现哪些接口,接口是 Java 的一种引用类 型。 (6) 类体包含了变量和方法。在类体中定义的数据、变量和方法称为类的成员, 或称为实例变量和实例方法。 (7) 例如: 下例定义...

    java为什么匿名内部类的参数引用时final?final局部变量的生命周期

    在知乎上看到了一篇帖子 在这个问题下面大家已经吵得不可开交了,看了很多篇文章,被误导进了很多的坑,发现只有下面两篇文章是写的最好的,解释的很... public static void main(String[] args) { String str=haha

    java核心知识点整理

    3.Java是典型的强类型语言,即必须声明变量的类型,Java中有8种类型,6种数值类型(4个整数型和2个浮点型)、一个字符类型和一个boolean类型。 想学习java可以来这个群,首先是二二零,中间是一四二,最后是九零六...

    java 面试题 总结

    接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象...

    Java面试宝典2017.zip

    为什么? 9 8、用最有效率的方法算出2乘以8等於几? 9 9、请设计一个一百亿的计算器 9 10、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 11 11、"=="和equals方法究竟有什么区别? 11 12、...

    南理工JAVA期末试卷

    在 Java 中,public 是最宽松的访问控制修饰符,任何类都可以访问 public 修饰的成员变量或方法。 9. 面向对象特性 在 Java 中,封装性是面向对象的基本特性之一。封装性体现了“隐藏信息”的特点,即将类的内部...

Global site tag (gtag.js) - Google Analytics