`
qhuwn
  • 浏览: 71011 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

当被问到“为什么接口中的变量都用final修饰”时

阅读更多
今天碰到这个问题时候,还真不好理解,只知道interface中的变量默认是被public static final 修饰的,接口中的方法是被public和abstrct修饰的。查阅了很多资料,做了些例子,得出以下结论,不足的地方希望大家指出。

		/*
	 * 关于抽象类和接口
	 * 
	 * 1.定义变量时
	 * 抽象类定义的变量可以不被赋值。
	 * 
	 * 接口中定义的变量(确切的说应该是常量)必须被赋值(final)。
	 *
	 * 2.定义方法时
	 * 
	 * 抽象类中定义的方法,可以指定程序体也可以不指定。
	 * 程序员可以在非抽象方法中指定程序体 ,与其他普通类中的方法类似。
	 * 但在抽象方法中,必须不指定程序体(写程序体会报出:Abstract methods do not specify a body的错误),与接口中定义方法的形式很类似。
	 * 
	 * 接口中的方法,所有方法都默认的是抽象的,所以必须不指定程序体。
	 * 
	 * 3.设计初衷
	 * 
	 * 抽象类是被java设计用来实现继承的。
	 * 接口是用来做多重继承的一个特例。
	 * 
	 * 4.is a   和  like a(还需要再看看)
	 */
	public abstract class AbstratClassTest {
		String name ;
		//被final的变量,但不能指定一个有效的set方法(final作用的原因),没有体现封装的闭合原则。
		final static int age =1;

		
//		public void setAge(){
//			this.age = 2;
//		}
		
		public static int getAge() {
			return age;
		}

		public void test(){
			
		}
		
		public abstract void test1();
		
	}



/*
 * 为什么接口中的变量都用final修饰(常量)
 * 因为接口本身就是用来定义一个标准、规范,是用来设计用户可用的细节(public)且不能随意更改的(final)
 * 那么接口中的任何东西都应该被定义成统一,那么定义的数值应该是常量
 * 再次思考:假如接口中可以定义非final,而仅仅是public和static修饰的,那么被实现的类可以随便修改(实现类中的static块中),这样会造成标准不统一
 * (是不是有点牵强附会?)。 
 * 
 * 接口还是不要随意更改,如果可以随意更改会造成很大的麻烦,比如一个接口被很多类实现,那么修改接口后,还必须修改实现类,麻烦程度不言而喻。
 */

public interface InterfaceTest {

	String name = "Tom";
	
	public static final int age = 2;

	public void test();

	public abstract void test1();

}




例证、反证:银行的提款机
银行的提款机中的插卡口可以看做是一个接口,所有的提款机插卡口是被统一的标准(大小尺寸)所约束的,方便每个卡可以插入各个提款机中。假如可以随便修改插卡口接口的数值,某行在当地修改了插卡口的尺寸,当你去提款机取钱,却发现插卡口小了点,那么......
由上例得出,将接口中的数值定义成常量是有意义的。并且证明了此时用接口比用抽象类好些。

结论:因为接口本身就是用来定义一个标准、规范,是用来设计用户可用的细节且不能随意更改的,统一的值,所以用final来修饰是最好不过的。

参考文献:
1.http://forums.sun.com/thread.jspa?threadID=741407&messageID=4251167
2.http://www.7880.com/Info/Article-538dc540.html
分享到:
评论

相关推荐

    final修饰成员变量和局部变量.md

    本文章是关于final部分知识所作的自我总结,内容为final对成员变量和局部变量修饰的简要解答,除了对自我java学习的一个小结,也希望能够帮助到在java路上对该内容疑惑的同行

    day11 05 final关键字用于修饰成员变量

    day11_05_final关键字用于修饰成员变量

    final修饰类

    在Java编程语言中,`final`关键字有着重要的作用,它能用于修饰类、方法和变量,以限制它们的使用方式。下面将详细解释`final`修饰类、方法和变量的具体含义及其应用场景。 **final 修饰类** `final`修饰类的作用...

    Java中局部内部类可以访问它所在方法中定义的final修饰的局部变量的合理解释.doc

    因此,当我们将变量 b 声明为 final 时,JVM 会将其复制给局部内部类,以便在方法调用结束后,局部内部类仍然可以访问该变量。这个过程是透明的,对程序员不可见。 在代码中,我们可以看到,当我们尝试访问局部变量...

    局部变量用final的讨论

    标题中的“局部变量用final”的讨论主要聚焦于Java编程语言中的一个特性,即使用`final`关键字修饰局部变量。在Java中,`final`关键字有多种用途,包括但不限于定义不可变对象、创建常量以及限制变量的赋值次数。在...

    java final变量详解

    Java 中的 final 变量是指不能被改变的变量,它有三个方面的作用:修饰变量、修饰方法和修饰类。在 Java 中,final 变量是一种常量,它只能被赋值一次,赋值后值不再改变。 final 变量的使用方法有多种,例如在变量...

    final修饰符与类型转化

    - `final`类:当一个类被声明为`final`时,它无法被其他类继承。这通常用于防止他人滥用或修改你的类结构,确保类的封装性和完整性。例如,`String`类就是`final`的,以防止对其内部实现的篡改。 - `final`方法:...

    java面向对象之final修饰符.docx

    1. 当final修饰成员变量(类变量和实例变量)时,这个变量一旦被赋值后,就不能再被修改。对于类变量,final可以在静态初始化块中指定初始值或声明时直接赋值;对于实例变量,可以在非静态初始化块、声明时或构造器...

    Java修饰符使用整理(含实例)

    例如,在设计公共接口时,通常使用 public 访问修饰符,以便让所有类都可以访问。在设计继承关系时,通常使用 protected 访问修饰符,以便保护继承关系中的成员变量和方法。在设计抽象类时,通常使用 abstract 修饰...

    day10-final、接口、多态.pdf

    在局部变量中,基本类型的变量被 final 修饰后,只能赋值一次,不能再更改。例如,final int a = 10; 后,不能再赋值 a = 20;。对于引用类型的变量,虽然不能更改其地址,但可以修改对象内部的成员变量值。 成员...

    【Java语言基础】final关键字

    final修饰变量时,表示该变量一旦获得了初始值之后就不可被改变,final既可修饰成员变量(包括类变量和实例变量),也可以修饰局部变量,形参。 final修饰成员变量 类变量:当类初始化时,系统会为类变量分配内存,...

    final变量.

    `final`变量可以确保在内部类中引用外部类的变量时,该变量的值不会在内部类中被意外修改。 3. **使用方法**: - **修饰变量**:`final`成员变量一旦赋值就不能再次改变,常用于声明常量。静态`final`变量在类加载...

    Java中final的深度剖析

    当一个变量被声明为final时,它的值一旦被赋值后就不能再改变。例如: ```java public final static double PI = 3.14; ``` 这样的常量可以提升代码的可读性,减少逻辑错误,并在需要修改其值时提供便利。常量的...

    Java访问修饰符

    synchronized 方法访问修饰符表示多线程的支持,当一个此方法被调用时,没有其它线程能够调用该方法,其它的 synchronized 方法也不能调用该方法,直到该方法返回。 接口访问修饰符 接口访问修饰符可以分为四种:...

    Java软件开发实战 Java基础与案例开发详解 6-6 final修饰符 共7页.pdf

    当一个类、方法或变量被声明为`final`时,它将具有特定的不可更改性。本文档将详细介绍`final`修饰符的不同应用场景及其带来的影响。 #### 2. final修饰变量 - **定义与作用**:当`final`修饰一个变量时,意味着该...

    动力节点老杜Java基础入门视频教程——final修饰局部变量

    012-JavaSE进阶-final修饰局部变量

    继承和接口和java访问权限修饰符总结.doc

    本文总结了 Java 中的继承、接口和访问权限修饰符的概念和使用。继承是 Java 中的一种机制,允许子类继承父类的属性和方法,並且可以对父类的方法进行重写或重载。动态绑定是指在运行时确定方法的调用,而不是在编译...

    java中final修饰符的使用方法

    当`final`修饰一个变量时,它表示该变量一旦被赋值后就不能再次改变。这分为两种情况: - **实例变量**:如果`final`修饰的是实例变量,那么必须在声明时、非静态初始化块或构造器中为其指定初始值。例如: ```...

Global site tag (gtag.js) - Google Analytics