`
shaomeng95
  • 浏览: 221822 次
  • 性别: 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成员变量覆盖问题

    为什么不是“父类的成员变量color:绿色”呢?这是因为成员变量是按照声明的位置进行绑定的,即**静态绑定**。当我们创建`Test2`对象并调用`getMes()`方法时,`this.color`实际上引用的是`Test1`类中的`color`变量,...

    java中final和static的区别

    3. 用 public 修饰的 static 成员变量和成员方法,本质是全局变量和全局方法,当声明它类的对象时,不生成 static 变量的副本,而是类的所有实例共享同一个 static 变量。 4. 用 private 修饰的 static 成员变量和...

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

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

    java中final与static的用法

    `final`关键字在Java中有多种用途,它可以用来修饰类、方法和变量,其主要目的是确保被修饰的对象具有不可变性或只读性。 #### 1. `final`修饰变量 当`final`用于修饰一个变量时,该变量成为常量,一旦赋值后就不...

    echo public static final int BUFSIZE = 4096;

    - 在两个类中,`SERVICE_PORT` 和 `BUFSIZE` 都被声明为 `public static final` 常量。`static` 关键字表示这些变量是属于类的,而非实例对象,因此可以直接通过类名访问,无需创建对象。`final` 表示这些变量一旦...

    static、this、super、final的JAVA用法

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

    java中final和static的总结

    总之,`final`和`static`是Java中不可或缺的关键字,它们各自有其特定的使用场景。理解并正确使用它们可以提高代码的可读性、安全性和效率。在设计类和接口时,明智地使用`final`和`static`可以帮助实现更好的设计...

    final关键字和static_用法

    `static`关键字在Java中主要用于创建静态成员,包括静态变量和静态方法。与普通成员不同,静态成员属于类级别,而不是实例级别。这意味着无论创建了多少个类的实例,静态成员只有一个副本存在于内存中。 #### 二、...

    javafinal和static总结.docx

    final 变量定义的时候,可以先声明,而不给初值,这中变量也称为 final 空白,无论什么情况,编译器都确保空白 final 在使用之前必须被初始化。 二、static 关键字 static 关键字在 Java 中用于修饰变量和方法,...

    static与final的异同

    在Java编程语言中,`static`和`final`都是关键字,它们用于定义不同的特性,但同时也有一些相似之处。下面我们将详细探讨这两个关键字的区别和用法。 首先,`static`关键字是用来声明类级别的变量或方法,这意味着...

    static、final、abstract和interface使用总结

    在Java编程语言中,`static`、`final`、`abstract`和`interface`是四个非常重要的关键字,它们分别代表不同的特性,用于定义类、变量和方法的行为。下面是对这些关键字的详细解释: 1. **static(静态)** - **...

    Java关键字final、static使用总结

    ### Java关键字final、static使用总结 #### 一、final关键字详解与应用 在Java语言中,`final`关键字被广泛应用于各种场景,如定义不可变的变量、禁止类的继承等,具有重要的作用。 1. **final修饰变量** - `...

    Java中的静态变量静态方法静态块与静态类.docx

    Java 中的静态变量、静态方法、静态块和静态类 Java 中的静态变量、静态方法、静态块和静态类是 Java 编程语言的四个重要概念,它们之间存在着紧密的关系。下面将对这四个概念进行详细的介绍。 一、静态变量...

    Java中的static关键字

    Java 中的 static 关键字是用于声明类的成员变量和成员方法的,它可以使得变量和方法属于类本身,而不属于某个对象。静态变量也称为类变量,静态方法也称为类方法。静态变量和静态方法可以直接通过类名调用,不需要...

    Java基础测试题答案.doc

    接口中的变量默认是 public、static 和 final 的。 在选择哪项是接口的正确定义中,正确答案是 D、interface B { void print();}。这是因为接口的方法默认是 abstract 的,不能有方法体。 Java 访问权限 在 Java ...

    Java中static、this、super、final用法

    "Java中static、this、super、final用法" Java 中的 static、this、super、final 用法是 Java 语言中四个重要的关键字,它们在 Java 编程中扮演着不同的角色,下面我们将详细介绍每个关键字的用法。 一、static ...

    Test.java关于静态的分析

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

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

    Java中的`final`关键字是一个非常重要的修饰符,用于在编程中实现不同的限制和特性。它可以在类、方法和变量上使用,确保代码的特定部分保持不可更改或不可重定义。 一、final修饰类 当`final`关键字用于类时,它...

    Java中final的深度剖析

    Java中的final关键字是一个非常重要的修饰符,它用于声明变量、方法和类,确保它们在程序执行期间保持不变。final关键字在Java编程中的应用广泛,可以帮助提高代码的稳定性和可维护性。 1. **常量的声明** final...

Global site tag (gtag.js) - Google Analytics